springmvc拦截器,设置不拦截的URL


原创  2017年10月24日 21:31:52

对于springmvc,有两种方式配置拦截器。

一是实现HandlerInterceptor接口,如

[java]  view plain  copy
  1. public class MyInterceptor1 implements HandlerInterceptor {  
  2.     //该方法在action执行前执行,可以实现对数据的预处理,  
  3.     // 比如:编码、安全控制等。如果方法返回true,则继续执行action。  
  4.     @Override  
  5.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws  
  6.             Exception {  
  7.         System.out.println("MyInterceptor1 action之前执行!!!");  
  8.         return true;  //继续执行action  
  9.     }  
  10.   
  11.     该方法在action执行后,生成视图前执行。在这里,我们有机会修改视图层数据。  
  12.     @Override  
  13.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView  
  14.             modelAndView) throws Exception {  
  15.         System.out.println("MyInterceptor1 action执行之后,生成视图之前执行!!");  
  16.     }  
  17.   
  18.     //最后执行,通常用于释放资源,处理异常。我们可以根据ex是否为空,来进行相关的异常处理。  
  19.     //因为我们在平时处理异常时,都是从底层向上抛出异常,最后到了spring框架从而到了这个方法中。  
  20.     @Override  
  21.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {  
  22.         System.out.println("MyInterceptor1 最后执行!!!一般用于释放资源!!");  
  23.     }  
  24. }  

二是extendsHandlerInterceptorAdapter类,如

[java]  view plain  copy
  1. public class MyInterceptor2  extends HandlerInterceptorAdapter{  
  2.   
  3.     @Override  
  4.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws  
  5.             Exception {  
  6.         System.out.println("MyInterceptor2.preHandle()");  
  7.         return true;  //继续执行action  
  8.     }  
  9. }  

对于控制器url的拦截,分为如下3种情况:

1. 拦截所有的url

[html]  view plain  copy
  1. <mvc:interceptor>  
  2.     <mvc:mapping path="/**"/>  
  3.         <!--这样配置,将拦截所有springmvc的url-->  
  4.         <bean class="interceptor.MyInterceptor1">  
  5.   
  6.         </bean>  
  7. </mvc:interceptor>  

2. 对于所有的url,指定url放行

[html]  view plain  copy
  1. <!--配置拦截器-->  
  2.     <!--这样配置,将拦截访问springmvc指定路径下的url-->  
  3.     <mvc:interceptor>  
  4.         <mvc:mapping path="/emp/*"/>  
  5.         <bean class="interceptor.MyInterceptor2"></bean>  
  6.     </mvc:interceptor>  
  7. </mvc:interceptors>  

3. 对于所有的url,exceptUrls外放行

比如我们常见的LoginInterceptor

 方法:在拦截器里注入一个属性List<String> exceptUrls

[html]  view plain  copy
  1. <!--配置拦截器 拦截除了exceptUrls内的所有请求-->  
  2.     <mvc:interceptors>  
  3.         <mvc:interceptor>  
  4.             <mvc:mapping path="/**"/>  
  5.             <bean class="common.interceptor.LoginInterceptor">  
  6.                 <property name="exceptUrls">  
  7.                     <list>  
  8.                         <value>/user/login</value>  
  9.                         <value>/user/register</value>  
  10.                     </list>  
  11.                 </property>  
  12.             </bean>  
  13.         </mvc:interceptor>  
  14.     </mvc:interceptors>  

LoginInterceptor类

[java]  view plain  copy
  1. public class LoginInterceptor extends HandlerInterceptorAdapter {  
  2.   
  3.     private List<String> exceptUrls;  
  4.   
  5.     public List<String> getExceptUrls() {  
  6.         return exceptUrls;  
  7.     }  
  8.   
  9.     public void setExceptUrls(List<String> exceptUrls) {  
  10.         this.exceptUrls = exceptUrls;  
  11.     }  
  12.   
  13.     //执行action之前来执行  
  14.     @Override  
  15.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws  
  16.             Exception {  
  17.           
  18.         String requestUri = request.getRequestURI();  
  19.         if(requestUri.startsWith(request.getContextPath())){  
  20.             requestUri = requestUri.substring(request.getContextPath().length(), requestUri.length());  
  21.         }  
  22.         //系统根目录  
  23.         if (StringUtils.equals("/",requestUri)) {  
  24.             return true;  
  25.         }  
  26.         //放行exceptUrls中配置的url  
  27.         for (String url:exceptUrls  
  28.              ) {  
  29.             if(url.endsWith("/**")){  
  30.                 if (requestUri.startsWith(url.substring(0, url.length() - 3))) {  
  31.                     return true;  
  32.                 }  
  33.             } else if (requestUri.startsWith(url)) {  
  34.                 return true;  
  35.             }  
  36.         }  
  37.         //其他需要登录后才能进行访问的url  
  38.         String sessionid = request.getSession().getId();  
  39.         UserSessionStatus status = SessionManager.getStatus(sessionid);  
  40.   
  41.         //如果没有登录  
  42.         if(null==status){              
  43.             //返回到登录页面              
  44.             return false;  
  45.         }else{  
  46.             return true;  
  47.         }  
  48.     }  
  49. }  
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值