在做 web 开发的时候, 过滤器 (Filter) 和拦截器 (Interceptor) 很常见, 通俗的讲, 过滤器可以简单理解为 "取你所想取", 忽视掉那些你不想要的东西; 拦截器可以简单理解为 "拒你所想拒", 关心你想要拒绝掉哪些东西, 比如一个 BBS 论坛上拦截掉敏感词汇.
过滤器依赖于 servlet 容器, 是 JavaEE 标准, 是在请求进入容器之后, 还未进入 Servlet 之前进行预处理, 并且在请求结束返回给前端这之间进行后期处理. 在实现上基于函数回调, 可以对几乎所有请求进行过滤, 但是缺点是一个过滤器实例只能在容器初始化时调用一次. 使用过滤器的目的是用来做一些过滤操作, 获取我们想要获取的数据, 比如: 在过滤器中修改字符编码; 在过滤器中修改 HttpServletRequest 的一些参数, 包括: 过滤低俗文字, 危险字符等
java 里的拦截器是动态拦截 Action 调用的对象. 它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码, 也可以在一个 action 执行前阻止其执行, 同时也提供了一种可以提取 action 中可重用部分的方式. 在 AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前, 进行拦截然后在之前或之后加入某些操作.
v 过滤器 demo
1.1 创建 MyTestFilter
- package com.demo.Filter;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.stereotype.Component;
- import javax.servlet.*;
- import javax.servlet.annotation.WebFilter;
- import java.io.IOException;
- /**
- * Created by toutou on 2018/10/27.
- */
- @Slf4j
- @Component
- public class MyTestFilter implements Filter{
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- System.out.println("1111111111111111111111111");
- log.info("filter 初始化");
- }
- @Override
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- throws IOException, ServletException {
- // TODO Auto-generated method stub
- System.out.println("2222222222222222222222222");
- log.info("doFilter 请求处理");
- //TODO 进行业务逻辑
- // 链路 直接传给下一个过滤器
- chain.doFilter(request, response);
- }
- @Override
- public void destroy() {
- System.out.println("33333333333333333333333333");
- log.info("filter 销毁");
- }
- }
1.2 查看 idea 启动日志
1.3 启动 tomcat, 查看日志.
如果需要针对指定路径才让过滤器生效, 可以参考 WebConfig 类.
v 拦截器 demo
- 2.1 MyTestInterceptor
- package com.demo.Filter;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.stereotype.Component;
- import org.springframework.Web.servlet.HandlerInterceptor;
- import org.springframework.Web.servlet.ModelAndView;
- /**
- * Created by toutou on 2018/10/27.
- */
- @Component
- public class MyTestInterceptor implements HandlerInterceptor {
- /*
- * 视图渲染之后的操作
- */
- @Override
- public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
- throws Exception {
- }
- /*
- * 处理请求完成后视图渲染之前的处理操作
- */
- @Override
- public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
- throws Exception {
- }
- /*
- * 进入 controller 层之前拦截请求
- */
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
- System.out.println("MyTestInterceptor 1111111111");
- return true;
- }
- }
- 2.2 WebConfig
- package com.demo.Filter;
- import org.springframework.boot.Web.servlet.FilterRegistrationBean;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.Web.servlet.config.annotation.InterceptorRegistry;
- import org.springframework.Web.servlet.config.annotation.WebMvcConfigurer;
- import javax.annotation.Resource;
- /**
- * Created by toutou on 2018/10/27.
- */
- @Configuration
- public class WebConfig implements WebMvcConfigurer {
- @Resource
- private MyTestInterceptor myTestInterceptor;
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- // 自定义拦截器, 添加拦截路径和排除拦截路径
- registry.addInterceptor(myTestInterceptor).addPathPatterns("/show");
- }
- @Bean
- public FilterRegistrationBean testFilterRegistration(MyTestFilter myTestFilter) {
- FilterRegistrationBean registration = new FilterRegistrationBean();
- registration.setFilter(myTestFilter);// 添加过滤器
- registration.addUrlPatterns("/show");// 设置过滤路径,/* 所有路径
- //registration.addInitParameter("name", "alue");// 添加默认参数
- registration.setName("MyFilter");// 设置优先级
- registration.setOrder(1);// 设置优先级
- return registration;
- }
- }
运行效果:
v 注意事项
注意设置启动类的扫描路径.
- package com.demo.hellospringboot;
- import lombok.extern.slf4j.Slf4j;
- import org.mybatis.spring.annotation.MapperScan;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.context.annotation.ComponentScan;
- @SpringBootApplication
- @ComponentScan(basePackages = {"com.demo"})
- @MapperScan(basePackages = {"com.demo.dao"})
- @Slf4j
- public class HellospringbootApplication {
- public static void main(String[] args) {
- SpringApplication.run(HellospringbootApplication.class, args);
- }
- }
SpringBoot(十一)过滤器和拦截器
来源: http://www.bubuko.com/infodetail-2851365.html