gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:58:42 24 4
gpt4 key购买 nike

执行特定工作流程时会出现此问题 -

  1. 用户已登录
  2. session 到期
  3. 用户尝试在当前页面上执行某些操作,这会触发 AJAX 请求
  4. 由于 session 已过期,ajax 请求失败
  5. 我需要为此显示一条消息。

现在问题出现了。我有一个拦截器可以正确地捕获 session 过期。它还正确识别原始请求是 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 的拦截器中创建了公共(public) get/set 方法。我还在 getJsonStream 方法中放置了一个系统输出。事实证明它从未被调用。

感谢任何指点。

最佳答案

我认为您的方法在这里是错误的,并且您没有按照应有的方式使用拦截器。拦截器实例在操作之间共享。对于每个请求,S2 将创建一个新的操作实例,但拦截器将被重用,这意味着拦截器是无状态的,您正在尝试在拦截器中设置请求过程的状态。

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

更新

检查 session 超时处理的可能解决方案之一。这已在以下线程中讨论 struts-2-session-timeout

关于java - 在 Struts2 拦截器中,在拦截器中正确获取/设置的实例变量上出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9811410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com