今天在写拦截器的时候发现一个貌似属于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