手机营销型网站制作,河北省建筑培训网,北京物流网站建设,合肥 电子商务 网站建设概述 Java 过滤器是 Java EE (Jakarta EE) 中的一种组件#xff0c;用于在请求到达 Servlet 或 JSP 之前对其进行预处理#xff0c;或者在响应返回客户端之前对其进行后处理。过滤器主要应用于以下场景#xff1a;
请求参数过滤和转换字符编码处理身份验证和授权日志记录压…概述 Java 过滤器是 Java EE (Jakarta EE) 中的一种组件用于在请求到达 Servlet 或 JSP 之前对其进行预处理或者在响应返回客户端之前对其进行后处理。过滤器主要应用于以下场景
请求参数过滤和转换字符编码处理身份验证和授权日志记录压缩响应数据缓存控制
核心接口和方法
init(FilterConfig config) - 初始化过滤器doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - 执行过滤逻辑destroy() - 销毁过滤器
public class CharacterEncodingFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {}Overridepublic void destroy() {Filter.super.destroy();}
}
配置方式
过滤器可以通过以下方式配置 1.注解配置Servlet 3.0
使用WebFilter注解可以直接在过滤器类上配置过滤器无需在 web.xml 中配置。别忘了在 Spring Boot 应用主类上添加ServletComponentScan注解以启用 Servlet 组件扫描 package com.cni23.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;/*** urlPatterns 匹配所有请求/*拦截所有请求可以填写具体请求路径*/
WebFilter(urlPatterns /*,filterName CharacterEncodingFilter)
public class CharacterEncodingFilter implements Filter {private String encoding;/*** 初始化过滤器*/Overridepublic void init(FilterConfig filterConfig) throws ServletException {String encoding filterConfig.getInitParameter(encoding);if (encoding null){encoding UTF-8;}}/*** 执行过滤器逻辑*/Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//获取请求HttpServletRequest request (HttpServletRequest) servletRequest;request.setCharacterEncoding(encoding);servletResponse.setCharacterEncoding(encoding);servletResponse.setContentType(text/html;charsetutf-8);//filterChain:链//放行继续执行下一个过滤器如果没有过滤器则执行目标资源filterChain.doFilter(servletRequest,servletResponse);}/*** 销毁过滤器*/Overridepublic void destroy() {}
}2.web.xml 配置传统方式
filterfilter-nameCharacterEncodingFilter/filter-namefilter-classcom.cni23.filter.CharacterEncodingFilter/filter-class/filterfilter-mappingfilter-nameCharacterEncodingFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping 3.Java 代码配置Spring 等框架中常用
1编写过滤规则
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Enumeration;public class RequestLoggingFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化逻辑}Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest (HttpServletRequest) request;// 记录请求信息System.out.println(Request URL: httpRequest.getRequestURL());System.out.println(Method: httpRequest.getMethod());// 记录请求头EnumerationString headerNames httpRequest.getHeaderNames();while (headerNames.hasMoreElements()) {String headerName headerNames.nextElement();System.out.println(headerName : httpRequest.getHeader(headerName));}// 继续请求处理链chain.doFilter(request, response);}Overridepublic void destroy() {// 清理资源}
}
2配置我们的过滤器
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration
public class FilterConfig {Beanpublic FilterRegistrationBeanRequestLoggingFilter loggingFilter() {FilterRegistrationBeanRequestLoggingFilter registrationBean new FilterRegistrationBean();// 设置过滤器实例registrationBean.setFilter(new RequestLoggingFilter());// 设置过滤器应用的URL模式registrationBean.addUrlPatterns(/api/*, /secure/*);// 设置过滤器名称registrationBean.setName(requestLoggingFilter);// 设置过滤器执行顺序值越小优先级越高registrationBean.setOrder(1);// 添加初始化参数registrationBean.addInitParameter(enabled, true);return registrationBean;}
}
配置方式对比 注解配置 优点简洁、直观与代码在一起便于维护缺点不够灵活URL 模式等配置与代码耦合 web.xml 配置 优点集中管理配置与代码分离适合复杂场景缺点XML 文件可能变得庞大复杂难以维护 Java 代码配置 优点完全的编程控制可以使用 Spring 的依赖注入缺点需要了解 Spring 框架配置相对复杂
具体使用哪一个可以根据自己的项目来决定。