java-在Struts2拦截器中,对在拦截器中正确获取/设置的实例变量获取异常
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-在Struts2拦截器中,对在拦截器中正确获取/设置的实例变量获取异常,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2859字,纯文字阅读大概需要5分钟。
内容图文
![java-在Struts2拦截器中,对在拦截器中正确获取/设置的实例变量获取异常](/upload/InfoBanner/zyjiaocheng/656/fef76e14792f44b592503aaa721dbbc3.jpg)
执行特定的工作流程时会出现此问题-
>用户已登录
>会话过期
>用户尝试在当前页面上执行某些操作,从而触发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方法.我也把sysout放在getJsonStream方法中.事实证明,它从未被调用过.
任何指针表示赞赏.
解决方法:
我相信您在这里的方法是错误的,并且您没有以应该使用的方式使用拦截器.
Interceptors实例在Action之间共享.对于每个请求,S2都会创建一个新的Action实例,但是Interceptors将被重用,这意味着Interceptor是无状态的,您正在尝试在拦截器中设置请求过程的状态.
我的建议是不要尝试将与请求处理相关的数据存储为Interceptor角色的一部分.
只需检查Ajax请求响应并尝试查看返回的结果,即可显示错误消息.
更新资料
一种检查会话超时处理的可能解决方案之一.已在以下线程struts-2-session-timeout中进行了讨论
内容总结
以上是互联网集市为您收集整理的java-在Struts2拦截器中,对在拦截器中正确获取/设置的实例变量获取异常全部内容,希望文章能够帮你解决java-在Struts2拦截器中,对在拦截器中正确获取/设置的实例变量获取异常所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。