一、概述
现在企业级的项目大多数都是前后端分离,加之微服务技术已经成熟,在日常的开发中就难免遇到跨域问题。
跨域指的是:浏览器不能执行其他网站的脚本,从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。
跨域是由浏览器的同源策略造成的,是浏览器施加的安全限制。
a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,所进行的访问行动都是跨域的
以下是解决跨域问题的示例
二、示例
1.新建一个拦截器,在拦截器中设置跨域
public class CorsInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //表示接受任意域名的请求,也可以指定域名 response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin")); //该字段可选,是个布尔值,表示是否可以携带cookie response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS"); response.setHeader("Access-Control-Allow-Headers", "*"); //这里可以不加,但是其他语言开发的话记得处理options请求 /** * 非简单请求是对那种对服务器有特殊要求的请求, * 比如请求方式是PUT或者DELETE,或者Content-Type字段类型是application/json。 * 都会在正式通信之前,增加一次HTTP请求,称之为预检。浏览器会先询问服务器,当前网页所在域名是否在服务器的许可名单之中, * 服务器允许之后,浏览器会发出正式的XMLHttpRequest请求 */ if(HttpMethod.OPTIONS.toString().equals(request.getMethod())){ return true; } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
2.把拦截器加入到拦截器配置中
@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Bean LoginInterceptor loginInterceptor() { return new LoginInterceptor(); } @Bean CorsInterceptor corsInterceptor(){ return new CorsInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { /** * 拦截全部路径,这个跨域需要放在最上面 */ registry.addInterceptor(corsInterceptor()).addPathPatterns("/**"); //拦截全部 registry.addInterceptor(loginInterceptor()) .addPathPatterns("/api/v1/pri/*/*/**")//把所有的priv都拦截掉 .excludePathPatterns("/api/v1/pri/user/login","api/v1/pri/user/register");//登录和注册不拦截 WebMvcConfigurer.super.addInterceptors(registry); } }
总结:这样就算完成了一个简单的跨域了。
标签:SpringBoot,request,response,域名,解决,请求,public,跨域 From: https://www.cnblogs.com/tony-yang-flutter/p/17704819.html