第一步、定义一个拦截器:
public class UserInterceptor extends AbstractInterceptor {
private static String AUTH_SESSION_USER_KEY="userInfo";//从session中获取userInfo
private static String NO_LOGIN="index";//session过期跳转页面,跳转到首页
private static List<String> awayUrls = null; //放行URL
static{
awayUrls = new LinkedList<String>();
awayUrls.add("/login!userLoginOrQuit.action");//登陆action
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
/*
//第一种获取session的方法
Map<String, Object> session=invocation.getInvocationContext().getSession();
HttpServletRequest request= (HttpServletRequest) invocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
if(session.get(AUTH_SESSION_USER_KEY)==null){
return NO_LOGIN;
}
*/
//获取request域中信息
HttpServletRequest req = ServletActionContext.getRequest();
//获得当前请求url
String url = req.getServletPath();
//获得请求类型
String type = req.getHeader("X-Requested-With");
System.out.println("当前请求URL:"+url+"\n请求类型:"+type);//ajax请求类型:XMLHttpRequest action请求类型:null
System.out.println("userInfo:"+req.getSession().getAttribute(AUTH_SESSION_USER_KEY)+"\n");
if(!awayUrls.contains(url)){
if(req.getSession().getAttribute(AUTH_SESSION_USER_KEY)==null){
return NO_LOGIN;
}
}
return invocation.invoke();
}
}
第二步、在struts配置文件中添加监听器:
<package name="test" extends="struts-default" namespace="/"> <interceptors> <interceptor name="userInterceptor" class="com.wjl.UserInterceptor"></interceptor> <interceptor-stack name="user-inter"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="userInterceptor"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="user-inter"></default-interceptor-ref> <global-results> <result name="index">/index.jsp</result> </global-results> <action name="login" class="loginAction"> ...... </action> ....... </package>
如此配置之后,就可以拦截了。
不过呢,这样子拦截,有好的也有不好的,好的就是可以指定拦截的action,不好的就是“只能拦截指定的action,其他package下的action拦截不了”。
想让其他的package也能起作用,两个方法:一、每个package的action中都加上拦截器配置:<action name=""><default-interceptor-ref name="user-inter"></default-interceptor-ref>....</action>,二、定义一个有拦截器配置的package让其他的package继承它。第一种比较麻烦也很简单这里就不说了,直接上第二种的代码:
<package name="all" extends="struts-default"> <interceptors> <interceptor name="userInterceptor" class="com.wjl.UserInterceptor"></interceptor> <interceptor-stack name="user-inter"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="userInterceptor"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="user-inter"></default-interceptor-ref> <global-results> <result name="index">/index.jsp</result> </global-results> </package> <package name="test" extends="all" namespace="/"> <action name=""> ... </action> </package> <package name="user" extends="all" namespace="/"> <action name=""> ... </action> </package>先定义name为all的package,让它继承其他package都需要的struts-default,并添加上拦截器配置信息。
然后让其他需要拦截的package继承(extends)这个package。
如此之后,就可以全部拦截啦。
最后,来说一下
package中各个标签的顺序,这个顺序以前没注意,直到今天弄这个应用了才发现原来还有顺序之分的。具体排序如下:
result-types
interceptors
default-interceptor-ref
default-action-ref
default-class-ref
global-results
global-exception-mappings
action*(所有action放到最后)
interceptors
default-interceptor-ref
default-action-ref
default-class-ref
global-results
global-exception-mappings
action*(所有action放到最后)
要是顺序不对,服务器启动时会报错:org.xml.sax.SAXParseException: The content of element type "package" must match "(result-types?,interceptors?,default-interceptor-ref?,default-action-ref?,default-class-ref?,global-results?,global-exception-mappings?,action*)".
所以,这个顺序大家一定要注意啦!