JAVA通過Filter實現(xiàn)允許服務(wù)跨域請求的方法
概念
在 HTML 中,<a>, <form>, <img>, <script>, <iframe>, <link> 等標簽以及 Ajax 都可以指向一個資源地址, 而所謂的跨域請求就是指:當(dāng)前發(fā)起請求的域與該請求指向的資源所在的域不一樣。
這里的域指的是這樣的一個概念:我們認為若協(xié)議 + 域名 + 端口號均相同,那么就是同域即我們常說的瀏覽器請求的同源策略。
Jsonp
在前后端分離的項目中,會經(jīng)常遇到需要跨域請求的問題??缬蛘埱笥卸喾N方式。之前接觸過jsonp的方式。
這種方式是在前端頁面進行跨域請求兼容性好,但安全性比較差,只支持GET請求。
CORS
Cross-Origin Resource Sharing 即跨源資源共享 。是一個新的 W3C 標準,它新增的一組HTTP首部字段,允許服務(wù)端其聲明哪些源站有權(quán)限訪問哪些資源。
也就是說它允許瀏覽器向聲明了 CORS 的跨域服務(wù)器,發(fā)出 XMLHttpReuest 請求,從而克服 Ajax 只能同源使用的限制。
Http頭部字段介紹
Access-Control-Allow-Origin:響應(yīng)首部中可以攜帶這個頭部表示服務(wù)器允許哪些域可以訪問該資源
Access-Control-Allow-Methods:該首部字段用于預(yù)檢請求的響應(yīng),指明實際請求所允許使用的HTTP方法
Access-Control-Allow-Headers:該首部字段用于預(yù)檢請求的響應(yīng)。指明了實際請求中允許攜帶的首部字段
Access-Control-Max-Age:該首部字段用于預(yù)檢請求的響應(yīng),指定了預(yù)檢請求能夠被緩存多久
Access-Control-Allow-Credentials:該字段可選。它的值是一個布爾值,表示是否允許發(fā)送Cookie。默認情況下,Cookie不包括在CORS請求之中。設(shè)為true,即表示服務(wù)器明確許可,Cookie可以包含在請求中,一起發(fā)給服務(wù)器
具體實現(xiàn)
這里通過過濾器的方式對請求進行攔截。設(shè)置http的響應(yīng)header來實現(xiàn)。
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] + "http://" + urls[2]; } } return returnValue; } @Override public void destroy() { } }
此外需要對我們的過濾器進行配置,在web.xml文件中添加如下配置:
<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>
以上,對于設(shè)置的跨域請求的域名就可以進行跨域訪問啦。
以上所述是小編給大家介紹的JAVA通過Filter實現(xiàn)允許服務(wù)跨域請求,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
dubbo將異常轉(zhuǎn)換成RuntimeException的原因分析?ExceptionFilter
這篇文章主要介紹了dubbo將異常轉(zhuǎn)換成RuntimeException的原因分析?ExceptionFilter問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03SpringBoot詳細講解靜態(tài)資源導(dǎo)入的實現(xiàn)
在Web開發(fā)過程中,我們需要接觸許多靜態(tài)資源,如CSS、JS、圖片等;在之前的開發(fā)中,這些資源都放在Web目錄下,用到的時候按照對應(yīng)路徑訪問即可。不過在SpringBoot項目中,沒有了Web目錄,那這些靜態(tài)資源該放到哪里去,又要如何訪問呢?這就是我們要講的靜態(tài)資源導(dǎo)入2022-05-05SpringBoot讀寫xml上傳到AWS存儲服務(wù)S3的示例
這篇文章主要介紹了SpringBoot讀寫xml上傳到S3的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-10-10Springboot使用redis進行api防刷限流過程詳解
這篇文章主要介紹了Springboot使用redis進行api防刷限流過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12