這個問題的實例變量執行特定工作流時出現 -在Struts2的攔截器得到例外的要求正確獲取/在攔截器設置
- 用戶已經登錄
- 會話過期
- 用戶嘗試在觸發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)
我不要緊tand,因爲我在jsonStream
的攔截器中創建了公開的get/set方法,這怎麼可能呢。另外我在getJsonStream
方法中加入了sysout。事實證明,它從未被稱爲。
任何指針讚賞。
Umesh製作是正確的,攔截器必須是線程安全的討論。另外,攔截器不會像動作一樣被壓入棧中。 – 2012-03-22 03:13:18
@DaveNewton注意。但我需要一些關於接下來要做什麼的指導。你能否看看我對Umesh的迴應,並告訴我該怎麼做?謝謝! – Chantz 2012-03-22 13:22:54