首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Struts2中,拦截器获取在拦截器中正确获取/设置的实例变量上的异常

在Struts2中,拦截器获取在拦截器中正确获取/设置的实例变量上的异常
EN

Stack Overflow用户
提问于 2012-03-21 19:19:10
回答 1查看 1.5K关注 0票数 3

在执行特定的工作流时会出现这个问题-

  1. 用户登录
  2. 会话到期
  3. 用户尝试在当前页面上执行一些操作,因为会话过期后会触发AJAX请求
  4. ,ajax请求失败
  5. 我需要显示这样的消息。H 210G 211

现在问题出现了。我有一个拦截器,它能正确捕获会话到期。它还正确地标识了最初的请求是AJAX。因此,这意味着拦截器需要使用json响应(对任何ajax调用都接受输入格式)。

拦截器代码-

代码语言:javascript
复制
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代码-

代码语言:javascript
复制
<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>

所以当这个工作流被执行时,我得到了下面的异常-

代码语言:javascript
复制
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方法。此外,我还在getJsonStream方法中添加了一个sysout。原来它从来没有被称为。

任何指南针都会赏识。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-22 02:53:59

我相信你的做法是错误的,你没有使用拦截器的方式应该使用。拦截器实例在Actions.For之间共享--每个请求-- S2将创建一个新的操作实例,但是拦截器将被重用,这意味着拦截器是无状态的,您正在试图在拦截器中设置请求进程的状态。

我的建议是,不要试图将与请求处理相关的数据存储为不属于阻断器角色的数据。只需检查Ajax请求响应,并尝试查看返回的结果,在此基础上可以显示错误消息。

更新

在下面的线程handling.This中讨论了检查会话超时struts-2-session-timeout的可能解决方案之一

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9811410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档