Springboot整合Shiro前后端分离跨域问题

前言:SpringBoot整合shiro进行前后端分离开发时(前端是Vue),项目做了跨域配置,但还是前端请求会出现cros err–显示的跨域问题(Access-Control-Allow-Origin )。后端没有任何报错显示,逐步分析才慢慢理解。

解决:如下是我的跨域配置:
package com.carshow.data.config;import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Author xw* @Description  跨域访问控制, 做前后分离的话,这个也是必配的* @Date 2021/4/12  13:07*/
@Configuration
public class CorsConfig implements Filter {private CorsConfiguration buildConfig() {CorsConfiguration corsConfiguration = new CorsConfiguration();// 允许任何域名使用corsConfiguration.addAllowedOriginPattern("*");// 允许任何头corsConfiguration.addAllowedHeader("*");// 允许任何方法(post、get等)corsConfiguration.addAllowedMethod("*");//允许cookiecorsConfiguration.setAllowCredentials(true);// 是否支持安全证书(必需参数)corsConfiguration.setMaxAge(3600L);// 预检请求的有效期,单位为秒。corsConfiguration.addExposedHeader("set-cookie");corsConfiguration.addExposedHeader("access-control-allow-headers");corsConfiguration.addExposedHeader("access-control-allow-methods");corsConfiguration.addExposedHeader("access-control-allow-origin");corsConfiguration.addExposedHeader("access-control-max-age");corsConfiguration.addExposedHeader("X-Frame-Options");return corsConfiguration;}@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();// 对接口配置跨域设置source.registerCorsConfiguration("/**", buildConfig());return new CorsFilter(source);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin"));response.setHeader("Access-Control-Allow-Credentials", "true");response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");if ("OPTIONS".equals(request.getMethod())) {response.setStatus(HttpStatus.NO_CONTENT.value());return;} else {filterChain.doFilter(request, response);}}@Beanpublic FilterRegistrationBean replaceTokenFilter(){FilterRegistrationBean registration = new FilterRegistrationBean();registration.setDispatcherTypes(DispatcherType.REQUEST);registration.setFilter( new CorsConfig ());registration.addUrlPatterns("/*");registration.setName("crosFilter ");registration.setOrder(1);return registration;}
}

原因:浏览器会在发送真正请求之前,先发送一个方法为OPTIONS的预检请求 Preflighted requests 这个请求是用来验证本次请求是否安全的,而且并不是所有请求都会发送,需要符合以下条件:

  1. 请求方法不是GET/HEAD/POST
  2. POST请求的Content-Type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain
  3. 请求设置了自定义的header字段
后端使用了shiro安全框架,每次请求需要在header中携带自定义的字段(Authorization),所以浏览器会多发送一个OPTIONS请求,但是OPTIONS请求不会携带Authorization,后端验证不通,所以会产生跨域问题。

解决问题关键点:使用拦截器解决跨域问题,并且针对OPTIONS请求做放行处理

 @Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin"));response.setHeader("Access-Control-Allow-Credentials", "true");response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");if ("OPTIONS".equals(request.getMethod())) {response.setStatus(HttpStatus.NO_CONTENT.value());return;} else {filterChain.doFilter(request, response);}}@Beanpublic FilterRegistrationBean replaceTokenFilter(){FilterRegistrationBean registration = new FilterRegistrationBean();registration.setDispatcherTypes(DispatcherType.REQUEST);registration.setFilter( new CorsConfig ());registration.addUrlPatterns("/*");registration.setName("crosFilter ");registration.setOrder(1);return registration;}

OK!

Springboot整合Shiro前后端分离跨域问题相关推荐

  1. 前后端分离跨域问题解决方案

    问题 因为最近在学习vue和springboot.用到了前后端分离.前端webpack打包运行的时候会启动nodejs的服务器占用8080端口,后端springboot自带tomcat启动占用1111 ...

  2. pc网站调用微服务器,【微服务】前后端分离-跨域问题和解决方案

    跨域问题存在的原因 跨域问题的根本原因:因为浏览器收到同源策略的限制,当前域名的js只能读取同域下的窗口属性.什么叫做同源策略?就是不同的域名, 不同端口, 不同的协议不允许共享资源的,保障浏览器安全 ...

  3. springboot集成shiro 前后端分离 统一处理shiro异常

    springboot集成shiro 前后端分离 统一处理shiro异常 参考文章: (1)springboot集成shiro 前后端分离 统一处理shiro异常 (2)https://www.cnbl ...

  4. 【python学习笔记】关于python Flask前后端分离跨域问题

    关于python Flask前后端分离跨域问题 前后端分离过程中,前后端对接测试难免遇到跨域问题.因为是个新司机,所以在我经过一天的测试,才找到解决办法=-= 第一种方法 from functools ...

  5. shiro+php,一套基于SpringBoot+Vue+Shiro 前后端分离 开发的代码生成器

    一.前言 最近花了一个月时间完成了一套基于Spring Boot+Vue+Shiro前后端分离的代码生成器,目前项目代码已基本完成 止步传统CRUD,进阶代码优化: 该项目可根据数据库字段动态生成 c ...

  6. nginx处理前后端分离跨域问题

    在微服务中,通常会使用前后端分离的方式进行开发和部署.由于前后端分开部署,属于不同的"资源",因此前端调用后端API时可能会出现跨域问题,Cross-Origin Resource ...

  7. cors 前后端分离跨域问题_前后端分离之CORS跨域访问踩坑总结

    前言 前后端分离的开发模式越来越流行,目前绝大多数的公司与项目都采取这种方式来开发,它的好处是前端可以只专注于页面实现,而后端则主要负责接口开发,前后端分工明确,彼此职责分离,不再高度耦合,但是由于这 ...

  8. SpringBoot集成Shiro前后端分离使用redis做缓存

    文章目录 一 .shiro介绍 1.基础介绍 2.基本功能点 3.基本流程图 二. 常用的权限管理表关系 2.1. 表组成 2.2. 表结构 三.实战案例 3.1. 案例介绍 3.2. 依赖 3.3. ...

  9. 前后端分离跨域问题Access to XMLHttpRequest at ‘http://localhos...has been blocked by CORS policy: No ‘Access-

    完整报错如下: Access to XMLHttpRequest at 'http://localhost:8081/login' from origin 'http://localhost:8084 ...

最新文章

  1. 第9部分 备份与灾难恢复
  2. docker启动odoo提示module没有安装_Windows Server 2019上的Docker 入门
  3. discuz 二次开发文章
  4. 11(maven+SSH)网上商城项目实战之Freemarker 页面静态化
  5. 前端兼容性问题:快速去掉mac safari浏览器input右边的小图标/小按钮
  6. Android--Activity四种启动模式
  7. Spring Batch –使用JavaConfig替换XML作业配置
  8. java线程的5个使用技巧
  9. ViewState 与 静态变量的 区别
  10. Selenium ide及webDriver使用
  11. 2018,程序员要搭配这40条编程箴言!!!条条都是干货
  12. c++文件操作之读取全部文本文件【zz】
  13. 嵌入式单片机基础篇(十一)之电容触摸按键
  14. 史上最全的贝塞尔曲线(Bezier)全解(三):贝塞尔曲线实现满屏爱心
  15. 大神如何用油猴提升前端开发效率 ?
  16. 十部委联合发布《关于促进互联网金融健康发展的指导意见》
  17. 电容实际等效模型(容抗、感抗、品质因数Q)
  18. 裁员此起彼伏,铁饭碗在哪里?
  19. 1335:【例2-4】连通块——dfs、bfs
  20. 集成机器学习服务上架华为应用市场指南

热门文章

  1. 学习笔记2-Sisco硬件
  2. 半导体制作无尘车间环境与生产要求粒子计数器
  3. 企业为什么要做全网营销推广?
  4. iOS恢复固件的方法
  5. 王者服务器维护8月四日,8月4日体验服停机更新公告
  6. 深入了解侧扫声呐图像处理拖鱼位置估算
  7. 理光5002文件服务器出现故障,理光复印机维修中常见问题 理光复印机检修方法【图文】...
  8. CarSim软件转向系统传动比如何得到?
  9. IDEA 学生版申请简单教程
  10. 逍遥Android模拟器连接studio调试项目