当前位置:   article > 正文

SpringBoot跨域的三种解决方式和什么是跨域_springboot3 跨域

springboot3 跨域

目录

什么是跨域

为什么会出现跨域问题

跨域的解决方法

方法1:全局配置

方法2:局部跨域

方法3:定义跨域过滤器


什么是跨域

域的定义:协议+域名+端口。三者完全相同则为同域,反之有其一不同均为不同域。

跨域是指当前发起请求的域和请求指向的域属于不同域时,该次请求称之为跨域请求

为什么会出现跨域问题

由于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

同源策略

同源策略会阻止一个域的javascript脚本和另一个域的内容进行交互。所谓同源就是指在同一个域

非同源限制

1.无法读取非同源页面的Cookie、LocalStorage和IndexedDB

2.无法接触非同源页面的DOM

3.无法向非同源地址发送AJAX请求

其实无论哪种方案,最终目的都是修改响应头,向响应头中添加浏览器所要求的数据,进而实现跨域

跨域的解决方法

方法1:全局配置

定义配置类,添加@Configuration注解,实现WebMvcConfigurer接口,再重写addCorsMappings方法:

  1. // 请求跨域
  2. @Configuration
  3. public class CorsConfig implements WebMvcConfigurer {
  4. @Override
  5. public void addCorsMappings(CorsRegistry registry) {
  6. //添加映射路径
  7. registry.addMapping("/**")
  8. //是否发送Cookie
  9. .allowCredentials(true)
  10. //设置放行哪些原始域 SpringBoot2.4.4下低版本使用.allowedOrigins("*")
  11. .allowedOriginPatterns("*")
  12. //放行哪些请求方式
  13. .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
  14. //.allowedMethods("*") //或者放行全部
  15. //放行哪些原始请求头部信息
  16. .allowedHeaders("*")
  17. //暴露哪些原始请求头部信息
  18. .exposedHeaders("*");
  19. }
  20. }

 或者也可以返回新CorsFilter(全局跨域)

  1. @Configuration
  2. public class GlobalCorsConfig {
  3. @Bean
  4. public CorsFilter corsFilter() {
  5. //1. 添加 CORS配置信息
  6. CorsConfiguration config = new CorsConfiguration();
  7. //放行哪些原始域
  8. config.addAllowedOrigin("*");
  9. //是否发送 Cookie
  10. config.setAllowCredentials(true);
  11. //放行哪些请求方式
  12. config.addAllowedMethod("*");
  13. //放行哪些原始请求头部信息
  14. config.addAllowedHeader("*");
  15. //暴露哪些头部信息
  16. config.addExposedHeader("*");
  17. //2. 添加映射路径
  18. UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
  19. corsConfigurationSource.registerCorsConfiguration("/**",config);
  20. //3. 返回新的CorsFilter
  21. return new CorsFilter(corsConfigurationSource);
  22. }
  23. }

方法2:局部跨域

Controller层再需要跨域的类或者方法上加上@CrossOrigin该注解即可。

  1. @CrossOrigin(origins = "*",maxAge = 3600)
  2. public class UserController {
  3. final UserService userService;
  4. @GetMapping("/getOne/{id}")
  5. public User getOne(@PathVariable("id") Integer id) {
  6. return userService.getById(id);
  7. }

也可以粒度更细一点

  1. @Controller
  2. @RequestMapping("/hello")
  3. public class HelloController {
  4. @GetMapping("/")
  5. @ResponseBody
  6. //更小的解决跨域 设置只能某些地址访问
  7. @CrossOrigin(originPatterns = "http://localhost:8080")
  8. public Map<String, Object> findAll() {
  9. //返回数据
  10. return DataSchool.getStudents();
  11. }
  12. }

方法3:定义跨域过滤器

1.编写过滤器

  1. // 跨域过滤器
  2. @Component
  3. public class CORSFilter implements Filter {
  4. @Override
  5. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  6. //*号表示对所有请求都允许跨域访问
  7. HttpServletResponse res = (HttpServletResponse) response;
  8. res.addHeader("Access-Control-Allow-Credentials", "true");
  9. res.addHeader("Access-Control-Allow-Origin", "*");
  10. res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
  11. res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
  12. if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
  13. response.getWriter().println("Success");
  14. return;
  15. }
  16. chain.doFilter(request, response);
  17. }
  18. @Override
  19. public void destroy() {
  20. }
  21. @Override
  22. public void init(FilterConfig filterConfig) throws ServletException {
  23. }
  24. }

2注册过滤器

  1. @Configuration
  2. public class CorsConfig {
  3. @Bean
  4. public CorsFilter corsFilter() {
  5. CorsConfiguration corsConfiguration = new CorsConfiguration();
  6. corsConfiguration.addAllowedOrigin("*");
  7. corsConfiguration.addAllowedHeader("*");
  8. corsConfiguration.addAllowedMethod("*");
  9. corsConfiguration.setAllowCredentials(true);
  10. UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
  11. urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
  12. return new CorsFilter(urlBasedCorsConfigurationSource);
  13. }
  14. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/458811
推荐阅读
相关标签
  

闽ICP备14008679号