Filter过滤器是JavaWeb的三大组件之一,三大组件分别为:Servlet程序、Listener监听器、Filter过滤器。
过滤器(Filter)可以在请求到达Servlet之前或响应离开Servlet之前对请求和响应进行过滤和修改。
Filter的生命周期可分为初始化、请求处理、销毁三个阶段。
1.创建阶段:Web服务器启动的时候会创建Filter实例对象,并调用init()方法(只调用一次!!可以进行读取配置文件,建进行数据库连接等操作),完成对象的初始化。
2.执行阶段:当客户端请求目标资源时,服务器会筛选出符合映射条件的Filter,并按照类名的的先后顺序依次执行doFilter() 方法(可对请求进行预处理、检查请求头、修改请求参数、修改相应数据等操作)。
3.销毁阶段:服务器关闭时,Web服务器调用destroy()方法(只调用一次!!可以进行释放资源、关闭数据库连接等操作)销毁Filter对象。
@Component
public class MyFilterOne implements Filter {
/**
* filter对象只创建一次,init方法只执行一次
* FilterConfig对象:代表当前filter配置信息
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 完成实际过滤操作,当客户请求访问与过滤器相关联的URL的时候,Servlet过滤器将先执行doFilter方法,FilterChain参数用于访问后续过滤器
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
filterChain.doFilter(servletRequest,servletResponse);
}
/**
* filter创建后会保存在内存中,当web应用移除或者服务器停止时才销毁,该方法在Filter的生命周期中仅执行一次,可释放过滤器使用的资源
*/
@Override
public void destroy() {
}
}
javax.servlet.Filter接口的类,实现过滤器的逻辑。例如,你可以创建一个名为MyFilter1的过滤器类。import javax.servlet.*;
import java.io.IOException;
public class MyFilter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化操作
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 过滤器逻辑
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
// 销毁操作
}
}
@Bean注解将过滤器注册到应用程序上下文中。例如,你可以创建一个名为FilterConfig的配置类,并在其中注册MyFilter1过滤器。import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<MyFilter1> myFilter1() {
FilterRegistrationBean<MyFilter1> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter1());
registrationBean.addUrlPatterns("/*"); // 设置过滤器的URL模式
registrationBean.setOrder(1); // 设置过滤器的执行顺序
return registrationBean;
}
}
FilterConfig配置类中注册它即可。@Bean
public FilterRegistrationBean<MyFilter2> myFilter2() {
FilterRegistrationBean<MyFilter2> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter2());
registrationBean.addUrlPatterns("/*");
registrationBean.setOrder(2);
return registrationBean;
}
通过以上步骤,你可以在Spring Boot项目中添加多个过滤器,并按照指定的顺序执行它们。记得在过滤器类中实现你需要的逻辑,并在配置类中设置过滤器的URL模式和执行顺序。
FilterRegistrationBean类是Spring框架中用于注册和配置过滤器的类。它允许我们以编程方式注册和配置过滤器,而不是通过web.xml文件进行配置。
常用方法包括:
1. setFilter(Filter filter):设置要注册的过滤器实例。
2. addUrlPatterns(String... urlPatterns):设置过滤器的URL模式,用于指定过滤器要拦截的URL路径。
3. setOrder(int order):设置过滤器的执行顺序,数字越小越先执行。
4. setInitParameters(Map<String, String> initParameters):设置过滤器的初始化参数。
HttpServletRequest是ServletRequest的子接口,ServletRequest是通用接口,里面定义了与HTTP请求相关方法,包括获取请求参数、请求方法、请求头等。HttpServletRequest接口在ServletRequest的基础上,增加了一些专门处理HTTP请求的方法。
例如,客户端请求的地址是:http://www.xuexi.com/demo/test?name=luxifa&&age=25
HttpServletRequest对象的常用方法
HttpServletRequest由Servlet容器在每次接收到HTTP请求时创建,开发者无需手动创建。在Servlet的doGet()、doPost()等方法中,可以通过方法的HttpServletRequest参数获取请求的相关信息
HttpServletResponse用来封装HTTP响应的信息和操作。HttpServletResponse是ServletResponse的子接口,ServletResponse可用于处理任何类型响应,可进行获取输出流、设置相应的内容类型等操作。HttpServletResponse专门用来处理HTTP类型的响应。
一般,使用HttpServletResponse处理HTTP请求响应,使用HttpServletResponse处理其他协议的响应或自定义响应。
HttpServletResponse对象常用功能:
HttpServletResponse response;
设置响应头
设置响应状态码
设置响应内容类型
获取写字符流
获取输出流
如果响应正文内容为字符,使用response.getWriter(),如果响应内容是字节,例如下载,则使用response.getOutputStream()。
在一个请求中,不能同时使用这两个流!要么你使用repsonse.getWriter(),要么使用response.getOutputStream(),但不能同时使用,否则会抛IllegalStateException异常。
设置重定向
设置响应缓存
设置错误页面
设置Cookie
参考博客:
https://blog.csdn.net/Go_Joe/article/details/128535136
https://blog.csdn.net/hanziang1996/article/details/78967400
https://blog.csdn.net/baidu_32935221/article/details/130160185
https://blog.csdn.net/m0_37834446/article/details/81385843
https://blog.csdn.net/u013089490/article/details/83654899