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

论坛 期权论坛 脚本     
匿名技术用户   2021-1-2 18:34   100   0

第一步、定义一个拦截器

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*)".
所以,这个顺序大家一定要注意啦!
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP