跨域处理

 

跨域是什么?浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、 协议任一不同,都是跨域 。我们是采用前后端分离开发的,也是前后端分离部署的,必然会存在跨域问题。 怎么解决跨域?很简单,只需要在controller类上添加注解 @CrossOrigin 即可!这个注解其实是CORS的实现。

CORS(Cross-Origin Resource Sharing, 跨源资源共享)是W3C出的一个标准,其思 想是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成 功,还是应该失败。因此,要想实现CORS进行跨域,需要服务器进行一些设置,同时前端也需要做一些配置和分析。本文简单的对服务端的配置和前端的一些设置进行分析。

 

1️⃣在controller类上添加注解 @CrossOrigin,表示Controller上的所以方法允许跨域,在方法上添加注解 @CrossOrigin,表示该方法允许跨域

 

@Target({ ElementType.METHOD, ElementType.TYPE })

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface CrossOrigin {

 

    String[] DEFAULT_ORIGINS = { "*" };

 

    String[] DEFAULT_ALLOWED_HEADERS = { "*" };

 

    boolean DEFAULT_ALLOW_CREDENTIALS = true;

 

    long DEFAULT_MAX_AGE = 1800;

 

 

    /**

     * 同origins属性一样

     */

    @AliasFor("origins")

    String[] value() default {};

 

    /**

     * 所有支持域的集合,例如"http://domain1.com"。

     * <p>这些值都显示在请求头中的Access-Control-Allow-Origin

     * "*"代表所有域的请求都支持

     * <p>如果没有定义,所有请求的域都支持

     * @see #value

     */

    @AliasFor("value")

    String[] origins() default {};

 

    /**

     * 允许请求头中的header,默认都支持

     */

    String[] allowedHeaders() default {};

 

    /**

     * 响应头中允许访问的header,默认为空

     */

    String[] exposedHeaders() default {};

 

    /**

     * 请求支持的方法,例如"{RequestMethod.GET, RequestMethod.POST}"}。

     * 默认支持RequestMapping中设置的方法

     */

    RequestMethod[] methods() default {};

 

    /**

     * 是否允许cookie随请求发送,使用时必须指定具体的域

     */

    String allowCredentials() default "";

 

    /**

     * 预请求的结果的有效期,默认30分钟

     */

    long maxAge() default -1;

 

}

 

 

2️⃣配置 CorsFilter(全局配置)

 

@Configuration

public class GlobalCorsConfig {

 

    @Bean

    public CorsFilter corsFilter() {

        //1.添加CORS配置信息

        CorsConfiguration config = new CorsConfiguration();

        //1) 允许的域,不要写*,否则cookie就无法使用了

        config.addAllowedOrigin("http://manage.shop.com");

        config.addAllowedOrigin("http://www.shop.com");

        //2) 是否发送Cookie信息

        config.setAllowCredentials(true);

        //3) 允许的请求方式

        config.addAllowedMethod("OPTIONS");

        config.addAllowedMethod("HEAD");

        config.addAllowedMethod("GET");

        config.addAllowedMethod("PUT");

        config.addAllowedMethod("POST");

        config.addAllowedMethod("DELETE");

        config.addAllowedMethod("PATCH");

        // 4)允许的头信息

        config.addAllowedHeader("*");

        // 5) 有效时长

//        config.setMaxAge(3600L);

 

        //2.添加映射路径,我们拦截一切请求

        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();

        configSource.registerCorsConfiguration("/**", config);

 

        //3.返回新的CorsFilter.

        return new CorsFilter(configSource);

    }

}