首页 > 其他分享 >使用Struts2拦截器需要注意的地方

使用Struts2拦截器需要注意的地方

时间:2023-08-28 12:31:41浏览次数:35  
标签:拦截器 get Struts2 session 注意 跳转 invocation result


今天在写拦截器的时候发现一个貌似属于bug的问题

我使用的版本是2.1.8

 

当访问一个满足拦截器拦截条件的请求时,虽然代码已经执行进入拦截器,并且返回结果也是拦截后改变的跳转结果,但是却没有按照返回结果跳转,而是依旧进入了action。

 

源代码是这样的:

public String intercept(ActionInvocation invocation) throws Exception {
	ActionContext ctx = ActionContext.getContext();
	String result = invocation.invoke();
	Map session = ctx.getSession();
	if ("guest".equals(type)) {
		if (null == session.get("guest")) {
			result = Action.LOGIN;
		}
    } else {
    	if (null == session.get("user")) {
			result = Action.LOGIN;
		}
    }
	return result;
}

 

这里当用户session失效后,跳转的依然是action的指向,而不是我的login指向,这是一个很奇怪的问题

在反复检查后,终于发现,原来是invocation.invoke()在作怪

只要在返回结果前先调用了这个方法,那么无论返回结果改成什么,都不影响action的正常跳转,导致拦截跳转效果失效。

 

最终改动后的有效代码如下:

public String intercept(ActionInvocation invocation) throws Exception {
	ActionContext ctx = ActionContext.getContext();
	String result = "";
	Map session = ctx.getSession();
	if ("guest".equals(type)) {
		if (null == session.get("guest")) {
			result = Action.LOGIN;
		}
    } else {
    	if (null == session.get("user")) {
			result = Action.LOGIN;
		}
    }
	return "".equals(result) ? invocation.invoke() : result;
}

 

标签:拦截器,get,Struts2,session,注意,跳转,invocation,result
From: https://blog.51cto.com/u_16237557/7262659

相关文章

  • Spring3中替换默认拦截器的方法BeanFactoryPostProcessor
    由于Spring默认的静态资源处理器不能满足需求,需要做一些自己的处理,但mvc:resources的标签又挺好用的,不想每次配置静态资源目录的时候,还要特殊指定处理器,也不想修改任何配置代码,于是找到了使用BeanFactoryPostProcessor的方法 实现代码如下:importorg.springframework.beans.Beans......
  • centos7 python3安装注意点
    1.安装,参考网上教程,不再重复赘述https://www.cnblogs.com/mindtechnist/p/17243882.html2.注意点:网上多数文章中为了方便,会直接在/usr/bin目录下重建python的软链接,指向python3,由于centos默认的python版本为2.7,2和3无法兼容,故会导致很多基础组件出现调用异常,如yum、firewall-cm......
  • 方法技巧,注意事项这类小知识点吧
    cin可以读取连续元素的单个元素,类似getchar()使用printf时最好添加头文件#include<cstdio>%08.3f,表示最小宽度为8,保留3位小数,当宽度不足时在前面补上(对整型补0时不能打点号)fgets不会删除行末的回车字符strcmp(a,b)比较两个字符串的大小,a<b返回-1,a==b返回0,a>b返回......
  • 少发火,注意力放在解决问题上
    近来,感觉自己的情绪控制能力比以前进步不少,主要是认识到就算发火,生气,事情也不会得到根本性的解决,甚至发火会推动事情往更坏的方向走去。有时候,发火的人才是有问题的人。所以最好好好沟通。我之前觉得家里很容易就变得很乱,我觉得是因为我妈在家不知道主动收拾,但......
  • Struts2标签错误:using Struts tags without the associat解决
    <filter-mapping><filter-name>struts2</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping> struts,在使用标签的时候,出现了这样一个问题。    原本使用标签,引用方法是默认配置:    web.xml:<filter><filter-name&......
  • struts2文件下载
    下载相对上传来说就要简单一点了,主要是使客户端获得服务器端的文件输入流,但是在配置Action时,还是有一些要注意的:1)result的type必须为stream类型 2)attachment表示不管什么类型的文件,都要弹出下载对话框,若不指定,则默认为内联形式,即inline,即浏览器能打开的就直接打开,不能打开的就提......
  • 用拦截器实现session登录
    这个功能是这样的,用户在访问网站时,先要进行登录,即要访问处理登录的Action,若没有登录,即访问除了登录的Action之外的Action,则会被拦截器拦截,跳转到错误页面,提示用户还没有进行登录。所以这个拦截器的作用是如果是登录,即请求的是LoginAction,那么就不拦截这个请求,让其通过拦截器,进行登......
  • 实现拦截器的三种方法
    说是三种方法,实际上是一种方法,其实只要这个类实现了Interceptor接口,即可成为一个拦截器类。第一种方法就是直接实现Interceptor接口,这样的话,就要实现这个接口中的三个方法。第二种方法是继承自AbstractInterceptor类,这是个抽象类,实现了Interceptor接口,并且对里面的init()和destroy(......
  • Struts2 中拦截器和Action的调用关系
    所谓的拦截器就是指实现了Interceptor接口的类,该接口中定义了三个方法:init(),destroy(),intercept()。init()用于在服务器启动的时候,初始化这个拦截器。destroy()用于清理分配给拦截器的资源,intercept()是用来起拦截作用的,这个方法还有一个ActionInvocation类型的参数invocation,并且......
  • struts2中的参数传递
    这个问题其实一直很困惑我的,在写平常的jsp程序时,传递参数很容易,通过表单,request,链接等都可以传递,但是到了struts2中,在写的各个地方,都看不到任何的request或是response,不知道该怎么传递参数了,到了今天学习了struts2中的参数传递这一节,终于解开了疑惑,但是还不是很清楚,有待以后探索。......