(02)Spring MVC之拦截器配置使用详解

摘要:
1、 拦截器及其简要描述拦截器是指一段程序代码,它通过拦截从浏览器发送到服务器的一些请求来完成一些功能。它是基于Spring AOP实现的,是AOP编程思想的典型应用。我们可以在请求发生之前、何时和之后拦截它。Publicvoid postHandlethrowsException:此方法在执行操作之后和生成视图之前执行。PublicvoidafterCompletionThrowsException:上次执行,通常用于释放资源和处理异常。

  一、拦截器及其简单说明

  拦截器指的是通过拦截从浏览器发往服务器的一些请求来完成某些功能的一段程序代码,基于SpringAOP实现的,它是AOP编程思想的典型应用。在一个请求发生之前、发生时、发生后我们都可以对请求进行拦截。

  拦截器可以用于:

  1)权限验证:如没有登录则拦截返回登录页面;

  2)解决乱码:request中设置字符集;

  3)记录操作日志:记录请求信息的日志,以便进行信息监控、信息统计;

  4)性能监控:如根据用户请求处理前和请求处理后的时间差计算整个请求相应完成所消耗的时间;

  5)异常处理:在afterCompletion方法中可以获取异常。

  二、拦截器的使用介绍

  使用拦截器需要两步:自定义类继承HandlerInterceptorAdapter;在spring-mvc.xml(通常在这配置)配置bean和拦截规则

  1、配置讲解

  配置分为两种,一种不带拦截规则,拦截所有请求,直接配置在<mvc:interceptors>即可,如下:

<mvc:interceptors>
  <bean   class="com.sl.interceptor.MyInterceptor" />
</mvc:interceptors>
<mvc:interceptors>
  <bean   class="com.sl.interceptor.MyInterceptor" />
   <bean   class="com.sl.interceptor.MyInterceptor2" />
   <bean   class="com.sl.interceptor.MyInterceptor3" />
</mvc:interceptors>

  另一种带拦截规则,拦截指定请求,配置在<mvc:interceptors>、<mvc:interceptor>中,如下:

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
               <bean   class="com.sl.interceptor.MyInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
               <bean   class="com.sl.interceptor.MyInterceptor" />
        </mvc:interceptor>
           <bean   class="com.sl.interceptor.MyInterceptor2" />
           <bean   class="com.sl.interceptor.MyInterceptor3" />
    </mvc:interceptors>

  一些配置规则参考:

<mvc:mapping path="/**"/>:拦截所有
<mvc:mapping path="/*/*"/>:拦截所有
<mvc:mapping path="/test"/>:拦截/test
<mvc:mapping path="/test/"/>:拦截/test
<mvc:mapping path="/test/get"/>:拦截/test/get
<mvc:mapping path="/test/*"/>:拦截/test/xxx
<mvc:mapping path="/test/get*"/>:拦截/test/getXXX
<mvc:mapping path="/test/*List"/>:拦截/test/XXXList
<mvc:mapping path="/*/get"/>:拦截/xxx/get

  2、HandlerInterceptorAdapter详解

  public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception:

该方法在action执行前执行,如果返回true,则继续执行action。如果返回false,则拦截请求。

  public void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView modelAndView) throws Exception:

该方法在action执行后,生成视图前执行。在这里,我们有机会修改视图层数据。

  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception:

最后执行,通常用于释放资源,处理异常。我们可以根据ex是否为空,来进行相关的异常处理。

  3、简单演示

  新建MyInterceptor.java

package com.sl.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class MyInterceptor extends HandlerInterceptorAdapter{

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        System.out.println("action之前执行1");
        return true;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("action之后,生成视图之前执行1");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler, Exception ex) throws Exception {
        System.out.println("最后执行,释放资源,处理异常1");
    }
}

  新建MyInterceptor2.java

package com.sl.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class MyInterceptor2 extends HandlerInterceptorAdapter{

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        System.out.println("action之前执行2");
        return true;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("action之后,生成视图之前执行2");
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler, Exception ex) throws Exception {
        System.out.println("最后执行,释放资源,处理异常2");
    }
}

  新建MyInterceptor3.java

package com.sl.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class MyInterceptor3 extends HandlerInterceptorAdapter{

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        System.out.println("action之前执行3");
        return true;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("action之后,生成视图之前执行3");
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler, Exception ex) throws Exception {
        System.out.println("最后执行,释放资源,处理异常3");
    }
}

  配置spring-mvc.xml

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/*/get"/>
               <bean   class="com.sl.interceptor.MyInterceptor" />
        </mvc:interceptor>
           <bean   class="com.sl.interceptor.MyInterceptor2" />
           <bean   class="com.sl.interceptor.MyInterceptor3" />
    </mvc:interceptors> 

  测试:http://localhost:8080/spring-web/test/get,拦截顺序:preHandle是正常顺序,postHandle、afterCompletion是相反的顺序

(02)Spring MVC之拦截器配置使用详解第1张

免责声明:文章转载自《(02)Spring MVC之拦截器配置使用详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IAPSQL -去重Group by 和Distinct的效率下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql和Oracle在对clob和blob字段的处理

一、MySQL与Oracle数据库如何处理Clob,Blob数据类型 (1)不通数据库中对应clob,blob的类型如下: MySQL中:clob对应text,blob对应blob DB2/Oracle中:clob对应clob,blob对应blob (2)domain中对应的类型: clob对应String,blob对应byte[] clob对应ja...

submit提交表单后,不刷新当前页面

<form method="get" target="test" action="a.html"> <input type=""text /> <input type="submit" /> </form> <iframe name="test" style="display:none">...

postgres数据库表空间收缩之pg_squeeze,pg_repack

postgres数据库表空间收缩之pg_squeeze,pg_repack 目录 postgres数据库表空间收缩之pg_squeeze,pg_repack pg_squeeze1.2 原理 优点 安装 使用 pgstattuple 临时处理 监控方式 注意事项 squeeze1.2和低版本的区别 pg_repack 原理 安装 使用方法 测...

【Java学习】pom.xml配置

1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4...

python接口自动化测试

(1)环境准备: 接口测试的方式有很多,比如可以用工具(jmeter,postman)之类,也可以自己写代码进行接口测试,工具的使用相对来说都比较简单,重点是要搞清楚项目接口的协议是什么,然后有针对性的进行选择,甚至当工具不太适合项目时需要自己进行开发。 在我们项目的初期,我们采用的是jmeter进行接口测试,当时觉得这个工具上手简单,团队成员学习成本低,...

idea运行main方法或Test避免编译整个应用的方法

在idea,我常常会遇到这样的问题,我写个main或者Test,明明就想运行一个简单的函数测试下某个简单的方法,但一运行就需要编译整个项目,非常的耗时 这里我给出一个idea简单的修改配置就可以解决问题,我的idea版本是2021.2,其它版本可以参考也是类似的 如下所示: 把Do not build before run勾上 自动编译勾上(PS:juni...