SpringBoot项目实战--Servlet、Filter、拦截器

本文介绍如何在SpringBoot项目中集成Servlet、Filter及拦截器。通过在启动类中声明Servlet并设置路径,实现自定义操作如设置和清理Cookie。同时添加全局过滤器,并配置WebMvc拦截器来增强项目的功能。

1、声明Servlet:

由于项目使用集成第三方登录认证,需要使用到servlet,则需要在springboot集成环境添加servlet,只需要在Application.java启动类中声明并注入Servlet即可,实现方式如下:

    @Bean
    public ServletRegistrationBean setCookieServlet() {
        return new ServletRegistrationBean(new SetCookieServlet(), "/setcookie");
    }
    @Bean
    public ServletRegistrationBean cleanCookieServlet() {
        return new ServletRegistrationBean(new CleanCookieServlet(), "/cleancookie");
    }
2、添加Filter:在Application.java启动类中添加以下代码

@Bean
    public FilterRegistrationBean filterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new AuthFilter());
        registration.addUrlPatterns("/*");
        registration.setName("AuthFilter");
        return registration;
    }

3、声明添加拦截器:

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private AuthInterceptor authInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        authInterceptor.setWhiteLists(Lists.newArrayList("/static/**","/error"));
        registry.addInterceptor(authInterceptor).addPathPatterns("/**").addPathPatterns("/**");//要拦截的请求
    }
}



### Spring Boot 中 JWT 功能实现 在 Spring Boot 项目中集成 JWT(JSON Web Token),可以通过自定义过滤器来验证请求中的令牌并完成身份认证。以下是基于提供的引用内容以及标准实践的解决方案。 #### 配置文件设置 首先,需要在 `application-dev.yml` 文件中配置 JWT 的密钥和其他参数: ```yaml jwt: secretKey: mySecretKey # 密钥字符串 tokenPrefix: Bearer # 前缀 headerString: Authorization # 请求头名称 ``` 上述配置项用于存储生成和解析 JWT 所需的关键信息[^1]。 --- #### 创建 JwtUtil 工具类 为了方便管理 JWT 的生成与校验,可以创建一个工具类 `JwtUtil` 来封装这些逻辑: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; public class JwtUtil { private String secretKey = "mySecretKey"; // 对应 application-dev.yml 中的 jwt.secretKey public String generateToken(String loginId) { return Jwts.builder() .setSubject(loginId) .signWith(SignatureAlgorithm.HS512, secretKey) .compact(); } public Claims extractAllClaims(String token) { return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody(); } } ``` 此工具类提供了两个核心方法:一个是生成 JWT (`generateToken`);另一个是从 JWT 提取声明 (`extractAllClaims`) [^2]。 --- #### 自定义 Filter 进行拦截 通过继承 `OncePerRequestFilter` 类来自定义过滤器,该过滤器会在每次 HTTP 请求到达控制器之前执行: ```java import org.springframework.stereotype.Component; 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 JwtFilter extends OncePerRequestFilter { @Autowired private JwtUtil jwtUtil; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { final String authorizationHeader = request.getHeader("Authorization"); String username = null; String jwt = null; if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) { jwt = authorizationHeader.substring(7); try { username = jwtUtil.extractAllClaims(jwt).getSubject(); // 获取用户名 } catch (Exception e) { logger.error("Invalid JWT token", e); } } if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, Collections.emptyList()); SecurityContextHolder.getContext().setAuthentication(authentication); // 设置当前用户的身份 } filterChain.doFilter(request, response); // 继续处理链路 } } ``` 这段代码实现了对请求头部携带的 JWT 进行解析,并将其绑定到 Spring Security 的上下文中。 --- #### 测试用例 编写单元测试以验证 JWT 的生成与解析过程是否正常工作: ```java @SpringBootTest class JwtTest { @Autowired private JwtUtil jwtUtil; @Test void testJwt() { String accessToken = jwtUtil.generateToken("admin"); System.out.println("Access Token: " + accessToken); Claims claims = jwtUtil.extractAllClaims(accessToken); log.info("Decoded Login ID: {}", claims.getSubject()); Assertions.assertEquals("admin", claims.getSubject()); // 断言解码后的主体是否匹配 } } ``` 运行以上测试案例时,会打印出加密后的访问令牌及其对应的原始登录名。 --- #### 控制器示例 最后,在实际应用中可通过如下方式暴露 API 接口供客户端调用: ```java @RestController @RequestMapping("/api/jwt") public class JwtController { @GetMapping("/testjwt") public ResponseEntity<String> testJwt(@RequestParam String loginId) { String accessToken = new JwtUtil().generateToken(loginId); return ResponseEntity.ok("Access Token Generated: " + accessToken); } } ``` 当访问路径 `/api/jwt/testjwt?loginId=admin` 时,服务器将返回由指定账户生成的 JWT 访问令牌。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值