关于将struts2框架下,使自定义过滤器对部分的action请求忽略的方法
首先需要了解一个方法
request.getServletPath()
他将返回一个当前请求的路径的醉详细名称
例如对路径htt p://stuts/sss/test.action
返回"/test.action"
判断一下就好
判断情况有两种
一种只有一个需要忽略的路径,
一种有多个需要忽略的路径,
当然第二中是全面的,但有个缺点,需要辅助数组和标志,与循环判断,相比第一种,他只是一种解决办法罢了,可能还有更优,我没想出来
1(只有一个需要忽略的路径,)filter如下
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
// TODO 自动生成的方法存根
HttpServletRequest req = (HttpServletRequest) arg0;
//忽略登录页面
**if (!req.getServletPath().equals("/login.action")) {**
if (req.getSession().getAttribute("user") == null||req.getSession().getAttribute("user").equals("")) {
//重定向不含struts标签的其他页面
arg0.getRequestDispatcher("/call/loginout.html").forward(arg0, arg1);
}
} else {
//登录间隔最长时长默认30分钟
req.getSession().setMaxInactiveInterval(60*30);
}
arg2.doFilter(arg0, arg1);
}
2.对忽略多个action:
filter如下:
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
// TODO 自动生成的方法存根
HttpServletRequest req = (HttpServletRequest) arg0;
// 忽略登录页面
// 不能简单使用或表达式判断,不然只认第一个路径,所以方法如下
**// 要忽略的路径数组
String ignore[] = { req.getServletPath(), "/relogin.action", "/login.action" };
// 多个路径判断忽略
boolean flag = true;
for (int i = 1; i < ignore.length; i++)
if (ignore[0].equals(ignore[i])) {
flag = false;
break;
}
System.out.print(flag);
// 忽略后操作**
if (flag) {
if (req.getSession().getAttribute("user") == null || req.getSession().getAttribute("user").equals("")) {
// 重定向不含struts标签的其他页面
arg0.getRequestDispatcher("/call/loginout.html").forward(arg0, arg1);
}
} else {
// 登录间隔最长时长默认30分钟
req.getSession().setMaxInactiveInterval(60 * 30);
}
arg2.doFilter(arg0, arg1);
}