Java拦截器HandlerInterceptor重写preHandle方法时HttpServletRequest无法获取自定义请求头参数问题

问题描述

在前端vue中设置的自定义请求头参数:token在这里插入图片描述
在这里插入图片描述
控制层可以正常获取到自定义请求头参数
在这里插入图片描述
拦截器中无法获取
在这里插入图片描述
下方是拦截器代码

@Component
public class JWTInterceptor implements HandlerInterceptor {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    private AdminUserAuthRedis userAuthRedis;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("token");
        //验证token是否有效
        boolean verifyUserAuthToken = userAuthRedis.verifyUserAuthToken(token);
        if (!verifyUserAuthToken) {
            MvcCodeStatusEnum expireLogin = MvcCodeStatusEnum.EXPIRE_LOGIN;
            response.sendError(expireLogin.getCode(), expireLogin.getMessage());
            response.setStatus(expireLogin.getCode());
            return false;
        }
        //用户访问路径验证
        boolean verifyUserAccessPaths = verifyUserAccessPaths(request, token);
        if (!verifyUserAccessPaths) {
            MvcCodeStatusEnum expireLogin = MvcCodeStatusEnum.ACCESS_NO_PERMISSION;
            response.sendError(expireLogin.getCode(), expireLogin.getMessage());
            response.setStatus(expireLogin.getCode());
            return false;
        }
        return true;
    }

    /**
     * 检测用户是否有当前访问路径
     *
     * @param request 服务请求
     * @param token   用户登陆到token
     * @return 有权限则返回true
     */
    private boolean verifyUserAccessPaths(HttpServletRequest request, String token) {
        Set<String> userAccessPaths = userAuthRedis.getUserAccessPaths(token);
        if (CollectionUtils.isEmpty(userAccessPaths)) {
            logger.info("无法获取用户授权路径,请重新授权Token");
            userAuthRedis.clearLoginInfo(token);//路径验证不通过,需要重新登陆授权
            return false;
        }
        String path = request.getServletPath();
        String lowerCase = System.getProperty("os.name").toLowerCase();
//        if (lowerCase.startsWith("win")) {
//            logger.info("本地环境:{} 暂时忽略权限校验!", path);
//            return true;
//        }
        if (!StringUtils.isEmpty(path)) {
            // 去掉一层前缀后进行校验
            int index = path.indexOf("/", 1);
            if (index != -1) {
                String substring = path.substring(index + 1);
                if (substring.startsWith("ignore")) {
                    logger.info("接口路径:{} 权限校验忽略!", path);
                    return true;
                }
            }
        }
        boolean anyMatch = userAccessPaths.stream().filter(x -> !StringUtils.isEmpty(x)).anyMatch(path::endsWith);
        if (!anyMatch) logger.info("暂未授权的路径 path:{}", path);
        return anyMatch;
    }
}

解决方案

在注册拦截器配置的时候加上自定义参数名在allowedHeaders中加上token参数名,并且对OPTIONS请求放行

@Configuration
public class AccessSecurityConfig implements WebMvcConfigurer {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    private JWTInterceptor jwtInterceptor;

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowCredentials(false)
                .allowedMethods("POST", "GET", "DELETE", "PUT", "OPTIONS")
                .allowedHeaders("token")
                .allowedOrigins("*");
    }
 }

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Acmen-zym

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值