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


    转载自:http://pouyang.iteye.com/blog/695429


    实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或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文件等访问都会被过滤 


    2 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 i = 0 ; i < 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.     }  
    49. }  

  • 相关阅读:
    软件的一般实现过程
    前端开发所需技能及理解
    前端开发所需技能
    JavaScriptlet和const的使用
    [NOI2013] 向量内积
    [省选联考 2021 A/B 卷] 滚榜
    [提高组集训2021] 模拟赛2
    [省选联考 2021 A 卷] 矩阵游戏
    [省选联考 2021 A/B 卷] 图函数
    [APIO2020] 交换城市
  • 原文地址:https://www.cnblogs.com/ycpanda/p/3637301.html
Copyright © 2020-2023  润新知