概念
在 html 中,<a>, <form>, <img>, <script>, <iframe>, <link> 等標簽以及 ajax 都可以指向一個資源地址, 而所謂的跨域請求就是指:當前發起請求的域與該請求指向的資源所在的域不一樣。
這里的域指的是這樣的一個概念:我們認為若協議 + 域名 + 端口號均相同,那么就是同域即我們常說的瀏覽器請求的同源策略。
jsonp
在前后端分離的項目中,會經常遇到需要跨域請求的問題。跨域請求有多種方式。之前接觸過jsonp的方式。
這種方式是在前端頁面進行跨域請求兼容性好,但安全性比較差,只支持get請求。
cors
cross-origin resource sharing 即跨源資源共享 。是一個新的 w3c 標準,它新增的一組http首部字段,允許服務端其聲明哪些源站有權限訪問哪些資源。
也就是說它允許瀏覽器向聲明了 cors 的跨域服務器,發出 xmlhttpreuest 請求,從而克服 ajax 只能同源使用的限制。
http頭部字段介紹
access-control-allow-origin:響應首部中可以攜帶這個頭部表示服務器允許哪些域可以訪問該資源
access-control-allow-methods:該首部字段用于預檢請求的響應,指明實際請求所允許使用的http方法
access-control-allow-headers:該首部字段用于預檢請求的響應。指明了實際請求中允許攜帶的首部字段
access-control-max-age:該首部字段用于預檢請求的響應,指定了預檢請求能夠被緩存多久
access-control-allow-credentials:該字段可選。它的值是一個布爾值,表示是否允許發送cookie。默認情況下,cookie不包括在cors請求之中。設為true,即表示服務器明確許可,cookie可以包含在請求中,一起發給服務器
具體實現
這里通過過濾器的方式對請求進行攔截。設置http的響應header來實現。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public class crossfilter implements filter { protected logger logger = loggerfactory.getlogger(getclass()); @override public void init(filterconfig filterconfig) throws servletexception { } @override public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception { httpservletrequest request=(httpservletrequest)servletrequest; httpservletresponse response=(httpservletresponse)servletresponse; logger.info( "【允許跨域訪問】refererurl【{}】" , request.getheader( "referer" )); //允許跨域訪問 response.setcontenttype( "text/html;charset=utf-8" ); response.setheader( "access-control-allow-origin" , "https://monline.01zhuanche.com" ); response.setheader( "access-control-allow-methods" , "post, get, options, delete" ); response.setheader( "access-control-max-age" , "0" ); response.setheader( "access-control-allow-headers" , "origin, no-cache, x-requested-with, if-modified-since, pragma, last-modified, cache-control, expires, content-type, x-e4m-with,userid,authorization,sessiontoken,jsessionid,token" ); response.setheader( "access-control-allow-credentials" , "true" ); response.setheader( "xdomainrequestallowed" , "1" ); filterchain.dofilter(request, response); } public static string getrefererurl(httpservletrequest request){ string returnvalue = null ; if (request != null && !stringutils.isempty(request.getheader( "referer" ))) { returnvalue = request.getheader( "referer" ); string[] urls = returnvalue.split( "/" ); if (urls != null && urls.length > 3 ) { returnvalue = urls[ 0 ] + "//" + urls[ 2 ]; } } return returnvalue; } @override public void destroy() { } } |
此外需要對我們的過濾器進行配置,在web.xml文件中添加如下配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<filter> <filter-name>crossdomainfilter</filter-name> <filter- class >com.open.advertise.api.cooperation.filter.crossfilter</filter- class > <init-param> <param-name>targetfilterlifecycle</param-name> <param-value> true </param-value> </init-param> </filter> <filter-mapping> <filter-name>crossdomainfilter</filter-name> <url-pattern>/*</url-pattern> <!--可以針對某個接口進行限制--> </filter-mapping> |
以上,對于設置的跨域請求的域名就可以進行跨域訪問啦。
以上所述是小編給大家介紹的java通過filter實現允許服務跨域請求,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:https://blog.csdn.net/wangyy130/article/details/84397961