JAVA通過(guò)Filter實(shí)現(xiàn)允許服務(wù)跨域請(qǐng)求的方法
概念
在 HTML 中,<a>, <form>, <img>, <script>, <iframe>, <link> 等標(biāo)簽以及 Ajax 都可以指向一個(gè)資源地址, 而所謂的跨域請(qǐng)求就是指:當(dāng)前發(fā)起請(qǐng)求的域與該請(qǐng)求指向的資源所在的域不一樣。
這里的域指的是這樣的一個(gè)概念:我們認(rèn)為若協(xié)議 + 域名 + 端口號(hào)均相同,那么就是同域即我們常說(shuō)的瀏覽器請(qǐng)求的同源策略。
Jsonp
在前后端分離的項(xiàng)目中,會(huì)經(jīng)常遇到需要跨域請(qǐng)求的問(wèn)題??缬蛘?qǐng)求有多種方式。之前接觸過(guò)jsonp的方式。
這種方式是在前端頁(yè)面進(jìn)行跨域請(qǐng)求兼容性好,但安全性比較差,只支持GET請(qǐng)求。
CORS
Cross-Origin Resource Sharing 即跨源資源共享 。是一個(gè)新的 W3C 標(biāo)準(zhǔn),它新增的一組HTTP首部字段,允許服務(wù)端其聲明哪些源站有權(quán)限訪問(wèn)哪些資源。
也就是說(shuō)它允許瀏覽器向聲明了 CORS 的跨域服務(wù)器,發(fā)出 XMLHttpReuest 請(qǐng)求,從而克服 Ajax 只能同源使用的限制。
Http頭部字段介紹
Access-Control-Allow-Origin:響應(yīng)首部中可以攜帶這個(gè)頭部表示服務(wù)器允許哪些域可以訪問(wèn)該資源
Access-Control-Allow-Methods:該首部字段用于預(yù)檢請(qǐng)求的響應(yīng),指明實(shí)際請(qǐng)求所允許使用的HTTP方法
Access-Control-Allow-Headers:該首部字段用于預(yù)檢請(qǐng)求的響應(yīng)。指明了實(shí)際請(qǐng)求中允許攜帶的首部字段
Access-Control-Max-Age:該首部字段用于預(yù)檢請(qǐng)求的響應(yīng),指定了預(yù)檢請(qǐng)求能夠被緩存多久
Access-Control-Allow-Credentials:該字段可選。它的值是一個(gè)布爾值,表示是否允許發(fā)送Cookie。默認(rèn)情況下,Cookie不包括在CORS請(qǐng)求之中。設(shè)為true,即表示服務(wù)器明確許可,Cookie可以包含在請(qǐng)求中,一起發(fā)給服務(wù)器
具體實(shí)現(xiàn)
這里通過(guò)過(guò)濾器的方式對(duì)請(qǐng)求進(jìn)行攔截。設(shè)置http的響應(yīng)header來(lái)實(shí)現(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("【允許跨域訪問(wèn)】refererUrl【{}】", request.getHeader("Referer"));
//允許跨域訪問(wèn)
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() {
}
}
此外需要對(duì)我們的過(guò)濾器進(jìn)行配置,在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> <!--可以針對(duì)某個(gè)接口進(jìn)行限制--> </filter-mapping>
以上,對(duì)于設(shè)置的跨域請(qǐng)求的域名就可以進(jìn)行跨域訪問(wèn)啦。
以上所述是小編給大家介紹的JAVA通過(guò)Filter實(shí)現(xiàn)允許服務(wù)跨域請(qǐng)求,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Java的synchronized關(guān)鍵字深入解析
這篇文章主要介紹了Java的synchronized關(guān)鍵字深入解析,在并發(fā)編程中,多線程同時(shí)并發(fā)訪問(wèn)的資源叫做臨界資源,當(dāng)多個(gè)線程同時(shí)訪問(wèn)對(duì)象并要求操作相同資源時(shí),分割了原子操作就有可能出現(xiàn)數(shù)據(jù)的不一致或數(shù)據(jù)不完整的情況,需要的朋友可以參考下2023-12-12
java 日志的數(shù)據(jù)脫敏的實(shí)現(xiàn)方法
今日給大家介紹一下java 日志的數(shù)據(jù)脫敏的實(shí)現(xiàn)方法,可以更好的保護(hù)數(shù)據(jù)的安全,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Java選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)的使用詳解
循環(huán)結(jié)構(gòu)是指在程序中需要反復(fù)執(zhí)行某個(gè)功能而設(shè)置的一種程序結(jié)構(gòu)。它由循環(huán)體中的條件,判斷繼續(xù)執(zhí)行某個(gè)功能還是退出循環(huán),選擇結(jié)構(gòu)用于判斷給定的條件,根據(jù)判斷的結(jié)果判斷某些條件,根據(jù)判斷的結(jié)果來(lái)控制程序的流程2022-03-03
解決使用httpclient傳遞json數(shù)據(jù)亂碼的問(wèn)題
這篇文章主要介紹了解決使用httpclient傳遞json數(shù)據(jù)亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01

