`

使用拦截器验证session是否为空

    博客分类:
  • Java
阅读更多

第一步、定义一个拦截器

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放到最后)
要是顺序不对,服务器启动时会报错: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*)".
所以,这个顺序大家一定要注意啦!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics