登录过滤器(Struts2)

 最近,在做权限验证的时候,要通过用户登录,判断用户的权限,根据权限显示不同的东西和操作。这样就登录验证就必须要做了。进入系统的用户必须得登录才能进入系统。否则跳转到登录页面。

 

在网上也找了不少的资料,大体是用两种方法可以实现。

 

一、使用struts2的拦截器(Interceptor)

    

      struts2的拦截器很灵活,可以在每个action中配置不同的拦截器,也可以配置通用的。像下面这样……

 

[java]  view plain copy
  1. <interceptors>  
  2.         <interceptor name="authority" class="cn.common.AuthorityInterceptor"/>  
  3.         <interceptor-stack name="myStack">  
  4.             <interceptor-ref name="defaultStack"/>  
  5.             <interceptor-ref name="authority"/>  
  6.         </interceptor-stack>  
  7.     </interceptors>  
  8.     <default-interceptor-ref name="myStack"></default-interceptor-ref>  
  9.     <!-- 全局的跳转结果 和下面的action中是对应的 -->   
  10.     <global-results>  
  11.         <result name="login">/login.jsp</result>  
  12.     </global-results>  

 

AuthorityInterceptor.java如下

 

[c-sharp]  view plain copy
  1. public class AuthorityInterceptor extends AbstractInterceptor {  
  2.   
  3.     @Override  
  4.     public String intercept(ActionInvocation invocation) throws Exception {  
  5.           
  6.         //取得请求相关的ActionContext实例   
  7.         ActionContext ctx = invocation.getInvocationContext();   
  8.         Map session = ctx.getSession();   
  9.         //取出名为user的Session属性   
  10.         NiUser user = (NiUser)session.get("user");   
  11.         //如果没有登陆,都返回重新登陆   
  12.         if (user != null)   
  13.         {   
  14.             return invocation.invoke();   
  15.         }   
  16.         //没有登陆,将服务器提示设置成一个HttpServletRequest属性   
  17.         ctx.put("tip" , "您还没有登陆,请输入scott,tiger登陆系统");   
  18.         //直接返回login的逻辑视图 此处和配置文件对应  
  19.         return Action.LOGIN;   
  20.           
  21.     }  
  22. }  

 

此种做法可以实现url的拦截,但是,有一点,他只能在拦截器所配置的package下起作用,其他的package下仍然可以不登录通过url访问。还需要在每个package下都配置一遍,我不知道还有没有其他的方法。拦截器给我的感觉就是很灵活,灵活的代价是增加了代码量。不知道理解的对不对?

 

二、Filter(基于javax.servlet.Filter

     

     它需要在web.xml中做如下配置

 

    

[xhtml]  view plain copy
  1. <!-- loginFilter 交给spring管理 -->  
  2.     <filter>     
  3.         <filter-name>loginFilter</filter-name>     
  4.         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>     
  5.         <init-param>     
  6.               <param-name>targetFilterLifecycle</param-name>     
  7.               <param-value>true</param-value>     
  8.         </init-param>     
  9.     </filter>     
  10.      <filter-mapping>  
  11.         <filter-name>loginFilter</filter-name>  
  12.         <url-pattern>/*</url-pattern>  
  13.     </filter-mapping>  

 

     同样要有个java文件与之对应

 

    

[java]  view plain copy
  1. public class LoginFilter extends HttpServlet implements Filter {  
  2.   
  3.     private static final long serialVersionUID = 1L;  
  4.     public void init(FilterConfig arg0) throws ServletException {  
  5.         //do something  
  6.     }  
  7.     public void doFilter(ServletRequest sRequest, ServletResponse sResponse,      
  8.             FilterChain filterChain) throws IOException, ServletException{   
  9.         HttpServletRequest request = (HttpServletRequest) sRequest;      
  10.         HttpServletResponse response = (HttpServletResponse) sResponse;      
  11.         HttpSession session = request.getSession();      
  12.         String url=request.getServletPath();  
  13.         String contextPath=request.getContextPath();  
  14.         if(url.equals(""))url+="/";  
  15.         if((url.startsWith("/")&&!url.startsWith("/login"))){//若访问后台资源 过滤到login  
  16.              NiUser user=(NiUser)session.getAttribute("user");  
  17.              if(user==null){//转入管理员登陆页面  
  18.                   response.sendRedirect(contextPath+"/login.action");  
  19.                   return;  
  20.              }  
  21.         }  
  22.           filterChain.doFilter(sRequest, sResponse);    
  23.     }  
  24.   
  25. }  

 

    以上两种方法都能实现防止不经登录直接url访问,但Filter似乎简单些,不知道有没有其他的缺点或者不安全的地方。

原文地址:http://blog.csdn.net/markzwei/article/details/6305812

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值