天天看點

springboot 解決跨域通路問題

1、問題描述   1、 對于前後端分離的項目來說,如果前端項目與後端項目部署在兩個不同的域下,那麼勢 必會引起跨域問題的出現 。針對跨域問題,我們可能第一個想到的解決方案就是jsonp,并 且以前處理跨域問題我基本也是這麼處理。但是jsonp方式也同樣有不足,不管是對于前端 還是後端來說,寫法與我們平常的ajax寫法不同,同樣後端也需要作出相應的更改。并 且,jsonp方式隻能通過get請求方式來傳遞參數,當然也還有其它的不足之處,jQuery ajax方式以jsonp類型發起跨域請求,其原理跟<script>腳本請求一樣,是以使用jsonp時 也隻能使用GET方式發起跨域請求。跨域請求需要服務端配合,設定callback,才能完成跨 域請求。針對于此,我并沒有急着使用jsonp的方式來解決跨域問題,去網上找尋其它方 式,也就是本文主要所要講的,在springboot中通過cors協定解決跨域問題。   2、Cors協定H5中的新特性:Cross-Origin Resource Sharing(跨域資源共享) 通過它,我們的開發者(主要指後端開發者)可以決定資源是否能被跨域通路。cors是一 個w3c标準,它允許浏覽器(目前ie8以下還不能被支援)像我們不同源的伺服器發出 xmlHttpRequest請求,我們可以繼續使用ajax進行請求通路。     3、springboot中解決方案     3.1 方式1 建立一個filter解決跨域  

package com.yanzhen.cors;

import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author: wangxiaobo
 * @create: 2021-04-10 09:28
 **/
@Component
public class SimpleCORSFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain Chain) throws IOException, ServletException {
        HttpServletResponse response2= (HttpServletResponse) response; 
        response2.setHeader("Access-Control-Allow-Origin","*"); 
        response2.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, HEAD"); 
        response2.setHeader("Access-Control-Max-Age", "3600"); 
        response2.setHeader("Access-Control-Allow-Headers", "access-control- allow-origin, authority, content-type, version-info, X-Requested-With"); 
        Chain.doFilter(request, response);
    }

    @Override
    public void destroy() {

    }
}
           

3.2 方式2 基于WebMvcConfigurerAdapter配置加入Cors的跨域

package com.yanzhen.cors;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * @author: wangxiaobo
 * @create: 2021-04-10 10:05
 * 建立全局跨域配置類
 **/
@Configuration
public class CorsConfig  extends WebMvcConfigurerAdapter {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping ("/**")
                .allowedOrigins ("*")
                .allowCredentials (true)
                .allowedHeaders ("GET","POST","PUT","DELETE")
                .maxAge (3600);
   //     super.addCorsMappings (registry);
    }
}
           

如果你想做到更細緻也可以使用@CrossOrigin這個注解在controller類中使用。 這樣就可以指定該controller中所有方法都能處理來自http:19.168.1.10:8080中的請求。 第一種Filter的方案也支援springmvc。 第二種常用于springboot。

繼續閱讀