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