本文目录导读:

我为您整理了一个Java Boot过滤器的完整案例,包含常见的实现方式和应用场景。
基础过滤器实现
1 方式一:注解方式(推荐)
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter(urlPatterns = "/*", filterName = "logFilter")
public class LogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("日志过滤器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
long start = System.currentTimeMillis();
System.out.println("请求URL: " + request.getRequestURL());
System.out.println("请求Method: " + request.getMethod());
// 放行请求
filterChain.doFilter(request, response);
long end = System.currentTimeMillis();
System.out.println("请求处理时间: " + (end - start) + "ms");
}
@Override
public void destroy() {
System.out.println("日志过滤器销毁");
}
}
2 启动类添加扫描
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan // 扫描过滤器
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
方式二:Java配置方式
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<AuthFilter> authFilter() {
FilterRegistrationBean<AuthFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new AuthFilter());
registration.addUrlPatterns("/*"); // 拦截所有请求
registration.setName("authFilter");
registration.setOrder(1); // 设置执行顺序,数字越小越先执行
// 设置初始化参数
registration.addInitParameter("excludePaths", "/login,/register");
return registration;
}
@Bean
public FilterRegistrationBean<LogFilter> logFilter() {
FilterRegistrationBean<LogFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new LogFilter());
registration.addUrlPatterns("/api/*"); // 只拦截/api下的请求
registration.setName("logFilter");
registration.setOrder(2);
return registration;
}
}
实用案例:JWT认证过滤器
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import org.springframework.util.StringUtils;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter(urlPatterns = "/api/*")
public class JwtAuthFilter implements Filter {
private static final String SECRET_KEY = "your-secret-key";
private static final String[] EXCLUDE_PATHS = {"/api/login", "/api/register"};
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String path = request.getRequestURI();
// 跳过不需要认证的路径
if (isExcludedPath(path)) {
filterChain.doFilter(request, response);
return;
}
// 获取token
String token = request.getHeader("Authorization");
if (StringUtils.isEmpty(token) || !token.startsWith("Bearer ")) {
response.setStatus(401);
response.getWriter().write("{\"code\":401,\"message\":\"未授权访问\"}");
return;
}
try {
token = token.substring(7); // 去掉"Bearer "
Claims claims = Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody();
// 将用户信息存储到request中
request.setAttribute("userId", claims.get("userId"));
request.setAttribute("username", claims.get("username"));
filterChain.doFilter(request, response);
} catch (Exception e) {
response.setStatus(401);
response.getWriter().write("{\"code\":401,\"message\":\"Token无效或已过期\"}");
}
}
private boolean isExcludedPath(String path) {
for (String excludePath : EXCLUDE_PATHS) {
if (path.equals(excludePath)) {
return true;
}
}
return false;
}
}
实用案例:XSS过滤过滤器
import org.jsoup.Jsoup;
import org.jsoup.safety.Whitelist;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
@WebFilter(urlPatterns = "/*")
public class XssFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(
(HttpServletRequest) request);
chain.doFilter(xssRequest, response);
}
// 自定义Request包装器,过滤XSS
private static class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
return cleanXss(value);
}
@Override
public String[] getParameterValues(String name) {
String[] values = super.getParameterValues(name);
if (values != null) {
for (int i = 0; i < values.length; i++) {
values[i] = cleanXss(values[i]);
}
}
return values;
}
private String cleanXss(String value) {
if (value != null) {
// 使用Jsoup清理XSS
value = Jsoup.clean(value, Whitelist.basic());
// 额外处理特殊字符
value = value.replaceAll("<", "<")
.replaceAll(">", ">")
.replaceAll("\"", """);
}
return value;
}
}
}
完整配置示例
1 application.yml配置
server:
port: 8080
# 过滤器配置(可选)
filter:
auth:
exclude-paths: /login,/register,/public/**
logging:
level:
com.example.filter: DEBUG
2 使用示例的Controller
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class TestController {
@GetMapping("/user/list")
public String getUserList() {
return "用户列表数据";
}
@PostMapping("/login")
public String login(@RequestBody LoginRequest request) {
return "登录成功";
}
}
注意事项
- 执行顺序:多个过滤器时,通过Order属性控制执行顺序
- 性能影响:不要写耗时操作在过滤器中
- 异常处理:过滤器中异常需要妥善处理,否则可能返回500
- 路径匹配:urlPatterns支持通配符,如
/api/**
这个案例涵盖了过滤器的主要使用场景,您可以根据实际需求进行修改和扩展。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播