springboot跨域配置

 

 

前言:

当它请求的一个资源是从一个与它本身提供的第一个资源的不同的域名时,一个资源会发起一个跨域HTTP请求(Cross-site HTTP request)。
比如说,域名A ( http://domaina.example ) 的某 Web 应用程序中通过< img>标签引入了域名B( http://domainb.foo ) 站点的某图片资源(http://domainb.foo/image.jpg),域名A的那 Web 应用就会导致浏览器发起一个跨站 HTTP 请求。
在当今的 Web 开发中,使用跨站 HTTP 请求加载各类资源(包括CSS、图片、JavaScript 脚本以及其它类资源),已经成为了一种普遍且流行的方式。
正如大家所知,出于安全考虑,浏览器会限制脚本中发起的跨站请求。比如,使用 XMLHttpRequest 对象发起 HTTP 请求就必须遵守同源策略。 具体而言,Web 应用程序能且只能使用 XMLHttpRequest对象向其加载的源域名发起 HTTP 请求,而不能向任何其它域名发起请求。为了能开发出更强大、更丰富、更安全的Web应用程序,开发人员渴望着在不丢失安全的前提下,Web 应用技术能越来越强大、越来越丰富。比如,可以使用 XMLHttpRequest
发起跨站 HTTP 请求。(这段描述跨域不准确,跨域并非浏览器限制了发起跨站请求,而是跨站请求可以正常发起,但是返回结果被浏览器拦截了。最好的例子是CSRF跨站攻击原理,请求是发送到了后端服务器无论是否跨域!注意:有些浏览器不允许从HTTPS的域跨域访问HTTP,比如Chrome和Firefox,这些浏览器在请求还未发出的时候就会拦截请求,这是一个特例。
引自:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

 

方法一:新增一个configration类 或 在Application中加入CorsFilter和CorsConfiguration方法

复制代码
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.web.cors.CorsConfiguration;  
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;  
import org.springframework.web.filter.CorsFilter;  
  
@Configuration  
public class CorsConfig {  
    private CorsConfiguration buildConfig() {  
        CorsConfiguration corsConfiguration = new CorsConfiguration();  
        corsConfiguration.addAllowedOrigin("*"); // 1允许任何域名使用 

     //corsConfiguration.addAllowedOrigin("http://www.aimaonline.cn/");

      //corsConfiguration.addAllowedOrigin(http://test.aimaonline.cn/);

        corsConfiguration.addAllowedHeader("*"); // 2允许任何头
        corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等) 
        return corsConfiguration;  
    }  
  
    @Bean  
    public CorsFilter corsFilter() {  
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();  
        source.registerCorsConfiguration("/**", buildConfig()); // 4  
        return new CorsFilter(source);  
    }  
}  
复制代码

方法二:使用Filter方式

复制代码
import javax.servlet.*;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
   
@Component  
public class CorsFilter implements Filter {  
  
    final static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(CorsFilter.class);  
 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {  
        HttpServletResponse response = (HttpServletResponse) res;  
        response.setHeader("Access-Control-Allow-Origin", "*");  
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");  
        response.setHeader("Access-Control-Max-Age", "3600");  
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");  
        System.out.println("*********************************过滤器被使用**************************");  
        chain.doFilter(req, res);  
    }  
    public void init(FilterConfig filterConfig) {}  
    public void destroy() {}  
}  
复制代码

以上转载自网络

 
分类: springboot学习 
________________________________________________________________________________________________________________
 
 

全局跨域:

方式1:

//springboot2.0
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { //添加映射路径 registry.addMapping("/**") //表示允许所有的域都可以请求 .allowedOrigins("*") //表示在3600秒内不需要再发送预校验请求 .maxAge(3600) //是否发送Cookie信息 .allowCredentials(true) //表示允许跨域请求的方法 .allowedMethods("GET","POST", "PUT", "DELETE") //表示允许跨域请求包含content-type .allowedHeaders("*") //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息) .exposedHeaders("Header1", "Header2"); } }


 //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
 .exposedHeaders("Header1", "Header2");

简单来说就是控制你的API请求可以读取的返回的header的。

你通过ajax请求接口之后可以读取返回内容的header属性,跨域的时候默认很多是不能读取的,通过这个属性可以控制哪些头可以被读取。

  具体你可以看这里:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Expose-Headers



 

方式2:
 
@Configuration
public class WebMvcConfig  implements WebMvcConfigurer {
 
 
    /**
     * 跨域配置
     *
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                // TODO 这里跨域最好配置域名
                .allowedOrigins("*")
                .maxAge(3600)
                .allowCredentials(true)
                .allowedMethods("GET", "POST", "OPTIONS");
    }
}

方式3:

@Configuration
public class CorsFilterConfig {
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
 
          config.addAllowedOrigin("*");
 
          config.setAllowCredentials(true);
 
          config.addAllowedMethod("*");
 
          config.addAllowedHeader("*");
 
          config.addExposedHeader("*");
 
 
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);
 
        return new CorsFilter(configSource);
    }
}

 

 
 

局部跨域:

方式1:在方法上使用注解 @CrossOrigin :

@RequestMapping("/test")
@ResponseBody
//@CrossOrigin("http://localhost:8080") 
@CrossOrigin("*") 
public String test( ){
    return "test";
}

或者在类上使用注解 @CrossOrigin :

@Controller
//@CrossOrigin(origins = "https://xxx.com", maxAge = 7200)
@CrossOrigin(origins = "*", maxAge = 7200)
public class TestController {
 
    @RequestMapping("/test")
    @ResponseBody
    public String test( ){
        return "test";
    }
}

方式2:

@RequestMapping("/test")
@ResponseBody
public String test(HttpServletResponse response){
//response.addHeader("Access-Control-Allow-Origin", "http://localhost:8080");
response.addHeader("Access-Control-Allow-Origin", "*");
    return "test";
}

在过滤器中将数据返回,跨域需要设置:
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader( "Cache-Control", "no-cache" );

 

 

 
 
 
 
 
 
 
 
posted @ 2018-12-26 11:13  kelelipeng  阅读(254)  评论(0编辑  收藏  举报