zoukankan      html  css  js  c++  java
  • Spring总结之SpringMvc下

    五、拦截器

        SpringMVC中的拦截器是通过HandlerInterceptor来实现的,定义一个Interceptor有两种方式

        1、实现HandlerInterceptor接口或者继承实现了HandlerInterceptor接口的类,例如抽象类HandlerInterceptorAdapter

    HandlerInterceptor 接口中定义了三个方法,我们就是通过这三个方法来对用户的请求进行拦截处理的。

    public class SpringMVCInterceptor implements HandlerInterceptor{
     /**
      * preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,可以同时存在 
      * 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在Controller方法调用之前调用。
      * SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返 回值为false,
      * 当preHandle的返回值为false的时候整个请求就结束了。
      */
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
       throws Exception {
      return false;
     }
     /**
      * 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。
      * postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之 后,也就是在Controller的方法调用之后执行,
      * 但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操 作。
      * 这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用.
      */
     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
       ModelAndView modelAndView) throws Exception {  
     }
     /**
      * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。
      * 该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行, 
         * 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。 
      */
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, 
         Exception ex)
       throws Exception {
       
     }
    }

    2、实现WebRequestInterceptor接口或这继承实现了WebRequestInterceptor接口的类。

    WebRequestInterceptor 中也定义了三个方法,我们也是通过这三个方法来实现拦截的。这三个方法都传递了同一个参数WebRequest ,WebRequest 是Spring 定义的一个接口,它里面的方法定义都基本跟HttpServletRequest 一样,在WebRequestInterceptor 中对WebRequest 进行的所有操作都将同步到HttpServletRequest 中,然后在当前请求中一直传递。

    public class SpringMVCInterceptor2 implements WebRequestInterceptor{
     /**
      * preHandle(WebRequest request) 方法。该方法将在请求处理之前进行调用,也就是说会在Controller 方法调用之前被调用。
      * 这个方法跟HandlerInterceptor 中的preHandle 是不同的,主要区别在于该方法的返回值是void ,也就是没有返回值,
      * 所以我们一般主要用它来进行资源的准备工作,比如我们在使用Hibernate 的时候可以在这个方法中准备一个Hibernate 的Session 对象,
      * 然后利用WebRequest 的setAttribute(name, value, scope)把它放到WebRequest 的属性中。
      * 这里可以说说这个setAttribute 方法的第三个参数scope ,该参数是一个Integer类型的。在WebRequest 的父层接口RequestAttributes 中对它定义了三个常量:
      * SCOPE_REQUEST :它的值是0 ,代表只有在request 中可以访问。
      * SCOPE_SESSION :它的值是1 ,如果环境允许的话它代表的是一个局部的隔离的session,否则就代表普通的session,并且在该session范围内可以访问。
      * SCOPE_GLOBAL_SESSION :它的值是2 ,如果环境允许的话,它代表的是一个全局共享的session,否则就代表普通的session,并且在该session 范围内可以访问。
      * 
      */
     public void preHandle(WebRequest request) throws Exception {
            System.out.println("AllInterceptor...............................");  
            request.setAttribute("request", "request", WebRequest.SCOPE_REQUEST);
            request.setAttribute("session", "session", WebRequest.SCOPE_SESSION);
            request.setAttribute("globalSession", "globalSession", WebRequest.SCOPE_GLOBAL_SESSION);
     }
     /**
      * postHandle(WebRequest request, ModelMap model) 方法。该方法将在请求处理之后,也就是在Controller 方法调用之后被调用,
      * 但是会在视图返回被渲染之前被调用,所以可以在这个方法里面通过改变数据模型ModelMap 来改变数据的展示。
      * 该方法有两个参数,WebRequest 对象是用于传递整个请求数据的,比如在preHandle 中准备的数据都可以通过WebRequest 来传递和访问;
      * ModelMap 就是Controller 处理之后返回的Model 对象,我们可以通过改变它的属性来改变返回的Model 模型
      */
     public void postHandle(WebRequest request, ModelMap model) throws Exception {
     }
     /** 
         * 该方法将在整个请求完成之后,也就是说在视图渲染之后进行调用,主要用于进行一些资源的释放 
         */  
     public void afterCompletion(WebRequest request, Exception ex) throws Exception { 
     }
    }
    <mvc:interceptors>  
     
        <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->  
     
        <bean class="com.host.app.web.interceptor.AllInterceptor"/>  
     
        <mvc:interceptor>  
     
            <mvc:mapping path="/test/number.do"/>  
     
            <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->  
     
            <bean class="com.host.app.web.interceptor.LoginInterceptor"/>  
     
        </mvc:interceptor>  </mvc:interceptors>

    六、乱码问题

    <mvc:annotation-driven >  
        <mvc:message-converters register-defaults="true">  
        <!-- 解决@ResponseBody中文乱码 -->  
      <bean class="org.springframework.http.converter.StringHttpMessageConverter">  
        <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" />  
      </bean>  
     </mvc:message-converters>  
    </mvc:annotation-driven>
  • 相关阅读:
    List 集合的常用方法总结
    springboot 整合 web 项目找不到 jsp 文件
    Web 安全
    微服务开放平台接口设计
    SpringCloud Hystrix 参数
    SpringCloud Eureka 配置
    ELK 日志收集系统
    网盘搜索引擎原理
    jsPlumb.jsAPI阅读笔记(官方文档翻译)
    ionic获取ios唯一设备id的解决方案
  • 原文地址:https://www.cnblogs.com/jnba/p/10832771.html
Copyright © 2011-2022 走看看