【发布时间】:2012-04-06 08:56:39
【问题描述】:
执行特定工作流时会出现此问题 -
- 用户已登录
- 会话到期
- 用户试图在当前页面上做某事触发 AJAX 请求
- 由于会话过期,ajax 请求失败
- 我需要为此显示一条消息。
现在问题出现了。我有一个拦截器可以正确捕获会话过期。它还正确地识别出原始请求是 AJAX。所以这意味着拦截器需要响应一个 json 响应(接受我的任何 ajax 调用的输入格式)。
拦截器代码 -
public class AuthenticationInterceptor implements Interceptor {
private InputStream jsonStream;
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
... // boilerplate init code.
if (memberId == null
&& StringUtils.equals("XMLHttpRequest", request.getHeader("X-Requested-With"))) {
Map<String, Object> responseObject = Maps.newHashMap();
Set<String> errors = Sets.newHashSet();
errors.add("Your session has expired. Please refresh page and login.");
responseObject.put("errors", errors);
responseObject.put("success", false);
jsonStream = ResponseUtils.getJSONResponseStream(responseObject);
return "json";
}
}
public InputStream getJsonStream() {
return jsonStream;
}
public void setJsonStream(InputStream jsonStream) {
this.jsonStream = jsonStream;
}
struts.xml 代码 -
<package name="raisin" namespace="/raisin" extends="secure">
<interceptors>
<interceptor name="authentication" class="interceptors.AuthenticationInterceptor"/>
</interceptors>
<global-results>
<result name="json" type="stream">
<param name="contentType">application/json</param>
<param name="inputName">jsonStream</param>
<param name="bufferSize">1024</param>
</result>
</global-results>
...
</package>
因此,当执行此工作流时,我得到以下异常 -
java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name [jsonStream] in the invocation stack. Check the <param name="inputName"> tag specified for this action.
org.apache.struts2.dispatcher.StreamResult.doExecute(StreamResult.java:237)
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)
我不明白这怎么可能,因为我在jsonStream 的拦截器中创建了公共 get/set 方法。我还在getJsonStream 方法中添加了一个sysout。事实证明它从未被调用过。
任何指针表示赞赏。
【问题讨论】:
-
Umesh 是正确的,拦截器需要是线程安全的。此外,拦截器不会像操作那样被压入堆栈。
-
@DaveNewton 注意。但我需要一些关于下一步做什么的指导。你能看看我对 Umesh 的回复并告诉我该怎么做吗?谢谢!
标签: java session struts2 variable-assignment interceptor