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

2024-10-29 13:20:17
推荐回答(1个)
回答1:

在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代码  

  •   

  • 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">  

  •   

  •   

  •   

  •   

  •    

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

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

  •   

  •   

  •   

  •   



  •   其中使用了注册了拦截器 


  • 4) 运行后,输出: 

  • Pre-handle 

  • Post-handle 

  • After completion handle 


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

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

  • Java代码  

  •     

  •     

  •     

  •     

  •     

  •     

  •     

  •     


  •     

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

  • HandlerInterceptor1 preHandle  

  • HandlerInterceptor2 preHandle  

  •   

  • HandlerInterceptor2 postHandle  

  • HandlerInterceptor1 postHandle  


  • HandlerInterceptor2 afterCompletion  

  • HandlerInterceptor1 afterCompletion  

  •     总结下,就是在哪个拦截器的prehandler