java中过滤器doFilterInternal和doFilter区别

在Java中,`doFilterInternal` 和 `doFilter` 是用于实现过滤器逻辑的方法,它们存在于不同的过滤器抽象类中,分别是 `OncePerRequestFilter` 和 `Filter` 接口。这两个方法的主要区别如下:

### `doFilterInternal` 方法:
- `doFilterInternal` 方法是 `OncePerRequestFilter` 类中的一个抽象方法,用于实现过滤器的具体逻辑。
- `OncePerRequestFilter` 是 Spring Framework 提供的过滤器基类,它确保该过滤器每次请求只被调用一次。
- 当编写自定义过滤器并继承 `OncePerRequestFilter` 时,需要实现 `doFilterInternal` 方法来定义过滤器的处理逻辑。

### `doFilter` 方法:
- `doFilter` 方法是 `Filter` 接口中的方法,用于实现过滤器的逻辑。
- Java Servlet API 中的过滤器必须实现 `Filter` 接口,并在其中实现 `doFilter` 方法。
- 每当有请求与过滤器关联时,Servlet 容器就会调用过滤器的 `doFilter` 方法。

### 主要区别:
- `doFilterInternal` 是 Spring 提供的用于实现过滤器逻辑的方法,通常在 Spring Web 应用中使用。
- `doFilter` 是 Java Servlet API 提供的过滤器接口中定义的方法,用于实现 Servlet 过滤器的逻辑。
- `doFilterInternal` 位于 Spring Framework 中,提供了更多的功能和灵活性,而 `doFilter` 是 Servlet API 标准的方法。

总的来说,`doFilterInternal` 适用于 Spring Web 应用中使用的过滤器,而 `doFilter` 则是标准的 Java Servlet API 中过滤器的实现方法。

### 如何将 JwtUtils 注入 Spring Boot Filter 或 Servlet Filter 中 为了在 `Filter` 过滤器中使用自定义工具类(如 `JwtUtils`),可以通过依赖注入的方式将其引入到过滤器中。以下是具体实现方式: #### 方法一:通过构造函数注入 可以创建一个继承于 `OncePerRequestFilter` 的过滤器,并利用 Spring 容器的依赖注入功能来获取 `JwtUtils` 实例。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class JwtAuthenticationFilter extends OncePerRequestFilter { private final JwtUtils jwtUtils; @Autowired public JwtAuthenticationFilter(JwtUtils jwtUtils) { this.jwtUtils = jwtUtils; } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String token = extractTokenFromRequest(request); try { if (token != null && jwtUtils.validateToken(token)) { // 如果令牌有效,则设置认证信息或其他逻辑处理 setAuthenticationContext(jwtUtils.parseClaims(token), request); } } catch (Exception e) { // 处理异常情况,例如无效令牌或过期令牌 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return; } chain.doFilter(request, response); } private String extractTokenFromRequest(HttpServletRequest request) { String bearerToken = request.getHeader("Authorization"); if (bearerToken != null && bearerToken.startsWith("Bearer ")) { return bearerToken.substring(7); } return null; } private void setAuthenticationContext(String claims, HttpServletRequest request) { // 设置上下文中用户的认证信息 request.setAttribute("claims", claims); } } ``` 上述代码展示了如何通过构造函数注入 `JwtUtils` 到过滤器中[^1]。这种方式充分利用了 Spring 的 IoC 容器特性,使得 `JwtUtils` 可以被自动实例化并传递给过滤器。 --- #### 方法二:手动注册过滤器并通过 Bean 获取 如果需要手动注册过滤器,可以在 `@Configuration` 类中完成过滤器的初始化工作,并显式地将 `JwtUtils` 注入其中。 ```java import org.springframework.context.annotation.Bean; import org.springframework.core.Ordered; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.stereotype.Component; import org.springframework.boot.web.servlet.FilterRegistrationBean; @Bean public FilterRegistrationBean<JwtAuthenticationFilter> jwtFilterRegistrationBean(JwtUtils jwtUtils) { JwtAuthenticationFilter filter = new JwtAuthenticationFilter(jwtUtils); FilterRegistrationBean<JwtAuthenticationFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(filter); registrationBean.addUrlPatterns("/api/*"); // 自定义拦截路径 registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 确保优先级最高 return registrationBean; } ``` 此方法适用于更复杂的场景,尤其是当需要动态调整过滤器行为时[^2]。 --- #### Maven 依赖配置 确保项目中已正确添加 JWT 相关的 Maven 依赖项,以便支持 `JwtUtils` 其他相关组件的功能。 ```xml <!-- JWT 令牌 --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> ``` 以上依赖会提供必要的库文件,从而允许开发人员编写解析 JSON Web Tokens (JWT)[^3]。 --- ### 总结 通过上述两种方法之一,即可成功将 `JwtUtils` 工具类注入到 Spring Boot 的过滤器中。推荐使用 **方法一**,因为它更加简洁且完全遵循 Spring 的设计模式;而 **方法二** 更适合那些需要高度定制化的场景。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值