首页 > 其他分享 >配置跨域和拦截器仍会显示跨域

配置跨域和拦截器仍会显示跨域

时间:2024-03-23 22:33:20浏览次数:25  
标签:拦截器 return 跨域 jwtTokenUtil request public token OPTIONS 仍会

问题复现

我的项目是前后端分离的项目,后端配置了跨域以及拦截器

跨域代码


@Configuration
public class WebConfig implements WebMvcConfigurer {
 
    @Resource
    private JwtFilter jwtFilter;
 
 
    /**
     * 不需要拦截地址
     */
    public static final String[] EXCLUDE_URLS = {
            "/userLogin/**",
            "/webjars/**",
            "/swagger-ui.html/**",
            "/swagger-resources/**",
            "/swagger-ui.html/**",
            "/favicon.ico",
            "/error",
            "/null/**",
            "/ws"
    };
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*");
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(jwtFilter)
                .addPathPatterns("/**")
                .excludePathPatterns(EXCLUDE_URLS);
 
    }


}

拦截器

@Slf4j
@Component
public class JwtFilter extends HandlerInterceptorAdapter {
 
    @Resource
    JwtTokenUtil jwtTokenUtil;
 
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("request.getRequestURI() = " + request.getRequestURI());
        //如果是OPTIONS请求的话 进行直接放行
        if (HttpMethod.OPTIONS.toString().equals(request.getMethod())){
            System.out.println("OPTIONS请求放行");
            return true;
        }
        // 获取token
        String token = request.getHeader(jwtTokenUtil.header);
        if (StringUtils.isEmpty(token)) {
            token = request.getParameter(jwtTokenUtil.header);
        }
 
        if (StringUtils.isEmpty(token)) {
            // 这里直接返回false,
            log.error("token 不能为空!");
            return false;
        }
 
        // 判断token是否超时
        if (jwtTokenUtil.isTokenExpired(token)) {
            log.error("token 已失效!");
            return false;
        }
 
        // 判断 token 是否已在黑名单
        if (jwtTokenUtil.checkBlacklist(token)) {
            log.error("token 已被加入黑名单!");
            return false;
        }
 
        // 获取用户信息
        UserTokenInfo userInfoToken = jwtTokenUtil.getUserInfoToken(token);
        // 通过用户信息去判断用户状态,等业务
        if (null != userInfoToken.getId()){
            UserContext.setUser(userInfoToken.getId());
        }
        return true;
    }
}

问题分析

前端的发送的过程实际上发送了两次请求,第一次为OPTIONS请求,第二次才GET/POST等请求
在OPTIONS请求中,不会携带请求头的参数,所以在拦截器上获取请求头为空,自定义的拦截器拦截成功:第一次请求不能通过,就不能获取第二次的请求了GET/POST

解决方法

在拦截器上放行第一次的OPTIONS请求即可。


@Slf4j
@Component
public class JwtFilter extends HandlerInterceptorAdapter {
 
    @Resource
    JwtTokenUtil jwtTokenUtil;
 
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("request.getRequestURI() = " + request.getRequestURI());
        //如果是OPTIONS请求的话 进行直接放行
        if (HttpMethod.OPTIONS.toString().equals(request.getMethod())){
            System.out.println("OPTIONS请求放行");
            return true;
        }
        // 获取token
        String token = request.getHeader(jwtTokenUtil.header);
        if (StringUtils.isEmpty(token)) {
            token = request.getParameter(jwtTokenUtil.header);
        }
 
        if (StringUtils.isEmpty(token)) {
            // 这里直接返回false,
            log.error("token 不能为空!");
            return false;
        }
 
        // 判断token是否超时
        if (jwtTokenUtil.isTokenExpired(token)) {
            log.error("token 已失效!");
            return false;
        }
 
        // 判断 token 是否已在黑名单
        if (jwtTokenUtil.checkBlacklist(token)) {
            log.error("token 已被加入黑名单!");
            return false;
        }
 
        // 获取用户信息
        UserTokenInfo userInfoToken = jwtTokenUtil.getUserInfoToken(token);
        // 通过用户信息去判断用户状态,等业务
        if (null != userInfoToken.getId()){
            UserContext.setUser(userInfoToken.getId());
        }
        return true;
    }
}

标签:拦截器,return,跨域,jwtTokenUtil,request,public,token,OPTIONS,仍会
From: https://blog.csdn.net/qq_63431773/article/details/136962060

相关文章

  • SpringMVC中的拦截器Interceptor实现
    之前的文章介绍过两个拦截器(分别参考MyBatis功能点之二(2):从责任链设计模式的角度理解插件实现技术和SpringAOP之源码分析)。本文介绍的拦截器实现与它们有何异同呢?在SpringMVC拦截器(Interceptor)使用中已知实现了HandlerInterceptor接口,MVC会自动拦截。如何实现的呢?改造......
  • .net 7 WebAPI 跨域配置(应用跨域、静态资源跨域)
    varbuilder=WebApplication.CreateBuilder(args);//Addservicestothecontainer.builder.Services.AddCors(options=>{options.AddPolicy("any",builder=>{//应用请求跨域builder.SetIsOriginAllowed(_=>true).AllowAnyO......
  • Vue中会出现哪些跨域问题?如何解决
    跨域跨域指的是在网络通信中,由于安全策略的限制,浏览器的一个文档或者脚本试图去请求另一个源(域名、协议或端口)下的资源时,会受到限制或阻止。这种情况通常发生在网页上的JavaScript发起跨域请求时。跨域请求可能会导致安全漏洞,因此浏览器通常会执行同源策略(Same-OriginPolicy),阻......
  • 跨域以及跨域配置
    1、什么跨域    首先,在前后端没有分离项目,例如jsp、php,前后台代码没有实现物理上的分离。不存在跨域问题。前后端分离后,前后端的地址域名不同,而同源策略导致浏览器会拦截a地址访问b地址请求(a地址通过浏览器访问b地址,叫跨域COSR),其中同源策略设计出于安全的考虑。前后分......
  • HandlerInterceptor - 自定义拦截器
    自定义一个类实现HandlerInterceptor接口,加上@Component注解。根据需要重写方法publicinterfaceHandlerInterceptor{defaultbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{returntrue;......
  • 什么是跨域请求,如何解决跨域请求的问题?
    在前端开发中,跨域请求是一个经常被提及的话题。了解跨域请求的概念及解决方法,是每位前端工程师必备的技能之一。本文将会深入探讨跨域请求的定义、原因以及如何解决跨域请求的问题。什么是跨域请求?跨域请求指的是在浏览器端,当前页面的域与请求目标资源的域不一致,导致浏览......
  • springboot实现拦截器
    在springboot中实现拦截器分为两步:1、创建普通拦截器,需要实现HandlerInterceptor并重写接口中相关方法;2、将上一步创建的拦截器加入到springboot配置中,配置拦截规则下面是相关代码和demo请求:定义一个普通拦截器:importorg.springframework.stereotype.Component;importorg......
  • SpringBoot添加跨域处理
    配置类实现WebMvcConfigurer接口重写addCorsMappings(CorsRegistryregistry)方法用registry对象添加映射路径、是否发送cookie、设置放行哪些原始域、放行哪行请求方法、放行哪些请求头信息、暴漏哪些请求头部信息@ConfigurationpublicclassCorsConfigimplements......
  • 如何保障跨域传文件安全的同时,有效提升业务效率?
    随着企业的快速发展,越来越多的企业在全国或全球范围内,都设立了不同的办事处和分支机构。在日常经营中,企业总部和分支机构间存在平行、垂直及互相交叉的管理模式和业务往来需求,因此会存在跨域传文件的业务场景。针对跨域传文件的场景,企业一般通过使用移动介质U盘、FTP应用,网盘等......
  • C# 12 拦截器 Interceptors
    拦截器Interceptors是一种可以在编译时以声明方式替换原有应用的方法。这种替换是通过让Interceptors声明它拦截的调用的源位置来实现的。您可以使用拦截器作为源生成器的一部分进行修改,而不是向现有源编译添加代码。 演示使用.NET8创建一个控制台应用程序。并在Property......