springboot跨域踩坑笔记

事情是这样的,我在进行前后端联调的时候,发送了跨域拦截

在这里插入图片描述
马上在spring项目中创建一个CorsConfig

package com.example.demo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        System.out.println("1");
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:8081")
                .allowedHeaders("*")
                .allowCredentials(true)
                .allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH");

        System.out.println("2");
    }

}


一顿操作猛如虎,结果还是不行……

原来,是我把事情想复杂了!
没仔细看看报错的内容
在这里插入图片描述

这个错误信息是浏览器中的跨域资源共享(CORS)机制的一部分,它指示在进行跨域请求时出现了问题。让我解释一下每个部分的含义:

  1. Response to preflight request:
    这部分指的是在执行实际的跨域请求之前,浏览器会发送一个预检请求(preflightrequest)以确定服务器是否允许跨域请求。这个预检请求是一种 OPTIONS 请求,包含一些头信息,以及请求的方法等信息。

  2. Doesn’t pass access control check: 这表示预检请求没有通过访问控制检查。在 CORS
    中,服务器必须设置适当的响应头来明确指示是否允许来自不同源的请求。

  3. No ‘Access-Control-Allow-Origin’ header is present on the requested
    resource: 这是错误的核心信息。它表示在预检请求的响应中,没有设置名为’Access-Control-Allow-Origin’的响应头。这个响应头用于指定允许访问该资源的源(域名)。如果该响应头不存在或不包含当前源的域名,浏览器将拒绝访问该资源。

简而言之,就是服务端需要接受这个请求,将数据返回给客户端
在过滤器添加以下代码:

servletResponse.setHeader("Access-Control-Allow-Origin", "*");

过滤器源码

package com.example.demo.filter;

import com.alibaba.fastjson.JSONObject;
import com.example.demo.entity.Result;
import com.example.demo.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest) servletRequest;
        HttpServletResponse resp=(HttpServletResponse) servletResponse;

        ((HttpServletResponse) servletResponse).setHeader("Access-Control-Allow-Origin", "*");
        ((HttpServletResponse) servletResponse).setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");;
        ((HttpServletResponse) servletResponse).setHeader("Access-Control-Allow-Headers", "AC-User-Agent, token, content-type");
        String url=req.getRequestURI().toString();
        log.info("请求url:{}",url);

        if(url.contains("login")){
            System.out.println("放行");
            log.info("放行");
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }

        String jwt=req.getHeader("token");
        if(!StringUtils.hasLength(jwt)){
            Result error=Result.error("NOT_LOGIN");
            String nologin= JSONObject.toJSONString(error);
            resp.getWriter().write(nologin);
            return;
        }

        try {
            JwtUtils.parseJWT(jwt);
        }catch (Exception e){
            e.printStackTrace();
            log.info("返回未登录信息");
            Result error=Result.error("NOT_LOGIN");
            String nologin= JSONObject.toJSONString(error);
            resp.getWriter().write(nologin);
            return;
        }

        filterChain.doFilter(servletRequest,servletResponse);

    }
}

最后,项目顺利运行!!!

springboot跨域踩坑笔记_第1张图片

你可能感兴趣的:(后端,spring,boot,笔记,后端)