springmvc-spring MVC 的拦截器怎么拦截不了

 我来答
又擲彝猜僭僦Au
2017-11-05 · TA获得超过6323个赞
知道大有可为答主
回答量:2305
采纳率:14%
帮助的人:503万
展开全部

在spring mvc中,拦截器其实比较简单了,下面简单小结并demo下。 

preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Controller实现);
返回值:true表示继续流程(如调用下一个拦截器或处理器);
false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应; 
postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。 
afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。 

下面是简单的DEMO 

1)

Java代码  

  • @Controller  

  • public class HelloWorldController {  

  • @RequestMapping(value = "/hello", method = RequestMethod.GET)  

  • public String sayHello() {  

  • return "hello";  

  • }  

  • }  


  •    这个是一个简单的controller了 



  • 2) 拦截器 

  •  
  • Java代码  

  • public class HelloWorldInterceptor implements HandlerInterceptor  {  

  • @Override  

  • public boolean preHandle(HttpServletRequest request,  

  • HttpServletResponse response, Object handler) throws Exception {  

  • System.out.println("Pre-handle");  

  • return false;  

  • }  

  • @Override  

  • public void postHandle(HttpServletRequest request,  

  • HttpServletResponse response, Object handler,  

  • ModelAndView modelAndView) throws Exception {  

  • System.out.println("Post-handle");  

  • }  

  • @Override  

  • public void afterCompletion(HttpServletRequest request,  

  • HttpServletResponse response, Object handler, Exception ex)  

  • throws Exception {  

  • System.out.println("After completion handle");  

  • }  



  • 3) spring mvc配置文件 

  •  
  • Java代码  

  • <?xml  version="1.0" encoding="UTF-8"?>  

  • <beans xmlns="http://www.springframework.org/schema/beans"  

  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

  • xmlns:context="http://www.springframework.org/schema/context"  

  • xmlns:mvc="http://www.springframework.org/schema/mvc"  

  • xsi:schemaLocation="http://www.springframework.org/schema/beans   

  • http://www.springframework.org/schema/beans/spring-beans.xsd  

  • http://www.springframework.org/schema/context   

  • http://www.springframework.org/schema/context/spring-context.xsd  

  • http://www.springframework.org/schema/mvc   

  • http://www.springframework.org/schema/mvc/spring-mvc.xsd">  

  • <context:annotation-config />  

  • <context:component-scan base-package="net.viralpatel.spring3.controller"/>  

  • <mvc:interceptors>  

  • <bean class="net.viralpatel.spring3.interceptor.HelloWorldInterceptor" />  

  • </mvc:interceptors>   

  • <bean id="jspViewResolver"  

  • class="org.springframework.web.servlet.view.InternalResourceViewResolver">  

  • <property name="viewClass"  

  • value="org.springframework.web.servlet.view.JstlView" />  

  • <property name="prefix" value="/WEB-INF/jsp/" />  

  • <property name="suffix" value=".jsp" />  

  • </bean>  

  • </beans>  



  •   其中使用了<mvc:interceptors>注册了拦截器 


  • 4) 运行后,输出: 

  • Pre-handle 

  • Post-handle 

  • After completion handle 


  •    如果在拦截器中的prehandler中返回false,则根本不会渲染到view层了,直接只输出: 

  • Pre-handle,假如注册了两个拦截器, 

  • Java代码  

  • <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">    

  • <property name="interceptors">    

  • <list>    

  • <ref bean="handlerInterceptor1"/>    

  • <ref bean="handlerInterceptor2"/>    

  • </list>    

  • </property>    

  • </bean>    


  •     

  •   则拦截器的执行顺序就是此处添加拦截器的顺序;会输出: 

  • HandlerInterceptor1 preHandle  

  • HandlerInterceptor2 preHandle  

  •   

  • HandlerInterceptor2 postHandle  

  • HandlerInterceptor1 postHandle  


  • HandlerInterceptor2 afterCompletion  

  • HandlerInterceptor1 afterCompletion  

  •     总结下,就是在哪个拦截器的prehandler
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式