开发者

Spring boot如何开启跨域配置

开发者 https://www.devze.com 2024-08-16 10:27 出处:网络 作者: 卿者飞翔
目录Spring boot开启跨域配置Spring boot解决跨域问题一、controller添加注解二、全局配置三、通过拦截器配置总结Spring boot开启跨域配置
目录
  • Spring boot开启跨域配置
  • Spring boot解决跨域问题
    • 一、controller添加注解
    • 二、全局配置
    • 三、通过拦截器配置
  • 总结

    Spring boot开启跨域配置

    跨域(Cross-Origin)是指在互联网上的一个域下的文档或脚本尝试请求另一个域下的资源时,域名、协议或端口不同的这种情况。

    具体来说,如果一个网页试图通过脚本(如JavaScript)从不同源的服务器上请求数据,就会触发浏览器的同源策略限制,导致跨域问题。

    同源策略(Same-origin policy)是Web浏览器的一个安全功能,它要求Web浏览器仅允许执行来自同一站点的脚本访问该站点的资源。

    这意味着,如果网页A尝试访问网页B的资源,且这两个网页的协议、域名或端口号中任何一个不相同,浏览器就会阻止这种访问,以防止恶意网站读取另一个网站的数据。

    Spring boot解决跨域问题

    一、controller添加注解

    在controller层添加@CrossOrigin就可以解决跨域问题

    @RestController
    @RequestMapping("test")
    @Slf4j
    @CrossOrigin
    public class DemoController {
    
        @RequestMapping("message")
        public String test(@RequestBody Message message) {
            logjs.info("{javascript}", jsON.toJSONString(message));
            return "编程test";
        }
    }
    
    

    二、全局配置

    添加如下全局配置就可以统一配置跨域支持

    @Configuration
    public class MvcConfig implements WebMvcConfigurer {
    
        /**
         * 开启全局跨域配置
         * @param registry
         */
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOriginPatterns("*")
                    .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
                    .maxAge(3600)
                    .allowCredentials(true);
        }
    
    }
    

    三、通过拦截器配置

    通过如下拦截器配置,也可以支持跨域

    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请求,称之为预检。浏览器会先询问服务器,当前网页所在域名http://www.devze.com是否在服务器的许可名单之中,
             * 服务器允许之后,浏览器会发出正式的XMLHttpRequest请求
             */
            if(HttpMethod.OPTIONS.toString().equals(request.getMethod())){
                return true;
            }
    
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Ophpbject handler, ModelAndView modelAndView) throws Exception {
    
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
        }
    }
    
    

    总结

    Spring boot解决跨域问题还是很方便的,遇到跨域问题,通过以上方式都可以实现解决

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号