一、同源策略
同源策略是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能不能使用??梢哉f(shuō)Web是構(gòu)建在同源策略基礎(chǔ)之上的,瀏覽器只是針對(duì)同源策略的一種實(shí)現(xiàn)。同源策略會(huì)阻止一個(gè)域的javascript腳本和另外一個(gè)域的內(nèi)容進(jìn)行交互。所謂同源(即指在同一個(gè)域)就是兩個(gè)頁(yè)面具有相同的協(xié)議,ip和端口號(hào)。
二、同源策略的限制:
無(wú)法讀取非同源網(wǎng)頁(yè)的 Cookie、LocalStorage 和 IndexedDB;
無(wú)法接觸非同源網(wǎng)頁(yè)的 DOM;
無(wú)法向非同源地址發(fā)送 AJAX 請(qǐng)求;
三、options 請(qǐng)求
options 請(qǐng)求就是預(yù)檢請(qǐng)求,可用于檢測(cè)服務(wù)器允許的 http 方法。當(dāng)發(fā)起跨域請(qǐng)求時(shí),由于安全原因,觸發(fā)一定條件時(shí)瀏覽器會(huì)在正式請(qǐng)求之前自動(dòng)先發(fā)起 OPTIONS 請(qǐng)求,即 CORS 預(yù)檢請(qǐng)求,服務(wù)器若接受該跨域請(qǐng)求,瀏覽器才繼續(xù)發(fā)起正式請(qǐng)求。某些請(qǐng)求不會(huì)觸發(fā)CORS預(yù)檢請(qǐng)求,這樣的請(qǐng)求一般稱為 “簡(jiǎn)單請(qǐng)求” ,而會(huì)觸發(fā)預(yù)檢的請(qǐng)求則是 “復(fù)雜請(qǐng)求” 。
如果服務(wù)中存在鑒權(quán)的過(guò)濾器(Filter),由于option請(qǐng)求是瀏覽器自動(dòng)請(qǐng)求的,無(wú)法手動(dòng)設(shè)置請(qǐng)求頭和請(qǐng)求體,因此在option請(qǐng)求可能鑒權(quán)失敗,從而導(dǎo)致cors認(rèn)證失敗。
四、解決方法
1.springmvc項(xiàng)目
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter(filterName = "corsFilter", urlPatterns = "/*")
@Configuration
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException,
ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//這里設(shè)置為* 可能會(huì)不生效
response.setHeader("Access-Control-Allow-Origin", origin);
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin,request-origin,Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,token");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Expose-Headers", "*");
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
2.java EE項(xiàng)目
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Configuration
@Order(value = Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter{
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
this.writeFile("go to CorsFilter");
HttpServletRequest request = (HttpServletRequest) req;
String allowOrigin = request.getHeader("Origin");
HttpServletResponse response = (HttpServletResponse) res;
//這里設(shè)置為* 可能會(huì)不生效
response.setHeader("Access-Control-Allow-Origin", allowOrigin);
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin,request-origin,Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,token");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Expose-Headers", "*");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}
}
web.xml中配置該Filter
CorsFilter com.servlet.CorsFilter trueCorsFilter /*
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
名稱欄目:Java后端服務(wù)的跨域處理-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://jinyejixie.com/article26/cccjjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站設(shè)計(jì)公司、企業(yè)網(wǎng)站制作、靜態(tài)網(wǎng)站、Google、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容