如何配置前端如何解决跨域问题的问题

js跨域问题浅析及解决方法优缺点对比
投稿:hebedich
字体:[ ] 类型:转载 时间:
所谓js跨域问题,是指在一个域下的页面中通过js访问另一个不同域下 的数据对象,出于安全性考 虑,几乎所有浏览器都不允许这种跨域访问,这就导致在一些ajax应用中,使用跨域的web service会成为一个问题。 要解决跨域的问题,就是本文我们需要探讨的了
什么是跨域?
概念:只要协议、域名、端口有任何一个不同,都被当作是不同的域。
URL&&&&&&&&&&&&&&&&&&&&& 说明&&&&&& 是否允许通信
同一域名下 允许
同一域名下不同文件夹 允许
同一域名,不同端口 不允许
同一域名,不同协议 不允许
域名和域名对应ip 不允许
主域相同,子域不同 不允许
同一域名,不同二级域名(同上) 不允许(cookie这种情况下也不允许访问)
不同域名 不允许
对于端口和协议的不同,只能通过后台来解决。
跨域资源共享(CORS)
CROS(Cross-Origin Resource Sharing)跨域资源共享,定义了必须在访问跨域资源时,浏览器与服务器应该如何沟通。CROS背后的基本思想就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是失败。
&script type="text/javascript"&
&&& var xhr = new XMLHttpRequest();
&&& xhr.open("GET", "/trigkit4",true);
&&& xhr.send();
以上的trigkit4是相对路径,如果我们要使用CORS,相关Ajax代码可能如下所示:
&script type="text/javascript"&
&&& var xhr = new XMLHttpRequest();
&&& xhr.open("GET", ");
&&& xhr.send();
代码与之前的区别就在于相对路径换成了其他域的绝对路径,也就是你要跨域访问的接口地址。
服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。
要解决跨域的问题,我们可以使用以下几种方法:
通过jsonp跨域
现在问题来了?什么是jsonp?维基百科的定义是:JSONP(JSON with Padding)是资料格式 JSON 的一种“使用模式”,可以让网页从别的网域要资料。
JSONP也叫填充式JSON,是应用JSON的一种新方法,只不过是被包含在函数调用中的JSON,例如:
callback({"name","trigkit4"});
JSONP由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数,而数据就是传入回调函数中的JSON数据。
在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的。但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的。 例如:
&script type="text/javascript"&
&&& function dosomething(jsondata){
&&&&&&& //处理获得的json数据
&script src="&
js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入。所以jsonp是需要服务器端的页面进行相应的配合的。
$callback = $_GET['callback'];//得到回调函数名
$data = array('a','b','c');//要返回的数据
echo $callback.'('.json_encode($data).')';//输出
最终,输出结果为:dosomething(['a','b','c']);
如果你的页面使用jquery,那么通过它封装的方法就能很方便的来进行jsonp操作了。
&script type="text/javascript"&
&&& $.getJSON('/data.php?callback=?,function(jsondata)'){
&&&&&&& //处理获得的json数据
jquery会自动生成一个全局函数来替换callback=?中的问号,之后获取到数据后又会自动销毁,实际上就是起一个临时代理函数的作用。$.getJSON方法会自动判断是否跨域,不跨域的话,就调用普通的ajax方法;跨域的话,则会以异步加载js文件的形式来调用jsonp的回调函数。
JSONP的优缺点
JSONP的优点是:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持;并且在请求完毕后可以通过调用callback的方式回传结果。
JSONP的缺点则是:它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。
CROS和JSONP对比
CORS与JSONP相比,无疑更为先进、方便和可靠。
&&& 1、 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。
&&& 2、 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。
&&& 3、 JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS)。
通过修改document.domain来跨子域
浏览器都有一个同源策略,其限制之一就是第一种方法中我们说的不能通过ajax的方法去请求不同源中的文档。 它的第二个限制是浏览器中不同域的框架之间是不能进行js的交互操作的。
不同的框架之间是可以获取window对象的,但却无法获取相应的属性和方法。比如,有一个页面,它的地址是 , 在这个页面里面有一个iframe,它的src是, 很显然,这个页面与它里面的iframe框架是不同域的,所以我们是无法通过在页面中书写js代码来获取iframe中的东西的:
&script type="text/javascript"&
&&& function test(){
&&&&&&& var iframe = document.getElementById('ifame');
&&&&&&& var win = document.contentW//可以获取到iframe里的window对象,但该window对象的属性和方法几乎是不可用的
&&&&&&& var doc = win.//这里获取不到iframe里的document对象
&&&&&&& var name = win.//这里同样获取不到window对象的name属性
&iframe id = "iframe" src="" onload = "test()"&&/iframe&
这个时候,document.domain就可以派上用场了,我们只要把 和 这两个页面的document.domain都设成相同的域名就可以了。但要注意的是,document.domain的设置是有限制的,我们只能把document.domain设置成自身或更高一级的父域,且主域必须相同。
中设置document.domain:
&iframe id = "iframe" src="" onload = "test()"&&/iframe&
&script type="text/javascript"&
&&& document.domain = '';//设置成主域
&&& function test(){
&&&&&&& alert(document.getElementById('iframe').contentWindow);//contentWindow 可取得子窗口的 window 对象
中也设置document.domain:
&script type="text/javascript"&
&&& document.domain = '';//在iframe载入这个页面也设置document.domain,使之与主页面的document.domain相同
修改document.domain的方法只适用于不同子域的框架间的交互。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具同domain(或ip),同端口,同协议视为同一个域,一个域内的脚本仅仅具有本域内的权限,可以理解为本域脚本只能读写本域内的资源,而无法访问其它域的资源。这种安全限制称为同源策略。
出于安全考虑,HTML的同源策略不允许JavaScript进行跨域操作, 直接发送跨域 AJAX 会得到如下错误:
XMLHttpRequest cannot load http://b.com. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://a.com' is therefore not allowed access.
随着Web App的功能越来越强 各种跨域的需求催生了无数的跨域手法。甚至在HTML5标准中都给出了官方的跨域方法, 也是最近应付面试的需要,拿一篇文章来总结既有的各种跨域手段。
这些跨域通信的方法大致可以分为两类:
一类是Hack,比如通过title, navigation等对象传递信息,JSONP可以说是一个最优秀的Hack。
另一类是HTML5支持,一个是Access-Control-Allow-Origin响应头,一个是window.postMessage。
设置 document.domain
原理:相同主域名不同子域名下的页面,可以设置document.domain让它们同域
限制:同域document提供的是页面间的互操作,需要载入iframe页面
下面几个域名下的页面都是可以通过document.domain跨域互操作的: , , 。 但只能以页面嵌套的方式来进行页面互操作,比如常见的iframe方式就可以完成页面嵌套:
// URL http://a.com/foo
var ifr = document.createElement('iframe');
ifr.src = '/bar';
ifr.onload = function(){
var ifrdoc = ifr.contentDocument || ifr.contentWindow.
ifrdoc.getElementsById("foo").innerHTML);
ifr.style.display = 'none';
document.body.appendChild(ifr);
上述代码所在的URL是http://a.com/foo,它对/bar的DOM访问要求后者将 document.domain往上设置一级:
// URL /bar
document.domain = 'a.com'
document.domain只能从子域设置到主域,往下设置以及往其他域名设置都是不允许的, 在Chrome中给出的错误是这样的:
Uncaught DOMException: Failed to set the 'domain' property on 'Document': '' is not a suffix of ''
有src的标签
原理:所有具有src属性的HTML标签都是可以跨域的,包括&img&, &script&
限制:需要创建一个DOM对象,只能用于GET方法
在document.body中append一个具有src属性的HTML标签, src属性值指向的URL会以GET方法被访问,该访问是可以跨域的。
其实样式表的标签也是可以跨域的,只要是有src或href的HTML标签都有跨域的能力。
不同的HTML标签发送HTTP请求的时机不同,例如在更改src属性时就会发送请求,而script, iframe, link[rel=stylesheet]只有在添加到DOM树之后才会发送HTTP请求:
var img = new Image();
img.src = 'http://some/picture';
// 发送HTTP请求
var ifr = $('&iframe&', {src: '/bar'});
$('body').append(ifr);
// 发送HTTP请求
原理:&script&是可以跨域的,而且在跨域脚本中可以直接回调当前脚本的函数。
限制:需要创建一个DOM对象并且添加到DOM树,只能用于GET方法
JSONP利用的是&script&可以跨域的特性,跨域URL返回的脚本不仅包含数据,还包含一个回调:
// URL: /foo
var data = {
foo: 'bar',
bar: 'foo'
callback(data);
该例子只用于示例,实际情况应当考虑名称隐藏等问题。
然后在我们在主站http://a.com中,可以这样来跨域获取的数据:
// URL: http://a.com/foo
var callback = function(data){
// 处理跨域请求得到的数据
var script = $('&script&', {src: '/bar'});
$('body').append(script);
其实jQuery已经封装了JSONP的使用,我们可以这样来:
$.getJSON( "/bar?callback=callback", function( data ){
// 处理跨域请求得到的数据
$.getJSON与$.get的区别是前者会把responseText转换为JSON,而且当URL具有callback参数时, jQuery将会把它解释为一个JSONP请求,创建一个&script&
和所有依赖于创建HTML标签的方式一样,JSONP也不支持POST,而GET的数据是放在URL里的。一般来讲URL限长是在2000字符左右。
在如何理解HTTP响应的状态码?一文中有更多关于HTTP响应状态码的讨论。
原理:iframe之间是共享navigator对象的,用它来传递信息
要求:IE6/7
有些人注意到了IE6/7的一个漏洞:iframe之间的window.navigator对象是共享的。 我们可以把它作为一个Messenger,通过它来传递信息。比如一个简单的委托:
navigation.onData(){
// 数据到达的处理函数
typeof navigation.getData === 'function'
|| navigation.getData()
navigation.getData = function(){
$.get('/path/')
.success(function(data){
typeof navigation.onData === 'function'
|| navigation.onData(data)
与document.navigator类似,window.name也是当前窗口所有页面所共享的。也可以用它来传递信息。 同样蛋疼的办法还有传递Hash(有些人叫锚点),这是因为每次浏览器打开一个URL时,URL后面的#xxx部分会保留下来,那么新的页面可以从这里获得上一个页面的数据。
跨域资源共享(CORS)
原理:服务器设置Access-Control-Allow-OriginHTTP响应头之后,浏览器将会允许跨域请求
限制:浏览器需要支持HTML5,可以支持POST,PUT等方法
前面提到的跨域手段都是某种意义上的Hack, HTML5标准中提出的跨域资源共享(Cross Origin Resource Share,CORS)才是正道。 它支持其他的HTTP方法如PUT, POST等,可以从本质上解决跨域问题。
例如,从http://a.com要访问http://b.com的数据,通常情况下Chrome会因跨域请求而报错:
XMLHttpRequest cannot load http://b.com. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://a.com' is therefore not allowed access.
错误原因是被请求资源没有设置Access-Control-Allow-Origin,所以我们在b.com的服务器中设置这个响应头字段即可:
Access-Control-Allow-Origin: *
# 允许所有域名访问,或者
Access-Control-Allow-Origin: http://a.com
# 只允许XXX域名访问
为 xhr 设置 withCredentials 后 CORS 方法跨域还可 携带Cookie,但 PUT/POST 请求需要注意处理 preflight 请求。
window.postMessage
原理:HTML5允许窗口之间发送消息
限制:浏览器需要支持HTML5,获取窗口句柄后才能相互通信
这是一个安全的跨域通信方法,postMessage(message,targetOrigin)也是HTML5引入的特性。
可以给任何一个window发送消息,不论是否同源。第二个参数可以是*但如果你设置了一个URL但不相符,那么该事件不会被分发。看一个普通的使用方式吧:
// URL: http://a.com/foo
var win = window.open('http://b.com/bar');
win.postMessage('Hello, bar!', 'http://b.com');
// URL: http://b.com/bar
window.addEventListener('message',function(event) {
console.log(event.data);
注意IE8及小于IE8的版本不支持addEventListener,需要使用attachEvent来监听事件。 参见:事件处理中的this:attachEvent, addEventListener, onclick
访问控制安全的讨论
在HTML5之前,JSONP已经成为跨域的事实标准了,jQuery都给出了支持。 值得注意的是它只是Hack,并没有产生额外的安全问题。 因为JSONP要成功获取数据,需要跨域资源所在服务器的配合,比如资源所在服务器需要自愿地回调一个合适的函数,所以服务器仍然有能力控制资源的跨域访问。
跨域的正道还是要使用HTML5提供的CORS头字段以及window.postMessage, 可以支持POST, PUT等HTTP方法,从机制上解决跨域问题。 值得注意的是Access-Control-Allow-Origin头字段是资源所在服务器设置的, 访问控制的责任仍然是在提供资源的服务器一方,这和JSONP是一样的。
阅读(...) 评论()浏览器跨域访问解决方案
15713次浏览
跨域的概念
跨域大家都知道,不同地址,不同端口,不同级别,不同协议都会构成跨域。例如:和都会构成跨域。总结起来只要协议、域名、端口有任何一个不同,都被当作是不同的域。下面举例,每两个一组。
是否允许通信
同一域名下
/script/b.js 同一域名下不同文件夹 允许
:8000/a.js
同一域名,不同端口
/b.js 同一域名,不同协议 不允许
http://60.32.92.74/b.js 域名和域名对应ip 不允许
/b.js 主域相同,子域不同 不允许
/b.js 同一域名,不同二级域名(同上) 不允许(cookie这种情况下也不允许访问)
/b.js 不同域名 不允许
解决跨域的方案
上一篇文章,我写了,是一种跨域的解决方案。今天再介绍几个。
CORS跨域资源共享
众所周知,我们之前跨域很多时候用的是jsonp的方式,jsonp的方式我后面介绍。下面说说CORS跨域和jsonp跨域的优势:
CORS与JSONP相比,无疑更为先进、方便和可靠。
1、 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。
2、 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。
3、 JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS。[低版本IE7以下不支持,要支持IE7还是要用jsonp方式]
CORS的使用
CORS要前后端同时做配置。
1、首先我们来看前端。
纯js的ajax请求。
&script type=&text/javascript&&
var xhr = new XMLHttpRequest(); //ie6以下用new ActiveXObject(&Microsoft.XMLHTTP&);可以做能力判断。
xhr.open(&?GET&, &/haorooms&,true);
xhr.send();
以上的haorooms是相对路径,如果我们要使用CORS,相关Ajax代码可能如下所示:
&script type=&text/javascript&&
var xhr = new XMLHttpRequest();//ie6以下用new ActiveXObject(&Microsoft.XMLHTTP&);可以做能力判断。
xhr.open(&?GET&, &/CORS&,true);
xhr.send();
当然,你也可以用jquery的ajax进行。
2、后端或者服务器端的配置
下面我们主要介绍Apache和PHP里的设置方法。
Apache:Apache需要使用mod_headers模块来激活HTTP头的设置,它默认是激活的。你只需要在Apache配置文件的
& Directory &, & Location&, & Files &或& VirtualHost&的配置里加入以下内容即可:
Header set Access-Control-Allow-Origin *
PHP:只需要使用如下的代码设置即可。
header(&Access-Control-Allow-Origin:*&);
以上的配置的含义是允许任何域发起的请求都可以获取当前服务器的数据。当然,这样有很大的危险性,恶意站点可能通过XSS攻击我们的服务器。所以我们应该尽量有针对性的对限制安全的来源,例如下面的设置使得只有这个域才能跨域访问服务器的API。
Access-Control-Allow-Origin:
通过jsonp跨域
jsonp跨域也需要前后端配合使用。一般后端设置callback ,前端给后台接口中传一个callback 就可以。
例如前端代码:
&script type=&text/javascript&&
function dosomething(jsondata){
//处理获得的json数据
&script src=&/data.php?callback=dosomething&&&/script&
后台代码:
$callback = $_GET['callback'];//得到回调函数名
$data = array('a','b','c');//要返回的数据
echo $callback.'('.json_encode($data).')';//输出
假如你用ajax方式进行jsonp跨域,我之前的一篇文章中提及过:
//简写形式,效果相同
$.getJSON(&url跨域地址&,
{参数,要把callback作为参数传到后端},
function(data){
//结构处理
},&jsonp&);
type : &get&,
url : &跨域地址&,
dataType : &jsonp&,//数据类型为jsonp
jsonp: &callback&,//服务端用于接收callback调用的function名的参数【后台接受什么参数,我们就传什么参数】我们上面设置是callback
success : function(data){
//结果处理
error:function(data){
console.log(data);
通过修改document.domain来跨子域
我们只需要在跨域的两个页面中设置document.domain就可以了。修改document.domain的方法只适用于不同子域的框架间的交互。
例如:1.在页面 http:// /a.html
中设置document.domain
&iframe id = &iframe& src=&/b.html& onload = &test()&&&/iframe&
&script type=&text/javascript&&
document.domain = &#';//设置成主域
function test(){
alert(document.getElementById('?iframe').contentWindow);//contentWindow 可取得子窗口的 window 对象
2、在页面http:// /b.html
中设置document.domain
&script type=&text/javascript&&
document.domain = &#';//在iframe载入这个页面也设置document.domain,使之与主页面的document.domain相同
使用window.name来进行跨域
window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的。
假如有三个页面。
</app.html:应用页面。
a.com/proxy.html:代理文件,一般是一个没有任何内容的html文件,需要和应用页面在同一域下。
b.com/data.html:应用页面需要获取数据的页面,可称为数据页面。
1、在应用页面(a.com/app.html)中创建一个iframe,把其src指向数据页面(b.com/data.html)。
数据页面会把数据附加到这个iframe的window.name上,data.html代码如下:
&script type=&text/javascript&&
window.name = &#39;I was there!&#39;;
// 这里是要传输的数据,大小一般为2M,IE和firefox下可以大至32M左右
// 数据格式可以自定义,如json、字符串
2、在应用页面(a.com/app.html)中监听iframe的onload事件,在此事件中设置这个iframe的src指向本地域的代理文件(代理文件和应用页面在同一域下,所以可以相互通信)。
app.html部分代码如下:
&script type=&text/javascript&&
var state = 0,
iframe = document.createElement(&#39;iframe&#39;),
loadfn = function() {
if (state === 1) {
var data = iframe.contentWindow.
// 读取数据
alert(data);
//弹出&#39;I was there!&#39;
} else if (state === 0) {
state = 1;
iframe.contentWindow.location = &http://a.com/proxy.html&;
// 设置的代理文件
iframe.src = &#39;http://b.com/data.html&#39;;
if (iframe.attachEvent) {
iframe.attachEvent(&#39;onload&#39;, loadfn);
iframe.onload
document.body.appendChild(iframe);
3、获取数据以后销毁这个iframe,释放内存;这也保证了安全(不被其他域frame js访问)。
&script type=&text/javascript&&
iframe.contentWindow.document.write(&#39;&#39;);
iframe.contentWindow.close();
document.body.removeChild(iframe);
使用HTML5的window.postMessage方法跨域
具体请看上一篇博客:
相关文章:
关键词搜索16:04 提问
求可以解决cors 跨域的方法!!!
尝试过很多种cors,可是都不行。
加过filter,在filter里面设置各种header。不行!
在web.xml里面加过corsfilter和引入jar包。不行!
用Springboot的,加CorsConfig的,在里面加标签的,设置的。不行!
结果还是没解决这个跨域的问题,纠结好久了~
有没有哪位大神亲身试过用cors的,并成功解决跨域问题,求帮助!!!
(希望可以给出比较具体代码或思路,谢谢!)
按赞数排序
如果不考虑IE8和IE8以下版本,那么在 web.xml里面加过corsfilter和引入jar包 ,是个很不错的选择 。
我的配置 :
cors filter begin 利用请求头处理跨域问题,不支持IE8及以下版本--&CORScom.thetransactioncompany.cors.CORSFiltercors.allowOrigincors.supportedMethodsGET, POST, HEAD, PUT, DELETEcors.supportedHeadersAccept, Origin, X-Requested-With, Content-Type, Last-Modifiedcors.exposedHeadersSet-Cookiecors.supportsCredentialstrueCORS/
同时,在请求端 ,你需要添加参数 crossDomain:true; 而且访问需要加入http请求头。 如下
cors filter begin 利用请求头处理跨域问题,不支持IE8及以下版本--&
&filter-name&CORS&/filter-name&
&filter-class&com.thetransactioncompany.cors.CORSFilter&/filter-class&
&init-param&
&param-name&cors.allowOrigin&/param-name&
&param-value&*&/param-value&
&/init-param&
&init-param&
&param-name&cors.supportedMethods&/param-name&
&param-value&GET, POST, HEAD, PUT, DELETE&/param-value&
&/init-param&
&init-param&
&param-name&cors.supportedHeaders&/param-name&
&param-value&Accept, Origin, X-Requested-With, Content-Type, Last-Modified&/param-value&
&/init-param&
&init-param&
&param-name&cors.exposedHeaders&/param-name&
&param-value&Set-Cookie&/param-value&
&/init-param&
&init-param&
&param-name&cors.supportsCredentials&/param-name&
&param-value&true&/param-value&
&/init-param&
&filter-mapping&
&filter-name&CORS&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
1:cors配置允许跨域
import org.springframework.context.annotation.B
import org.springframework.context.annotation.C
import org.springframework.web.cors.CorsC
import org.springframework.web.cors.UrlBasedCorsConfigurationS
import org.springframework.web.filter.CorsF
import org.springframework.web.servlet.config.annotation.CorsR
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerA
import java.util.ArrayL
import java.util.L
Created by Msater Zg on ./
@Configuration
public class CorsConfig extends WebMvcConfigurerAdapter {
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/*")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT")
.maxAge(3600);
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
List list = new ArrayList&&();
list.add("*");
corsConfiguration.setAllowedOrigins(list);
corsConfiguration.addAllowedOrigin("*"); // 1
corsConfiguration.addAllowedHeader("*"); // 2
corsConfiguration.addAllowedMethod("*"); // 3
return corsC
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig()); // 4
return new CorsFilter(source);
2:拦截器拦截方法获取token
1:拦截器配置
import org.springframework.web.servlet.HandlerI
import org.springframework.web.servlet.ModelAndV
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
Created by Msater Zg on .
public class ApiInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截了");
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截了");
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截了");
2: 拦截器管理工具
import org.springframework.context.annotation.C
import org.springframework.web.servlet.config.annotation.InterceptorR
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerA
Created by Msater Zg on .
拦截器管理工具/
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
public void addInterceptors(InterceptorRegistry registry) {
// 多个拦截器组成一个拦截器链
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
registry.addInterceptor(new ApiInterceptor()).addPathPatterns("/*");
//对来自/user/** 这个链接来的请求进行拦截
super.addInterceptors(registry);
其他相似问题

我要回帖

更多关于 ajax如何解决跨域问题 的文章

 

随机推荐