当前位置:   article > 正文

SpringBoot项目中拦截器的简单配置_配置interceptor

配置interceptor

一、拦截器简介

在Spring Boot项目中,拦截器(Interceptor)是指在控制器(Controller)方法处理请求之前或之后执行一些逻辑的特殊类。拦截器可以用于实现功能如日志记录、权限验证、参数校验、事务管理等。  在Spring Boot中,拦截器通常是通过注解@ControllerAdvice或@Around来定义的。@ControllerAdvice用于定义全局的异常处理和拦截器逻辑,而@Around则可以精细控制拦截器的执行顺序和逻辑。  拦截器在处理请求时,可以在控制器方法调用之前或之后执行一些逻辑,例如记录日志、验证用户权限、处理异常等。通过使用拦截器,可以将一些重复的逻辑提取出来,减少代码的冗余,提高代码的可维护性和可扩展性。

二、拦截器和过滤器的区别

在Spring Boot项目中,拦截器(Interceptor)和过滤器(Filter)都是用于在请求处理过程中执行一些额外的逻辑,但它们之间还是有一些区别的:  

1. 拦截器是Spring框架特有的概念,而过滤器是Java Servlet框架中的概念。  

2. 拦截器可以访问被拦截的方法的参数和返回值,并且可以在方法调用前和调用后执行自己的逻辑。而过滤器只能访问请求和响应的上下文对象,并且只能在请求处理前和处理后执行自己的逻辑。  

3. 拦截器的应用场景更加广泛,可以用于实现AOP编程、权限控制、数据验证等功能。而过滤器的应用场景相对较小,主要用于实现日志记录、性能统计等功能。  

4. 在Spring Boot中,拦截器的使用更加方便,通过注解方式即可实

现拦截器的配置和使用。而过滤器的使用相对较为繁琐,需要在web.xml配置文件中进行配置。  综上所述,拦截器和过滤器都有各自的应用场景和优缺点,在选择使用时需要根据具体的需求进行评估。如果需要实现的功能比较复杂或者需要与Spring框架集成更加紧密的逻辑,建议使用拦截器;如果需要实现的功能比较简单且不涉及AOP编程等高级逻辑,可以考虑使用过滤器。

三、拦截器的配置

  1. package com.sky.properties;
  2. import lombok.Data;
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. import org.springframework.stereotype.Component;
  5. @Component
  6. @ConfigurationProperties(prefix = "sky.jwt")//自动装配
  7. @Data
  8. public class JwtProperties {
  9. /**
  10. * 管理端员工生成jwt令牌相关配置
  11. */
  12. private String adminSecretKey;
  13. private long adminTtl;
  14. private String adminTokenName;
  15. /**
  16. * 用户端微信用户生成jwt令牌相关配置
  17. */
  18. private String userSecretKey;
  19. private long userTtl;
  20. private String userTokenName;
  21. }
1、新建一个拦截器
  1. package com.sky.interceptor;
  2. import com.sky.constant.JwtClaimsConstant;
  3. import com.sky.context.BaseContext;
  4. import com.sky.properties.JwtProperties;
  5. import com.sky.utils.JwtUtil;
  6. import io.jsonwebtoken.Claims;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.stereotype.Component;
  10. import org.springframework.web.method.HandlerMethod;
  11. import org.springframework.web.servlet.HandlerInterceptor;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. /**
  15. * jwt令牌校验的拦截器
  16. */
  17. @Component
  18. @Slf4j
  19. public class JwtTokenAdminInterceptor implements HandlerInterceptor {
  20. @Autowired
  21. private JwtProperties jwtProperties;
  22. /**
  23. * 校验jwt
  24. *
  25. * @param request
  26. * @param response
  27. * @param handler
  28. * @return
  29. * @throws Exception
  30. */
  31. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  32. //判断当前拦截到的是Controller的方法还是其他资源
  33. if (!(handler instanceof HandlerMethod)) {
  34. //当前拦截到的不是动态方法,直接放行
  35. return true;
  36. }
  37. //1、从请求头中获取令牌
  38. String token = request.getHeader(jwtProperties.getAdminTokenName());
  39. //2、校验令牌
  40. try {
  41. log.info("jwt校验:{}", token);
  42. Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);
  43. Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString());
  44. log.info("当前员工id:", empId);
  45. BaseContext.setCurrentId(empId);
  46. //3、通过,放行
  47. return true;
  48. } catch (Exception ex) {
  49. //4、不通过,响应401状态码
  50. response.setStatus(401);
  51. return false;
  52. }
  53. }
  54. }
2、配置拦截器
  1. package com.sky.config;
  2. import com.sky.interceptor.JwtTokenAdminInterceptor;
  3. import com.sky.interceptor.JwtTokenUserInterceptor;
  4. import com.sky.json.JacksonObjectMapper;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.http.converter.HttpMessageConverter;
  10. import org.springframework.http.converter.cbor.MappingJackson2CborHttpMessageConverter;
  11. import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
  12. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  13. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  14. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  15. import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
  16. import springfox.documentation.builders.ApiInfoBuilder;
  17. import springfox.documentation.builders.PathSelectors;
  18. import springfox.documentation.builders.RequestHandlerSelectors;
  19. import springfox.documentation.service.ApiInfo;
  20. import springfox.documentation.spi.DocumentationType;
  21. import springfox.documentation.spring.web.plugins.Docket;
  22. import java.util.List;
  23. /**
  24. * 配置类,注册web层相关组件
  25. */
  26. @Configuration
  27. @Slf4j
  28. public class WebMvcConfiguration extends WebMvcConfigurationSupport {
  29. @Autowired
  30. private JwtTokenAdminInterceptor jwtTokenAdminInterceptor;
  31. @Autowired
  32. private JwtTokenUserInterceptor jwtTokenUserInterceptor;
  33. /**
  34. * 注册自定义拦截器
  35. *
  36. * @param registry
  37. */
  38. protected void addInterceptors(InterceptorRegistry registry) {
  39. log.info("开始注册自定义拦截器...");
  40. registry.addInterceptor(jwtTokenAdminInterceptor)
  41. .addPathPatterns("/admin/**")
  42. .excludePathPatterns("/admin/employee/login");
  43. }
  44. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号