VUE+springboot跨域问题

文章描述了在前后端分离的项目中,通过axios封装处理跨域问题,但在集成JWTtoken验证时重新出现跨域错误。通过在后端添加Spring的CORS过滤器解决了问题,过滤器为每个请求添加了支持跨域的头部。当遇到预检请求失败导致的跨域问题时,通过在过滤器中特别处理OPTIONS请求解决了这一问题。

之前解决了跨域问题,通过axios的封装,后端使用@CrossOrigin解决了跨域问题,但是今天再集成jwt的token拦截时由出现了跨域问题,和原来一样,通过模拟api工具直接发起可以收到,但是直接通过前端发起就会报错。
报错内容
尝试过给拦截器增加@CrossOrigin注解,但是结果还是没用。
之前使用的前端跨域方法:

const service = axios.create({
  // 联调
  // baseURL: process.env.NODE_ENV === 'production' ? `/` : '/api',
  baseURL: "http://localhost:9003",
  headers: {
    get: {
      'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
    },
    post: {
      'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
    }
  },
  timeout: 30000,

该段代码时vue封装axios时设置的一些属性,通过该种方法,在之前实现了前端的跨域请求。
但是当我后端加入了拦截器对请求进行拦截并验证token的时候,再次出现了该问题。
这次决定从后端解决跨域问题,经过网上冲浪找了半天,又问了半天chat,最后试了下后端增加过滤器(感觉跟拦截器差别不大啊)。
首先我在工具类里面加了个过滤器

import org.springframework.stereotype.Component;

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

@Component
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With,accept, Origin");
        chain.doFilter(req, res);
    }

    @Override
    public void init(FilterConfig filterConfig) {}

    @Override
    public void destroy() {}
}

然后需要增加一个配置类去注册过滤器

import com.wyp.admin.common.CorsFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Autowired
    private CorsFilter corsFilter;

    @Bean
    public FilterRegistrationBean<CorsFilter> filterRegistrationBean() {
        FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(corsFilter);
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}

增加这两个代码之后再次前端请求可以正常接收请求。
过滤器的主要功能就是给每一个接收到的请求增加支持跨域的请求头,之后便可以实现跨域 请求。
这里过滤器的功能可能还需要修改,因为后续遇到了本来请求能通过,什么都没改突然就无法请求了,报的错还是跨域问题,报错显示it does not have a http or status.这种情况经过网上冲浪,得到原因可能是因为游览器发送给后端的预检请求没有通过,所以报了跨域问题。可以在过滤器中加入一下代码
if (OPTIONS.equals(((HttpServletRequest) request).getMethod())) { res.getWriter().println("ok"); return; }
去判断request是否是预检请求,如果是的话修改状态直接返回。修改之后可以正常发送请求。
后续如果还有问题会继续更新。

### 配置 VueSpring Boot 解决 CORS 请求 #### 局部解决方案 为了处理特定控制器或方法级别的问题,在 `Spring Boot` 的控制器类或其方法上可以使用 `@CrossOrigin` 注解。这使得能够精确控制哪些 URL 可以访问该资源。 对于 `DataController` 类,通过如下方式定义: ```java import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class DataController { @CrossOrigin(origins = "http://localhost:8080") @GetMapping("/data") public Message getData() { return new Message("这是成功的响应"); } } ``` 此代码片段展示了如何针对 `/data` 接口启用来自 `http://localhost:8080` 地址的请求[^1]。 同样地,另一个例子是在 `MyController` 中应用相同的技术来允许来自不同源 (`http://localhost:3000`) 的请求: ```java import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @CrossOrigin(origins = "http://localhost:3000") @GetMapping("/example") public String example() { return "Example Response"; } } ``` 这种方式适合于只需要为某些 API 提供支持的情况[^2]。 #### 全局配置方案 如果希望在整个应用程序范围内统一管理策略,则可以通过实现 `WebMvcConfigurer` 接口并覆盖相应的方法来进行全局配置。这种方法更加灵活且易于维护。 下面是一个简单的示例说明如何设置全局规则: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") // 或者指定具体的URL列表 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .maxAge(3600); } } ``` 这段代码实现了对所有路径开放 CORS 支持的功能,并指定了允许的操作类型以及缓存的最大时间长度[^3]。 #### 前端 Vue 开发服务器代理配置 除了服务端调整外,开发阶段还可以利用前端框架提供的工具简化调用过程。例如,在基于 Vue CLI 构建的应用程序中,可通过修改 `vue.config.js` 文件中的 `devServer.proxy` 字段创建 HTTP 代理,从而绕过浏览器的安全机制。 以下是配置样例: ```javascript module.exports = { devServer: { port: 8080, proxy: { '/api': { target: 'http://localhost:9090', changeOrigin: true, pathRewrite: {'^/api' : ''} } } } }; ``` 这里设置了当请求匹配到 `/api` 前缀时会被转发给运行在 `http://localhost:9090` 上的服务实例,同时移除原始 URI 中的前缀部分以便正确路由至后台API接口[^4]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值