我正在使用 Spring security 3.0.6 。以下JSP片段是罪魁祸首:
<sec:authorize access="hasRole('ROLE_PREVIOUS_ADMINISTRATOR')">
<a href="<s:url value='/exitUser' />">
Switch back to your own role</a>
</sec:authorize>
抛出以下异常:
Struts has detected an unhandled exception:
# Messages: Stream closed
File: org/apache/jasper/runtime/JspWriterImpl.java
Line number: 210
Stacktraces
java.io.IOException: Stream closed
org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriterImpl.java:210)
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:115)
org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:177)
org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:915)
org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:652)
org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:123)
org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:373)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:277)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:434)
我已成功将用户切换到另一个角色,现在正尝试显示切换回自己角色的链接,但前提是他实际切换过。我认为用户有 ROLE_PREVIOUS_ADMINISTRATOR ,如果他已经切换角色,那么我正在做上述事情。
我已将标记库包括在内:
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
答案 0 :(得分:0)
我没有指定
<http use-expressions="true">
在我的spring security xml中。完成此操作并更改拦截网址以在其接受值中使用表达式后,错误消失了。但是,无法在简单的测试应用程序中重现错误。
修改:我发现此错误的另一个实例是我在authorize
标记中使用自定义 SPEL 表达式,并且有一个{{ 1}}在处理表达式的方法中。
基本上,似乎这个错误通常会隐藏评估NullPointerException
(或任何)标记中使用的表达式的潜在错误