通过Spring MVC 的自定义拦截器实现灵活的登录拦截

来源:互联网 发布:淘宝付款方式怎么设置 编辑:程序博客网 时间:2024/09/21 06:17
SpringMVC 中的Interceptor 拦截器,它的主要作用是拦截用户的请求并进行相应的处理。用户可以自定义拦截器来实现特定的功能,比如通过它来进行权限验证,或者是来判断用户是否登陆等。
SpringMVC的拦截器提供了HandlerInterceptorAdapter抽象类,对应提供了三个preHandle,postHandle,afterCompletion方法。
preHandle在业务处理器处理请求之前被调用,
postHandle在业务处理器处理请求执行完成后,生成视图之前执行,
afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 。
所以要想实现自己的拦截管理逻辑,需要继承HandlerInterceptorAdapter并重写其三个方法。
下面以一个例子来通过SpringMVC 中的自定义Interceptor实现灵活的登录拦截,实现方式很简单。

1、新建一个CommInterceptor 继承 HandlerInterceptorAdapter 并重写其中三个方法。
[java] view plain copy
  1. public class CommInterceptor extends HandlerInterceptorAdapter{  
  2.     private final Logger log = LoggerFactory.getLogger(CommInterceptor.class);  
  3.     public String defultLogin="/account/login";//默认登录页面  
  4.     public Map<String,String> defineUrls;//自定义的Url,自定义拦截后的处理页面。  
  5.       
  6.     @Override    
  7.     public boolean preHandle(HttpServletRequest request,    
  8.             HttpServletResponse response, Object handler) throws Exception {    
  9.   
  10.         //从session获取登录信息  
  11.         if(SessionUtils.getAttribute(request, "user")!=null)  
  12.         {  
  13.             return true;  
  14.         }  
  15.         else  
  16.         {  
  17.             if(defineUrls!=null&&defineUrls.size()>0)  
  18.             {  
  19.                 if(defineUrls.containsKey(url))  
  20.                 {  
  21.                     defultLogin=defineUrls.get(url).toString();  
  22.                 }  
  23.             }  
  24.             log.info("Interceptor:跳转到login页面!"+defultLogin+"-----");  
  25.             response.sendRedirect(request.getContextPath()+defultLogin);  
  26.             return false;  
  27.         }   
  28.     }    
  29.     
  30.     @Override    
  31.     public void postHandle(HttpServletRequest request,    
  32.             HttpServletResponse response, Object handler,    
  33.             ModelAndView modelAndView) throws Exception {     
  34.     }    
  35.     
  36.     @Override    
  37.     public void afterCompletion(HttpServletRequest request,    
  38.             HttpServletResponse response, Object handler, Exception ex)    
  39.             throws Exception {    
  40.     }    
  41.       
  42.     public String getDefultLogin() {  
  43.         return defultLogin;  
  44.     }  
  45.   
  46.     public void setDefultLogin(String defultLogin) {  
  47.         this.defultLogin = defultLogin;  
  48.     }  
  49.   
  50.     public Map<String, String> getDefineUrls() {  
  51.         return defineUrls;  
  52.     }  
  53.   
  54.     public void setDefineUrls(Map<String, String> defineUrls) {  
  55.         this.defineUrls = defineUrls;  
  56.     }  
  57. }  

2、在Spring 配置文件中配置自定义的拦截器。
[html] view plain copy
  1. <!--配置拦截器 -->  
  2. <mvc:interceptors>  
  3.     <mvc:interceptor>  
  4.         <!--   
  5.         /**的意思是所有文件夹及里面的子文件夹   
  6.         /*是所有文件夹,不含子文件夹   
  7.         /是web项目的根目录   
  8.         -->  
  9.         <mvc:mapping path="/personCenter/*" />  
  10.         <mvc:mapping path="/web/exam/yuDingXinXi" />  
  11.         <mvc:mapping path="/web/preRegister/goYuYueDingDan" />  
  12.         <!-- 微信预约体检 -->  
  13.         <mvc:mapping path="/exam/yuDingXinXi" />  
  14.         <!-- 微信体质辨识 -->  
  15.         <mvc:mapping path="/healthJudge/healthJudge" />  
  16.         <bean class="com.transfar.webportal.chp.common.interceptor.CommInterceptor">  
  17.             <!--定义拦截后重定向到默认的登录处理页面 -->  
  18.             <property name="defultLogin" value="/account/login" />  
  19.             <!--定义拦截后重定向到其他登录处理页面 -->  
  20.             <property name="defineUrls">  
  21.                 <map>  
  22.                     <entry key="/exam/yuDingXinXi" value="/connect/wx/start" />  
  23.                     <entry key="/healthJudge/healthJudge" value="/connect/wx/start" />  
  24.                 </map>  
  25.             </property>  
  26.         </bean>  
  27.     </mvc:interceptor>  
  28. </mvc:interceptors>  
这样就实现了灵活的登录拦截,并且能够根据不同的场景重新定向到不同的登录处理页面,我这里是拦截的需要登录的URL,如果是网站的走默认登录页面,微信的走微信认证登录的页面。
原创粉丝点击