java-在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 &lt;param name=&quot;inputName&quot;&gt; 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方法.我也把sysout放在getJsonStream方法中.事实证明,它从未被调用过.

任何指针表示赞赏.

解决方法:

我相信您在这里的方法是错误的,并且您没有以应该使用的方式使用拦截器.
Interceptors实例在Action之间共享.对于每个请求,S2都会创建一个新的Action实例,但是Interceptors将被重用,这意味着Interceptor是无状态的,您正在尝试在拦截器中设置请求过程的状态.

我的建议是不要尝试将与请求处理相关的数据存储为Interceptor角色的一部分.
只需检查Ajax请求响应并尝试查看返回的结果,即可显示错误消息.

更新资料

一种检查会话超时处理的可能解决方案之一.已在以下线程struts-2-session-timeout中进行了讨论

上一篇:SpringMVC----执行流程+底层解析


下一篇:js 检测输入内容是否为空(小程序,网站)