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

如题所述

在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
温馨提示:答案为网友推荐,仅供参考
相似回答