zoukankan      html  css  js  c++  java
  • SpringMVC拦截器(资源和权限管理)-login拦截

    SpringMVC拦截器(资源和权限管理)

     

    1.自定义拦截器

        SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法。preHandle在业务处理器处理请求之前被调用,
        postHandle在业务处理器处理请求执行完成后,生成视图之前执行,afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 。所以要想实现自己的权限管理逻辑,需要继承HandlerInterceptorAdapter并重写其三个方法。
        首先在springmvc.xml中加入自己定义的拦截器我的实现逻辑CommonInterceptor,

    [html] view plain copy
     
     print?
    1. <!--配置拦截器, 多个拦截器,顺序执行 -->  
    2. <mvc:interceptors>    
    3.     <mvc:interceptor>    
    4.         <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->  
    5.         <mvc:mapping path="/" />  
    6.         <mvc:mapping path="/user/**" />  
    7.         <mvc:mapping path="/test/**" />  
    8.         <bean class="com.alibaba.interceptor.CommonInterceptor"></bean>    
    9.     </mvc:interceptor>  
    10.     <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->  
    11. </mvc:interceptors>  



        我的拦截逻辑是“在未登录前,任何访问url都跳转到login页面;登录成功后跳转至先前的url”,具体代码如下:

    [java] view plain copy
     
     print?
    1. /** 
    2.  *  
    3.  */  
    4. package com.alibaba.interceptor;  
    5.   
    6. import javax.servlet.http.HttpServletRequest;  
    7. import javax.servlet.http.HttpServletResponse;  
    8.   
    9. import org.slf4j.Logger;  
    10. import org.slf4j.LoggerFactory;  
    11. import org.springframework.web.servlet.ModelAndView;  
    12. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  
    13.   
    14. import com.alibaba.util.RequestUtil;  
    15.   
    16.   
    17. /** 
    18.  * @author tfj 
    19.  * 2014-8-1 
    20.  */  
    21. public class CommonInterceptor extends HandlerInterceptorAdapter{  
    22.     private final Logger log = LoggerFactory.getLogger(CommonInterceptor.class);  
    23.     public static final String LAST_PAGE = "com.alibaba.lastPage";  
    24.     /* 
    25.      * 利用正则映射到需要拦截的路径     
    26.       
    27.     private String mappingURL; 
    28.      
    29.     public void setMappingURL(String mappingURL) {     
    30.                this.mappingURL = mappingURL;     
    31.     }    
    32.   */  
    33.     /**  
    34.      * 在业务处理器处理请求之前被调用  
    35.      * 如果返回false  
    36.      *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链 
    37.      * 如果返回true  
    38.      *    执行下一个拦截器,直到所有的拦截器都执行完毕  
    39.      *    再执行被拦截的Controller  
    40.      *    然后进入拦截器链,  
    41.      *    从最后一个拦截器往回执行所有的postHandle()  
    42.      *    接着再从最后一个拦截器往回执行所有的afterCompletion()  
    43.      */    
    44.     @Override    
    45.     public boolean preHandle(HttpServletRequest request,    
    46.             HttpServletResponse response, Object handler) throws Exception {    
    47.         if ("GET".equalsIgnoreCase(request.getMethod())) {  
    48.             RequestUtil.saveRequest();  
    49.         }  
    50.         log.info("==============执行顺序: 1、preHandle================");    
    51.         String requestUri = request.getRequestURI();  
    52.         String contextPath = request.getContextPath();  
    53.         String url = requestUri.substring(contextPath.length());  
    54.         
    55.         log.info("requestUri:"+requestUri);    
    56.         log.info("contextPath:"+contextPath);    
    57.         log.info("url:"+url);    
    58.           
    59.         String username =  (String)request.getSession().getAttribute("user");   
    60.         if(username == null){  
    61.             log.info("Interceptor:跳转到login页面!");  
    62.             request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);  
    63.             return false;  
    64.         }else  
    65.             return true;     
    66.     }    
    67.     
    68.     /** 
    69.      * 在业务处理器处理请求执行完成后,生成视图之前执行的动作    
    70.      * 可在modelAndView中加入数据,比如当前时间 
    71.      */  
    72.     @Override    
    73.     public void postHandle(HttpServletRequest request,    
    74.             HttpServletResponse response, Object handler,    
    75.             ModelAndView modelAndView) throws Exception {     
    76.         log.info("==============执行顺序: 2、postHandle================");    
    77.         if(modelAndView != null){  //加入当前时间    
    78.             modelAndView.addObject("var", "测试postHandle");    
    79.         }    
    80.     }    
    81.     
    82.     /**  
    83.      * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等   
    84.      *   
    85.      * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()  
    86.      */    
    87.     @Override    
    88.     public void afterCompletion(HttpServletRequest request,    
    89.             HttpServletResponse response, Object handler, Exception ex)    
    90.             throws Exception {    
    91.         log.info("==============执行顺序: 3、afterCompletion================");    
    92.     }    
    93.   
    94. }    

        注:上述代码里我写了一个RequestUtil,主要实现获取当前Request、Session对象,保存和加密页面,取出等功能。

    至此,拦截器已经实现了,效果如图:

    我直接访问/test/hello,会被拦截

    登录成功后会跳转至/test/hello对应的页面

  • 相关阅读:
    sqlserver中判断表或临时表是否存在
    Delphi 简单方法搜索定位TreeView项
    hdu 2010 水仙花数
    hdu 1061 Rightmost Digit
    hdu 2041 超级楼梯
    hdu 2012 素数判定
    hdu 1425 sort
    hdu 1071 The area
    hdu 1005 Number Sequence
    hdu 1021 Fibonacci Again
  • 原文地址:https://www.cnblogs.com/handsome1013/p/5280261.html
Copyright © 2011-2022 走看看