后端跨域的N種方法


簡單來說,CORS是一種訪問機制,英文全稱是Cross-Origin Resource Sharing,即我們常說的跨域資源共享,通過在服務器端設置響應頭,把發起跨域的原始域名添加到Access-Control-Allow-Origin 即可。

返回新的CorsFilter(全局跨域)

在任意配置類,返回一個新的CorsFilter Bean,並添加映射路徑和具體的CORS配置信息。

@Configuration
public class GlobalCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        //1.添加CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        config.addAllowedOrigin("*");
        //是否發送Cookie信息
        config.setAllowCredentials(true);
        //放行哪些原始域(請求方式)
        config.addAllowedMethod("*");
        //放行哪些原始域(頭部信息)
        config.addAllowedHeader("*");
        //暴露哪些頭部信息(因為跨域訪問默認不能獲取全部頭部信息)
        config.addExposedHeader("*");

        //2.添加映射路徑
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);

        //3.返回新的CorsFilter.
        return new CorsFilter(configSource);
    }
}

使用注解(局部跨域)

在方法上(@RequestMapping)使用注解 @CrossOrigin

@RequestMapping("/hello")
@ResponseBody
@CrossOrigin("http://localhost:8080") 
public String index(){
    return "Hello World";
}

在控制器(@Controller)上使用注解 @CrossOrigin

@Controller
@CrossOrigin(origins = "http://domain.com", maxAge = 3600)
public class AccountController {

    @RequestMapping("/hello")
    @ResponseBody
    public String index(){
        return "Hello World";
    }
}

手工設置響應頭(局部跨域)

使用HttpServletResponse對象添加響應頭(Access-Control-Allow-Origin)來授權原始域,這里Origin的值也可以設置為”*” ,表示全部放行。

@RequestMapping("/hello")
@ResponseBody
public String index(HttpServletResponse response){
    response.addHeader("Access-Control-Allow-Origin", "*");
    return "Hello World";
}

Nginx配置跨域

upstream server {
        server 127.0.0.1:8091;
}
server {
        listen 80;
        server_name domain.com;

        location ^~/api {
                //添加跨域請求頭
                proxy_set_header Access-Control-Allow-Origin *;
                proxy_set_header Access-Control-Allow-Methods *;
                proxy_set_header Access-Control-Allow-Headers *;

                if ($request_method = 'OPTIONS') {
                        return 204;
                }
                rewrite ^/api/(.+?)$ /$1 break;
                proxy_pass http://server;
        }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM