当前位置: 首页 > Web前端 > HTML5

SpringBoot实现跨域的方式一共有五种,总有一种适合你

时间:2023-04-05 01:39:06 HTML5

一、浏览器的同源策略限制为什么会出现跨域问题。同源策略(Sameoriginpolicy)是一种约定,是浏览器最核心、最基本的安全功能。如果缺少同源策略,可能会影响浏览器的正常功能。可以说Web是建立在同源策略的基础上的,而浏览器只是同源策略的一种实现。同源策略防止来自一个域的javascript脚本与来自另一个域的内容交互。所谓同源(即同域)是指两个页面具有相同的协议(protocol)、主机(host)和端口号(port)。其中任何一个与当前页面url不同,就是跨域3.非同源限制不能读取非同源网页的cookies、LocalStorage、IndexedDB,不能向非同源发送AJAX请求-origin地址4.java后端实现CORS跨域请求的方式对于CORS跨域请求,主要有以下几种方式可以选择:返回一个新的CorsFilter重写WebMvcConfigurer使用注解@CrossOrigin手动设置响应header(HttpServletResponse)自定义webFilter实现跨域注意:CorFilter/WebMvConfigurer/@CrossOrigin需要SpringMVC4.2以上版本支持,对应springBoot1.3以上版本,上面前两种方法属于全局CORS配置,后两种属于到本地CORS配置。如果使用本地跨域,会覆盖全局跨域规则,所以可以使用@CrossOrigin注解进行更细粒度的跨域资源控制。其实不管是什么方案,最终的目的都是修改响应头,添加到响应头中。添加浏览器需要的数据,然后实现最全的SpringBoot跨域系列教程在这里:https://blog.didispace.com/sp...1.返回新的CorsFilter(全局跨域)在任何配置类中,返回一个新的CorsFIlterBean,并添加映射路径和具体的CORS配置路径。@ConfigurationpublicclassGlobalCorsConfig{@BeanpublicCorsFiltercorsFilter(){//1\.添加CORS配置信息CorsConfigurationconfig=newCorsConfiguration();//允许哪些原始域config.addAllowedOrigin("*");//是否发送cookiesconfig.setAllowCredentials(true);//允许哪些请求方法config.addAllowedMethod("*");//允许哪些原始请求头信息config.addAllowedHeader("*");//暴露什么头信息config.addExposedHeader("*");//2\。添加映射路径UrlBasedCorsConfigurationSourcecorsConfigurationSource=newUrlBasedCorsConfigurationSource();corsConfigurationSource.registerCorsConfiguration("/**",config);//3\。返回新的CorsFilter返回新的CorsFilter(corsConfigurationSource);}}2。重写WebMvcConfigurer(全局跨域)@ConfigurationpublicclassCorsConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddCorsMappings(CorsRegistryregistry){registry.addMapping("/**")//是否发送Cookie.allowCredentials(true)//允许哪些原始域.allowedOrigins("*").allowedMethods(newString[]{"GET","POST","PUT","DELETE"}).allowedHeaders("*").exposedHeaders("*");}}3。使用注解(本地跨域)在控制器上(在类上)使用注解@CrossOrigin:表示该类的所有方法都允许跨域@RestController@CrossOrigin(origins="*")公共类HelloController{@RequestMapping("/hello")publicStringhello(){return"helloworld";}}在方法上使用注解@CrossOrigin:@RequestMapping("/hello")@CrossOrigin(origins="*")//@CrossOrigin(value="http://localhost:8081")//指定一个具体的ip到allowcross-domainpublicStringhello(){return"helloworld";}4.手动设置响应头(部分跨域)使用HttpServletResponse对象添加响应头(Access-Control-Allow-Origin)进行授权原始域。这里Origin的值也可以设置为“*”,表示全部允许。@RequestMapping("/index")publicStringindex(HttpServletResponseresponse){response.addHeader("Access-Allow-Control-Origin","*");返回“索引”;}5。使用自定义过滤器实际跨域首先编写一个过滤器,可以起名为:MyCorsFilter.javapackagecom.mesnac.aop;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterjavaxChain;importjavax.servlet.FilterjavaxChain;.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletResponse;importorg.springframework.stereotype.Component;@Componentpublic类MyCorsFilter实现Filter{publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)throwsIOException,ServletException{HttpServletResponseresponse=(HttpServletResponse)res;response.setHeader("Access-Control-Allow-Origin","*");response.setHeader("访问控制Allow-Methods","POST,GET,OPTIONS,DELETE");response.setHeader("Access-Control-Max-Age","3600");response.setHeader("Access-Control-Allow-Headers","x-requested-with,content-type");chain.doFilter(req,res);}publicvoidinit(FilterConfigfilterConfig){}publicvoiddestroy(){}}在web.xml中配置这个过滤器CorsFiltercom.mesnac.aop.MyCorsFilterCorsFilter/*学会了吗建议保存以备后用!