本篇文章给大家带来的内容是关于springboot跨域的介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
前言:公司的springboot项目出于某种原因,经常样处理一些跨域请求。
一。以前通过查阅相关资料自己写的一个处理跨域的类,如下。
1.1首先定义一个filter(拦截所有请求,包括跨域请求)
public class crossdomainfilter implements filter { @override public void dofilter(servletrequest request, servletresponse response, filterchain chain) throws ioexception, servletexception { httpservletrequest hreq = (httpservletrequest) request; // httpservletresponse hresp = (httpservletresponse) response; //跨域 hresp.setheader("access-control-allow-origin", "*"); //设置相应头 //跨域 header hresp.setheader("access-control-allow-methods", "*"); hresp.setheader("access-control-allow-headers", "content-type,xfilename,xfilecategory,xfilesize,x-requested-with,requesttype"); //header('access-control-allow-headers:x-requested-with,content-type,requesttype'); // 浏览器是会先发一次options请求,如果请求通过,则继续发送正式的post请求 // 配置options的请求返回 if (hreq.getmethod().equals("options")) { //如果发现该请求为option,则直接返回(不需要进入系统),并且设置相应信息 hresp.setstatus(200); // hresp.setcontentlength(0); hresp.getwriter().write("options returns ok"); return; } // filter 只是链式处理,请求依然转发到目的地址。 chain.dofilter(request, response); }}
1.2 注册一个配置类(configuration),把上面定义的filter类注册到上下文环境中
@configurationpublic class webconfiguration { @bean public remoteipfilter remoteipfilter() { return new remoteipfilter(); } @bean public filterregistrationbean<crossdomainfilter> testfilterregistration() { filterregistrationbean<crossdomainfilter> registration = new filterregistrationbean<crossdomainfilter>(); registration.setfilter(new crossdomainfilter()); registration.addurlpatterns("/*"); registration.addinitparameter("paramname", "paramvalue"); registration.setname("myfilter"); registration.setorder(1); return registration; }}
备注:这个配置类主要解决我们编写的filter(crossdomainfilter )拦截那些请求
二. springboot自己的解决跨域的filter(corsfilter) ,该filter的源码很简单,可直接查看还类的dofilterinternal() 方法,因为该发法在dofilter()方法中会调用(可以理解就是filter的dofilter()方法)。
处理过程也是接受到option方法并相应200并返回。
@configuration@enableautoconfigurationpublic class crossoriginconfig { @bean public corsfilter corsfilter() { final urlbasedcorsconfigurationsource urlbasedcorsconfigurationsource = new urlbasedcorsconfigurationsource(); final corsconfiguration corsconfiguration = new corsconfiguration(); corsconfiguration.setallowcredentials(true); // 设置你要允许的网站域名,如果全允许则设为 * corsconfiguration.addallowedorigin("*"); // 如果要限制 header 或 method 请自行更改 corsconfiguration.addallowedheader("*"); corsconfiguration.addallowedmethod("*"); urlbasedcorsconfigurationsource.registercorsconfiguration("/**", corsconfiguration); system.out.println("confi init"); return new corsfilter(urlbasedcorsconfigurationsource); }}
三:个人对跨域问题的小结
浏览器在发送请求之前,最先检测到跨域问题,并在发送跨域请求之前先发送了一个类型为options的请求(请求地址不变,并且请求头上携带了一些其他信息),该请求必须得到服务器响应(请查crossdomainfilter ),如果该请求没有得到响应,则浏览器不会发送真正的请求了。
3.1 :浏览器发送的option请求(试探性的请求)
备注: 有图我们发现请求地址不变(),请求方法为option,并且请求头中携带了一些信息该信息可以表明我是一个跨域请求,并且请求的方式是post。。
3.2 :服务器需要对该请求做出相应,(请查crossdomainfilter )
1)首先设置相应相应头(告诉浏览器我支持的跨域请求的一些信息)
2) 设置相应状态为200,并且返回数据(任意数据)
3.3 :浏览器获得到了option请求的相应(服务器接受跨域),故放心发送真正的请求,如下
1)对比option请求,请求地址没变^_^
2)对比请求方式该请求为post. 并且post请求在optin中已经告诉服务器了(access-control-request-method)。
3)对比option请求的头,该请求并没有access-control-allow-****的相关参数。
以上就是springboot跨域的介绍(代码示例)的详细内容。