Cors跨域问题:CorsFilter无效

最近在部署项目的时候遇到了从未有过的跨域问题,在更换ssl证书和域名无果后,检查CorsFilter类发现:

查阅资料发现Access-Control-Allow-Origin不支持多域名,即有效的响应头为最后一个添加的(覆盖)。可以使用通配符*作为Access-Control-Allow-Origin的值(当然这并不安全),亦或只留下生产环境的域名。

### 解决Spring Boot与Vue集成时浏览器访问返回401未授权的问题 当遇到Spring Boot与Vue集成过程中出现的`401 Unauthorized`错误时,通常意味着客户端发送的请求未能通过服务器的安全验证机制。这可能是由于多种原因引起的,包括但不限于缺少必要的认证信息、过期或无效的令牌以及不正确的权限设置。 #### 1. JWT配置检查 确保在Spring Boot应用程序中正确设置了JWT的相关属性和逻辑处理流程。具体来说: - **Token解析失败**:如果前端传递过来的token格式不对或是已经失效,则会触发此异常。因此,在服务端接收到带有Authorization头字段的HTTP请求之后,应该先尝试解码并校验该头部携带的信息是否合法有效[^2]。 - **签名密钥匹配**:用于生成和检验jwt token的一致性非常重要;任何一方使用的secret key不同都会造成验证失败的结果。所以要确认前后两端所采用的秘密字符串完全相同。 ```java // 示例代码片段显示如何定义JwtUtil工具类来进行token创建与解析工作 public class JwtUtil { private static final String SECRET_KEY = "your_secret_key"; // 应保持一致 public Claims extractAllClaims(String token){ return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody(); } } ``` #### 2. CORS策略调整 对于资源共享(CORS),默认情况下它可能会阻止来自其他名下的页面向当前API发起请求。可以通过自定义CORS过滤器允许特定源站发出预检请求(`OPTIONS`)及其他方法类型的调用来解决问题。 ```java @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("*"); config.setAllowCredentials(true); config.addAllowedHeader("*"); config.addAllowedMethod("*"); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } ``` #### 3. 安全配置优化 为了防止未经授权的操作被执行,开发者往往会启用基于角色的身份验证机制。然而有时候过于严格的规则反而会造成不必要的麻烦——比如即使用户成功登录也无法正常浏览受保护的内容。此时可以考虑适当放宽某些路径上的约束条件以便于调试期间测试功能完整性。 ```java @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/public/**").permitAll() // 对公开接口不做限制 .anyRequest().authenticated(); // 其他都需要身份验证 } ``` #### 4. 前端请求结构调整 最后还需注意的是,从前端视角出发也要保证每次AJAX调用都附带上了有效的access_token作为凭证。尤其是在刷新页面后重新加载组件的过程中容易丢失这些临时存储的数据结构。建议利用localStorage/sessionStorage持久化保存下来,并且每当构建新的axios实例前都要记得从中读取出来附加到headers里去。 ```javascript import axios from 'axios'; const instance = axios.create({ baseURL: process.env.VUE_APP_API_URL, }); instance.interceptors.request.use((config) => { const accessToken = localStorage.getItem('accessToken'); if (accessToken) { config.headers.Authorization = `Bearer ${accessToken}`; } return config; }, error => Promise.reject(error)); export default instance; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值