springBoot2.0实现过滤器,拦截器
说明
楼主使用springBoot2.0搭建测试项目
pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>springDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springDemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
只有一个controller
拦截器
第一步:
新建一个拦截器实现HandlerInterceptor接口
/**
* Project Name:springDemo
* File Name:MyInterceptor.java
* Package Name:com.springDemo.interceptor
* Date:2019年3月11日下午2:17:18
* @author yym
*
*/
package com.springDemo.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* ClassName: MyInterceptor <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON(可选). <br/>
* date: 2019年3月11日 下午2:17:18 <br/>
*
* @author yym
* @version
* @since JDK 1.8
*/
public class MyInterceptor implements HandlerInterceptor {
/**
* TODO 简单描述该方法的实现功能(可选).
*
* @see org.springframework.web.servlet.HandlerInterceptor#preHandle(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse, java.lang.Object)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("自定义MyInterceptor的------------------preHandle执行.....");
return HandlerInterceptor.super.preHandle(request, response, handler);
}
/**
* TODO 简单描述该方法的实现功能(可选).
*
* @see org.springframework.web.servlet.HandlerInterceptor#postHandle(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse, java.lang.Object,
* org.springframework.web.servlet.ModelAndView)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
System.out.println("自定义MyInterceptor的------------------postHandle执行.....");
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
/**
* TODO 简单描述该方法的实现功能(可选).
*
* @see org.springframework.web.servlet.HandlerInterceptor#afterCompletion(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse, java.lang.Object,
* java.lang.Exception)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println("自定义MyInterceptor的------------------afterCompletion执行.....");
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
第二步:
用java的方式新建一个配置类
继承WebMvcConfigurationSupport
重写 addInterceptors(InterceptorRegistry registry)
来管理拦截器
/**
* Project Name:springDemo
* File Name:WebMvcConfig.java
* Package Name:com.springDemo.config
* Date:2019年3月11日下午2:21:50
* @author yym
*
*/
package com.springDemo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import com.springDemo.interceptor.MyInterceptor;
/**
* ClassName: WebMvcConfig <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON(可选). <br/>
* date: 2019年3月11日 下午2:21:50 <br/>
*
* @author yym
* @version
* @since JDK 1.8
*/
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* TODO 简单描述该方法的实现功能(可选).
*
* @see org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#addInterceptors(org.springframework.web.servlet.config.annotation.InterceptorRegistry)
*/
@Override
protected void addInterceptors(InterceptorRegistry registry) {
super.addInterceptors(registry);
registry.addInterceptor(new MyInterceptor());
}
}
测试如下:
过滤器
第一步:
新建一个MyFilter实现Filter
@Component
@WebFilter(urlPatterns = "/**", filterName = "myFilter")
public class MyFilter implements Filter {
/**
* TODO 简单描述该方法的实现功能(可选).
*
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
* javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("MyFilter执行了");
chain.doFilter(request, response);
}
}
第二步
配置filter
方式一
通过@WebFilter(urlPatterns = "/**", filterName = "myFilter")
结果如下:
方式二:
通过配置
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<MyFilter> testFilterRegistration() {
FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<MyFilter>();
registration.setFilter(new MyFilter());
registration.addUrlPatterns("/*"); //
registration.setOrder(1);
return registration;
}
}
注意方式2 的拦截规则和方式1不同
过滤器和拦截器的区别:
- 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
- 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
- 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
- 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
- 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
- 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。