springboot解决跨域问题的案例

  介绍

springboot解决跨域问题的案例?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!

<强>一、什么是跨域HTTP请求

现代浏览器出于安全的考虑,使用XMLHttpRequest对象发起HTTP请求时必须遵守同源策略,否则就是跨域的HTTP请求,默认情况下是被禁止的。跨域HTTP请求是指一个域上资源请求了B域上的资源,举例而言,部署在一个机器上Nginx上的js代码通过ajax请求了部署在B机器Tomcat上的RESTful接口。(推荐:Java视频教程)

IP(域名)不同,或者端口不同,都会造成跨域问题。为了解决跨域的问题,曾经出现过jsonp,代理文件等方案,应用场景受限,维护成本高,直到HTML5带来了歌珥协议。

歌珥是一个W3C标准,全称是“跨域资源共享”(跨源资源共享),允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了ajax只能同源使用的限制。它通过服务器增加一个特殊的头(Access-Control-Allow-Origin)来告诉客户端跨域的限制,如果浏览器支持歌珥,并且判断源通过的话,就会允许XMLHttpRequest发起跨域请求。

横常见头

Access-Control-Allow-Origin: http://somehost.com表示允许http://somehost.com发起跨域请求。
Access-Control-Max-Age: 86400表示在86400秒内不需要再发送预校验请求。
Access-Control-Allow-Methods: GET、POST,说,删除表示允许跨域请求的方法。
Access-Control-Allow-Headers:内容类型表示允许跨域请求包含内容类型

<强>二,歌珥实现跨域访问

授权方式
方式1:返回新的CorsFilter
方式2:重写WebMvcConfigurer
方式3:使用注解(@CrossOrigin)
方式4:手工设置响应头(HttpServletResponse)

注:方式1和方式2属于全局歌珥配置,方式3和方式4属于局部歌珥配置。如果使用了局部跨域是会覆盖全局跨域的规则,所以可以通过@CrossOrigin注解来进行细粒度更高的跨域资源控制。

1。返回新的CorsFilter(全局跨域)

包com.hehe.yyweb.config;      @ configuration   公开课GlobalCorsConfig {   @ bean   公共CorsFilter CorsFilter () {//1 .添加歌珥配置信息   CorsConfiguration配置=new CorsConfiguration ();//放行哪些原始域   config.addAllowedOrigin (“*”);//是否发送饼干信息   config.setAllowCredentials(真正的);//放行哪些原始域(请求方式)   config.addAllowedMethod (“*”);//放行哪些原始域(头部信息)   config.addAllowedHeader (“*”);//暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)   config.addExposedHeader (“*”);//2 .添加映射路径   UrlBasedCorsConfigurationSource configSource=new UrlBasedCorsConfigurationSource ();   configSource.registerCorsConfiguration(“/* *”,配置);//3 .返回新的CorsFilter。   返回新CorsFilter (configSource);   }   }

<强> 2。重写WebMvcConfigurer(全局跨域)

任意配置类,返回一个新的WebMvcConfigurer Bean,并重写其提供的跨域请求处理的接口,目的是添加映射路径和具体的歌珥配置信息。

包com.hehe.yyweb.config;      @ configuration   公开课GlobalCorsConfig {   @ bean   公共WebMvcConfigurer corsConfigurer () {   返回新WebMvcConfigurer () {   @Override//重写父类提供的跨域请求处理的接口   公共空间addCorsMappings (CorsRegistry注册表){//添加映射路径   registry.addMapping (“/* *”)//放行哪些原始域   .allowedOrigins (“*”)//是否发送饼干信息   .allowCredentials(真正的)//放行哪些原始域(请求方式)   .allowedMethods (“GET",“POST",“PUT",“DELETE")//放行哪些原始域(头部信息)   .allowedHeaders (“*”)//暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)   .exposedHeaders (“Header1",“Header2");   }   };   }   }

3。使用注解(局部跨域)

在方法上(@RequestMapping)使用注解@CrossOrigin:

@RequestMapping (“/hello")   @ResponseBody   @CrossOrigin (“http://localhost: 8080“)   公共字符串索引(){   返回“你好World";   }

或者在控制器(@ controller)上使用注解@CrossOrigin:

@ controller   @CrossOrigin(起源=癶ttp://xx-domain.com" maxAge=3600)   公开课AccountController {      @RequestMapping (“/hello")   @ResponseBody   公共字符串索引(){   返回“你好World";   }   李}

springboot解决跨域问题的案例