一、SpringMVC拦截器
1.简单的拦截器开发
1.添加依赖
需要注意的是<!--为了避免与Tomcat自带的servleAPI冲突,只有在开发编译才会使用,发布时会被排除在外-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!-- 添加jackson-core依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.9</version>
</dependency>
<!-- 添加拦截器依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!-- 为了避免与Tomcat自带的servleAPI冲突,只有在开发编译才会使用,发布时会被排除在外-->
<scope>provided</scope>
</dependency>
</dependencies>
2.所有的拦截器都需要实现HandlerInterceptor
需注意其中三个方法的执行时间
package com.springmvc.restful.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//本方法在请求进入Controller之前执行,返回true则会将该请求继续向后传递
// 返回false则会直接阻止请求,将结果返回浏览器
System.out.println(request.getRequestURI()+"-准备执行!");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//作用在目标资源Controller处理成功但是尚未返回响应文本之前
System.out.println(request.getRequestURI()+"-目标处理成功!");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//最后被执行,目标响应文本产生之后执行
System.out.println(request.getRequestURI()+"-响应内容已产生!");
}
}
3.applicationContext.xml配置拦截器的作用范围和拦截地址
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.springmvc.restful"></context:component-scan>
<!-- 开启注解模式-->
<mvc:annotation-driven>
<!-- 开启静态转换器-->
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=utf-8</value>
<value>application/json;charset=utf-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--静态资源拦截器-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!-- 跨域访问的全局配置-->
<mvc:cors>
<mvc:mapping path="/restful/**"
allowed-origins="http://localhost,http://www.baidu.com"
max-age="3600"/>
</mvc:cors>
<mvc:interceptors>
<mvc:interceptor>
<!-- 需要对那些地址进行拦截,/**为对所有请求进行拦截-->
<mvc:mapping path="/**"/>
<!-- 对拦截地址进行处理的类对象-->
<bean class="com.springmvc.restful.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
</beans>
4.结果
2.拦截器规则
1.添加排除规则例如静态资源,虽然在前期通过<mvc:default-servlet-handler></mvc:default-servlet-handler>对静态资源不做处理,但在使用拦截器后还是会进行处理,这时就需要用到排除规则
可以通过逐一配置排除静态资源的后缀来进行过滤
<mvc:interceptors>
<mvc:interceptor>
<!-- 需要对那些地址进行拦截,/**为对所有请求进行拦截-->
<mvc:mapping path="/**"/>
<!-- 添加对静态资源不拦截处理的排除规则-->
<mvc:exclude-mapping path="/**.jpg"/>
<mvc:exclude-mapping path="/**.gif"/>
<mvc:exclude-mapping path="/**.ioc"/>
<mvc:exclude-mapping path="/**.js"/>
<mvc:exclude-mapping path="/**.css"/>
<!-- 对拦截地址进行处理的类对象-->
<bean class="com.springmvc.restful.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
也可以使用统一规范静态资源的方式进行排除,方法就是在webapp目录下新建resource包,在里面新建image,css,js等文件夹存放静态资源。然后统一排除resource目录下的所有资源
同理对所有的controller的uri进行规范
3.多个拦截器的执行顺序