三种基于过滤器的权限设计:spring AOP、webwork、servlet filter

Spring Filter过滤器,Spring拦截未登录用户权限限制(转)

  (2012-04-16 13:42:55)
标签: 

it

分类: SSH
实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面。
比较好的做法是不管什么人都不能直接访问jsp页面,要访问就通过action,这样就变成了一个实实在在的权限控制了。
那么就有3种方法可以解决楼主的问题
1,直接使用filter
2,直接使用webwork的interceptor,
3,将action交给spring管理,使用spring的Aop机制

让用户可以直接访问jsp本来就违反了mvc的本意了
1 直接使用filter
web.xml配置
Xml代码  收藏代码
  1. <filter>    
  2.     <filter-name>SecurityServlet</filter-name>    
  3.     <filter-class>com.*.web.servlet.SecurityServlet</filter-class>    
  4. </filter>    
  5. <filter-mapping>    
  6.     <filter-name>SecurityServlet</filter-name>    
  7.     <url-pattern>*.jsp</url-pattern>    
  8. </filter-mapping>    
  9. <filter-mapping>    
  10.     <filter-name>SecurityServlet</filter-name>    
  11.     <url-pattern>*.do</url-pattern>    
  12. </filter-mapping>   



SecurityServlet 类
Java代码  收藏代码
  1. package com.*.web.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import javax.servlet.Filter;  
  5. import javax.servlet.FilterChain;  
  6. import javax.servlet.FilterConfig;  
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.ServletRequest;  
  9. import javax.servlet.ServletResponse;  
  10. import javax.servlet.http.HttpServlet;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13. import javax.servlet.http.HttpSession;  
  14. public class SecurityServlet extends HttpServlet implements Filter  
  15.     private static final long serialVersionUID 1L;  
  16.   
  17.     public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException  
  18.            HttpServletRequest request=(HttpServletRequest)arg0;     
  19.            HttpServletResponse response  =(HttpServletResponse) arg1;      
  20.            HttpSession session request.getSession(true);       
  21.            String usercode (String) request.getRemoteUser();// 登录人  
  22.            String user_role (String)session.getAttribute("role");//登录人角色  
  23.            String url=request.getRequestURI();     
  24.            if(usercode==null || "".equals(usercode) || user_role == null || "".equals(user_role))        
  25.                 //判断获取的路径不为空且不是访问登录页面或执行登录操作时跳转     
  26.                 if(url!=null && !url.equals(""&& url.indexOf("Login")<0 && url.indexOf("login")<0 ))     
  27.                     response.sendRedirect(request.getContextPath() "/login.jsp");     
  28.                     return     
  29.                                
  30.                 
  31.             arg2.doFilter(arg0, arg1);     
  32.             return    
  33.      
  34.     public void init(FilterConfig arg0) throws ServletException  
  35.      
  36.   
  37.  

配置中的filter-mapping,定义的是需过滤的请求类型,上面的配置即过滤所有对jsp页面和action的请求。过滤器的实现与 struts2、spring框架无关,在用户请求被相应前执行,在过滤器中,可使用response.sendRedirect("")等方法

跳转到需要的链接,如登录页面、错误页面等,不需要跳转时,arg2.doFilter(arg0, arg1);即可继续执行用户的请求。注意使用filter时避免连续两次跳转,否则会报 java.lang.IllegalStateException错误,具体配置方法网上有,除非必要,不建议使用/*(过滤所有访问)的配置方式,这样 配置,图片、js文件、css文件等访问都会被过滤


Spring拦截

Spring配置
Xml代码  收藏代码
  1. <bean id="springSessionInterceptor" class="com.*.web.servlet.SpringLoginInterceptor" >  
  2.      </bean>  
  3. <bean id="autoPorxyFactoryBean1"  
  4.         class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
  5.         <property name="interceptorNames">  
  6.             <list>  
  7.                 <value>springLoginInterceptor</value>  
  8.             </list>  
  9.         </property>  
  10.         <property name="beanNames" >  
  11.         <list>  
  12.             <value>*Controller</value>  
  13.             </list>  
  14.         </property>  
  15.     </bean>  

SpringLoginInterceptor实现类
Java代码  收藏代码
  1. package com.web.servlet;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5. import javax.servlet.http.HttpSession;  
  6.   
  7. import org.aopalliance.intercept.MethodInterceptor;  
  8. import org.aopalliance.intercept.MethodInvocation;  
  9. import org.apache.log4j.Logger;  
  10. import org.apache.struts.action.ActionMapping;  
  11.   
  12. public class SpringLoginInterceptor implements MethodInterceptor  
  13.     private static final Logger log Logger  
  14.     .getLogger(SpringLoginInterceptor .class);  
  15.   
  16.     @Override  
  17.     public Object invoke(MethodInvocation invocation) throws Throwable  
  18.         log.info("拦截开始!");  
  19.         Object[] args invocation.getArguments();    
  20.         HttpServletRequest request null 
  21.         HttpServletResponse response null 
  22.         ActionMapping  mapping null 
  23.         for (int 0 args.length i++     
  24.           if (args[i] instanceof HttpServletRequest) request (HttpServletRequest)args[i];     
  25.           if (args[i] instanceof HttpServletResponse) response (HttpServletResponse)args[i];     
  26.           if (args[i] instanceof ActionMapping) mapping (ActionMapping)args[i];     
  27.          
  28.         if (request != null && mapping != null 
  29.             String url=request.getRequestURI();     
  30.             HttpSession session request.getSession(true);       
  31.             String usercode (String) request.getRemoteUser();// 登录人  
  32.             String user_role (String)session.getAttribute("user_role");//登录人角色  
  33.               
  34.             if (usercode == null || usercode.equals(""))  
  35.                 if url.indexOf("Login")<0 && url.indexOf("login")<0  
  36.                       
  37.                     return mapping.findForward("loginInterceptor");  
  38.                    
  39.                 return invocation.proceed();   
  40.              
  41.             else  
  42.                 return invocation.proceed();  
  43.              
  44.          
  45.         else  
  46.             return invocation.proceed();  
  47.          
  48.      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值