过滤器

实现过滤器需要实现 javax.servlet.Filter 接口。重写三个方法。其中 init() 方法在服务启动时执行,destroy() 在服务停止之前执行。

可用两种方式注册过滤器:

  • 使用 FilterRegistrationBean 来注入。可使用 setOrder(0) 设置过滤器的优先级,越小优先级越高。
  • 使用 @WebFilter(filterName = "myFilter2" ,urlPatterns = "/*") 配合 @ServletComponentScan() 实现注入。(@Order 注解无效)

编写过滤器

package com.example.recorddemo.filters;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException; public class MyFilter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化过滤器:" + filterConfig.getFilterName());
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("在请求之前做处理"); if (servletRequest instanceof HttpServletRequest) {
System.out.println(" URL:" + ((HttpServletRequest)servletRequest).getRequestURL());
} // 调用filter链中的下一个filter
filterChain.doFilter(servletRequest, servletResponse); System.out.println("在请求之后做处理");
} @Override
public void destroy() {
System.out.println("销毁:MyFilter1");
}
}

注册过滤器

基于 FilterRegistrationBean

在配置类中注册一个 FilterRegistrationBean 类型的Bean。

  • 如果没有设置 UrlPatterns , 那么会自动关联到 /* 上。
  • 如果没有设置过滤器的名字,那么会自动推理出一个过滤器名称(bean的名字)

    When no URL pattern or servlets are specified the filter will be associated to '/*'. The filter name will be deduced if not specified.

  • fileter默认是enable的,将其设置为false表示关闭当前过滤器。
  • 可通过 setOrder(0) 方法设置过滤器的优先级,如果优先级相同,则先定义的优先级更高。
@Configuration
public class FilterConfiguration {
@Bean
public FilterRegistrationBean myFilter1(){
MyFilter1 filter = new MyFilter1();
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(filter);
// filterRegistrationBean.addUrlPatterns("/*");
// filterRegistrationBean.setEnabled(true);
return filterRegistrationBean;
}
}

基于 @WebFilter

  • 使用 @WebFilter 修饰filter。
  • 在任意configuration类中添加 @ServletComponentScan("com.example.recorddemo.filters"),包名可以不填。
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException; @WebFilter(filterName = "myFilter2" ,urlPatterns = "/*")
public class MyFilter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 调用filter链中的下一个filter
filterChain.doFilter(servletRequest, servletResponse); } @Override
public void destroy() {}
}

拦截器

拦截器会在处理指定请求之前和之后进行相关操作,配置拦截器需要两步

    1. 编写拦截器类(实现 HandlerInterceptor 接口)
    1. 添加已实现的拦截器(实现 WebMvcConfigurer 接口,并重写 addInterceptors() 方法)
    1. 添加addPathPatterns()规定拦截哪些请求。(/*表示只拦截/下的所有目录,但是不包括子目录, /**表示拦截/下的所有目录,及其子目录)

拦截器类:

package com.example.recorddemo.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* @author wangchao
*/
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// handle可拿到执行方法的反射对象。
System.out.println("preHandle: MyInterceptor");
return true;
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 对于RESTful 接口用处不大
} @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 可捕捉异常,但是springboot已经有了全局异常捕捉
}
}

配置拦截器:

package com.example.recorddemo.configuration;

import com.example.recorddemo.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.annotation.Resource; /**
* @author wangchao
*/
@Configuration
public class InterceptorConfiguration implements WebMvcConfigurer {
@Resource
MyInterceptor myInterceptor; /**
* 添加拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor).addPathPatterns("/**");
} }

registry.addInterceptor() 方法会返回当前的 interceptor, 因此可直接执行 addPathPatterns() 方法


public InterceptorRegistration addInterceptor(HandlerInterceptor interceptor) {
InterceptorRegistration registration = new InterceptorRegistration(interceptor);
this.registrations.add(registration);
return registration;
}

拦截器的执行顺序类似于栈,按照如下顺序执行:

preHandle-1, preHandle-2, postHandle-2, postHandle-1, afterCompletion-2, afterCompletion-1

SpringBoot 过滤器和拦截器的更多相关文章

  1. Springboot 过滤器和拦截器详解及使用场景

    一.过滤器和拦截器的区别 1.过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的.请求结束返回也是,是在servlet处理完后,返回给前端之前. 2.拦截 ...

  2. springBoot之配置文件的读取以及过滤器和拦截器的使用

    前言 在之前的学习springBoot中,成功的实现了Restful风格的基本服务.但是想将之前的工程作为一个项目来说,那些是仅仅不够的.可能还需要获取自定义的配置以及添加过滤器和拦截器.至于为什么将 ...

  3. springboot(五)过滤器和拦截器

    前言 过滤器和拦截器二者都是AOP编程思想的提现,都能实现诸如权限检查.日志记录等.二者有一定的相似之处,不同的地方在于: Filter是servlet规范,只能用在Web程序中,而拦截器是Sprin ...

  4. springboot配置监听器、过滤器和拦截器

    监听器:listener是servlet规范中定义的一种特殊类.用于监听servletContext.HttpSession和servletRequest等域对象的创建和销毁事件.监听域对象的属性发生 ...

  5. springboot环境下配置过滤器和拦截器

    以前我们在配置过滤器和拦截器的时候,都是一个类继承一个接口,然后在xml中配置一下就ok 但是,但是,这是springboot的环境,没有xml的配置.所以我们还要继续学习啊啊啊啊啊~~~~~ 先简单 ...

  6. SpringBoot入坑指南之六:使用过滤器或拦截器

    在Web应用中,常常存在拦截全部或部分请求进行统一处理的应用场景,如权限校验.参数校验.性能监控等. 在SpringMVC框架中,我们可以通过过滤器或拦截器实现相关功能,spring-boot-sta ...

  7. SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂)

    SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂) 在实际开发过程中,经常会碰见一些比如系统启动初始化信息.统计在线人数.在线用户数.过滤敏/高词汇.访问权限控制(URL级别 ...

  8. 过滤器,拦截器,aop区别与使用场景

    1. 什么是过滤器 过滤器,顾名思义就是起到过滤筛选作用的一种事物,只不过相较于现实生活中的过滤器,这里的过滤器过滤的对象是客户端访问的web资源,也可以理解为一种预处理手段,对资源进行拦截后,将其中 ...

  9. Struts2之过滤器和拦截器的区别

    刚学习Struts2这个框架不久,心中依然有一个疑惑未解那就是过滤器和拦截器的区别,相信也有不少人跟我一样对于这个问题没有太多的深入了解 那么下面我们就一起来探讨探讨 过滤器,是在java web中, ...

随机推荐

  1. UI自动化框架搭建之Python3

    UI自动化框架搭建--unittest 使用的代码是Python3版本,与时俱进哈哈 解释一下我的框架目录接口(每个人框架的目录接口不一样,根据实际要求) common目录:公共模块,这个地方可以存放 ...

  2. 线性代数 | Jordan 标准型的笔记

    内容概述: 把方阵 A 的特征多项式 \(c(λ)=|λE-A|\) 展开成 \(c(λ)=\sum_ia_i\lambda^i\) 的形式,然后使用神乎其技的证明,得到 \(c(A)=O\),特征多 ...

  3. IO流----读取文件,复制文件,追加/插入文件

    文件结构 读取文件 第一种方式 public class Test { public static void main(String[] args) throws IOException { // 最 ...

  4. C# winfrom ListView控件实现自由设置每一行字体及背景色等

    背景:公司经常会需要将日志信息,输出到一个对话框中显示出来.之前一直采用的listbox控件,操作简单,使用方便,但是遗憾的是,不能自由控制每一行的状态. 于是想了如下几个方案: (1)重绘listb ...

  5. Linux的OpenLava配置

    OpenLava OpenLava是基于LSF早期的开源版本发展而来,其免费.开源.兼容IBM LSF的工作负载调度器.当你需要执行某项业务时候(比如跑渲染之类的),当有服务器处于空闲状态时候,可以直 ...

  6. Jenkins JNLP方式启动 Agent

    Jenkins Server配置 如果你是通过Nginx代理了jenkins,那么需要调整下Nginx的配置 map $http_upgrade $connection_upgrade { defau ...

  7. 手写tomcat——编写一个echo http服务器

    核心代码如下: public class DiyTomcat1 { public void run() throws IOException { ServerSocket serverSocket = ...

  8. CMake | 将路径添加到 CMAKE_PREFIX_PATH

    1. CMAKE_PREFIX_PATH CMAKE_PREFIX_PATH是一个分号分隔的路径列表,用来指明软件/库安装路径前缀,以供find_package(),find_program(),fi ...

  9. 【SQLServer】max worker threads参数配置

    查看和设置max worker threads USE master; //选中你想设置max worker threads的数据库.master表示在实例级别进行设置 GO EXEC sp_conf ...

  10. ELK日志报警插件ElastAlert并配置钉钉报警

    文章转载自:https://www.cnblogs.com/uglyliu/p/13118386.html ELK日志报警插件ElastAlert 它通过将Elasticsearch与两种类型的组件( ...