目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

SpringBoot2.X开启跨域配置

什么是浏览器跨域

  • 跨域:浏览器同源策略 1995 年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。 最初,它的含义是指,A 网页设置的 Cookie,B 网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同"
1协议相同  http https
2域名相同  www.xdclass.net
3端口相同  80  81
4
5一句话:浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域
6
7浏览器控制台跨域提示:
8No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
  • 解决方法
 1     1)JSONP
 2     2)Http响应头配置允许跨域
 3             nginx层配置 https://www.cnblogs.com/hawk-whu/p/6725699.html
 4     3)程序代码中处理 SpringBoot 通过拦截器配置
 5   
 6      //表示接受任意域名的请求,也可以指定域名
 7     response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
 8   
 9     //该字段可选,是个布尔值,表示是否可以携带cookie
10     response.setHeader("Access-Control-Allow-Credentials", "true");
11   
12     response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
13   
14     response.setHeader("Access-Control-Allow-Headers", "*");
  • options 请求,这个需要注意
  • 注意点: 假如接口报错,则跨域配置可能不生效(报错建议断点调试,排除异常错误)

示例代码

src/main/java/net/xdclass/online_xdclass/interceptor/CorsInterceptor.java

 1package net.xdclass.online_xdclass.interceptor;
 2
 3import org.springframework.http.HttpMethod;
 4import org.springframework.web.servlet.HandlerInterceptor;
 5import org.springframework.web.servlet.ModelAndView;
 6
 7import javax.servlet.http.HttpServletRequest;
 8import javax.servlet.http.HttpServletResponse;
 9
10public class CorsInterceptor implements HandlerInterceptor {
11
12    @Override
13    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
14
15        //表示接受任意域名的请求,也可以指定域名
16        response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
17
18        //该字段可选,是个布尔值,表示是否可以携带cookie
19        response.setHeader("Access-Control-Allow-Credentials", "true");
20
21        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
22
23        response.setHeader("Access-Control-Allow-Headers", "*");
24
25
26        //这里可以不加,但是其他语言开发的话记得处理options请求
27        /**
28         * 非简单请求是对那种对服务器有特殊要求的请求,
29         * 比如请求方式是PUT或者DELETE,或者Content-Type字段类型是application/json。
30         * 都会在正式通信之前,增加一次HTTP请求,称之为预检。浏览器会先询问服务器,当前网页所在域名是否在服务器的许可名单之中,
31         * 服务器允许之后,浏览器会发出正式的XMLHttpRequest请求
32         */
33        if(HttpMethod.OPTIONS.toString().equals(request.getMethod())){
34            return true;
35        }
36
37        return true;
38    }
39
40    @Override
41    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
42
43    }
44
45    @Override
46    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
47
48    }
49}
50

注册跨域拦截器

src/main/java/net/xdclass/online_xdclass/config/InterceptorConfig.java

 1package net.xdclass.online_xdclass.config;
 2
 3import net.xdclass.online_xdclass.interceptor.CorsInterceptor;
 4import net.xdclass.online_xdclass.interceptor.LoginInterceptor;
 5import org.springframework.context.annotation.Bean;
 6import org.springframework.context.annotation.Configuration;
 7import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 8import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 9
10/**
11 * 拦截器配置
12 *
13 * 不用权限可以访问url    /api/v1/pub/
14 * 要登录可以访问url    /api/v1/pri/
15 */
16
17@Configuration
18public class InterceptorConfig implements WebMvcConfigurer {
19
20
21    @Bean
22    LoginInterceptor loginInterceptor(){
23        return new LoginInterceptor();
24    }
25
26    @Bean
27    CorsInterceptor corsInterceptor(){
28        return new CorsInterceptor();
29    }
30
31
32
33
34    @Override
35    public void addInterceptors(InterceptorRegistry registry) {
36
37
38        /**
39         * 拦截全部路径,这个跨域需要放在最上面
40         */
41        registry.addInterceptor(corsInterceptor()).addPathPatterns("/**");
42
43
44        registry.addInterceptor(loginInterceptor()).addPathPatterns("/api/v1/pri/*/*/**")
45                //不拦截哪些路径   斜杠一定要加
46                .excludePathPatterns("/api/v1/pri/user/login","/api/v1/pri/user/register");
47
48
49        WebMvcConfigurer.super.addInterceptors(registry);
50
51    }
52}
53

作者:Soulboy