前後端分離-跨域
阿新 • • 發佈:2018-12-18
對於前後端分離的專案來說,如果前端專案與後端專案部署在兩個不同的域下,那麼勢必會引起跨域問題的出現。什麼是跨域?跨域,指的是瀏覽器不能執行其他網站的指令碼。它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制。簡單來說就是不同域名之間相互訪問同源策略:請求的url地址,必須與瀏覽器上的url地址處於同域上,也就是域名,埠,協議相同.例如: http://www.a.com 要訪問 http://www.b.com 這樣域名不同,屬於跨域 http://www.a.com:8081/index.html呼叫http://www.a.com:8080的介面 這樣埠號不同 也屬於跨域 http://www.a.com:訪問https://www.a.com 這樣也是屬於跨域 協議不一樣所以在以前前後端不分離的開發模式中,從來不用關注這個問題,因為所有的請求都是在同一個域內綜合了網上解決跨域的方式目前有兩種1.使用JSONP不過我不太推薦使用,JSONP只支援GET請求,不管是對於前端還是後端來說,寫法與我們平常的ajax寫法不同,同樣後端也需要作出相應的更改。 JSONP的優勢在於支援老式瀏覽器,以及可以向不支援CORS的網站請求資料。2.通過cors協議解決跨域問題CORS支援所有型別的HTTP請求。 這個也是我非常推薦大家使用的方法 下面我來說下專案中遇到的問題 前端:vue.js 後端:springboot前端請求介面時,報錯資訊如下Origin 'h
@Component
public class CorsFilter implements Filter {
/*跨域請求配置*/
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest reqs = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin","*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "5000");
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,Authorization,Token");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}}
繼承webmvcconfigurer的adapter的方法
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "OPTIONS", "PUT")
.allowedHeaders("Content-Type", "X-Requested-With", "accept", "Origin", "Access-Control-Request-Method",
"Access-Control-Request-Headers")
.exposedHeaders("Access-Control-Allow-Origin", "Access-Control-Allow-Credentials")
.allowCredentials(true).maxAge(3600);
}
}
注:以上寫法二選一
即可,兩個都寫估計還是會衝突,兩者作用一樣只是寫法不同