开发者

Spring MVC跨域问题及解决

目录
  • 跨域问题
    • 不同的域
    • 同源策略
    • 解决方法
      • 1.CORS
      • 2.jsONP
      • 3.局部解决方案
      • 4.全局解决方法
  • 总结

    跨域问题

    不同的域

    协议、域名、端口,三者只要有一个不同,就叫不同的域

    比如

    http:/moon.com/test去拉取下列url对应的资源

    URL是否跨域
    http:/moon.com/test不算跨域
    http:/www.moon.com/test算跨域
    https:/moon.com/test算跨域

    Tips:

    • 不同的域对协议域名端口三者的检查是非常严格的,比如从http://localhost:8080/test去拉取http://127.0.0.1:8080/test2算跨域的,因为域名不一样,虽然他们表达的意思一样。

    同源策略

    浏览器自身会组织从一个域加载的脚本获取另外一个域的资源

    Tips:

    • 对于css和js这样的资源是不会触发同源策略

    解决方法

    1.CORS

    跨域资源共享,因为它支持所有类型的HTTP请求

    Tips:

    • 只能解决浏览器跨域问题,如果涉及到App,小程序,物联网设备跨域,SpringMVC这一套不一定生效

    2.JSONP

    前端可以通过JSONP来进行获取跨域资源,但是只支持GET请求

    3.局部解决方案

    @CrossOrigin

    在方法或者类上加上@CrossOrigin这个注解,设置响应头中允许的跨域访问的请求域,*代表所有,也可以通过字符串数组的形式进行逐一放行

    @CrossOrigin({"http://localhost:8081", "http://localhost:8082"})
    @GetMapping("/request")
    public Student rest1(HttpServletResponse response) {
      Student student = new Student();vlxycvYb
      student.setName("GET晓龙");
      student.setAge(23);
      student.setBirthday(new Date());
      return student;
    }

    Tips:

    • 注解中的maxAge属性表示预检请求结果缓存的最大时长,单位为秒,默认为1800s,即30分钟

    4.全局解决方法

    对于浏览器的跨域问题,其实有很多的解决方案,其本质就是设置响应头中的内容Access-Control-Allow-Origin的值,他的值其实就是我们上面允许访问的域,对此我们只需要配置响应的响应头,所以我们可以通过过滤器去设置响应头,货值配置Spring帮我们写好的过滤

    手写过滤器

    我们写一个类是实现Filter接口,因为pythonFilter接口中,初始化和销毁方法是默认实现,我们这里也不需要,所以没有进行重写。

    public class CrossOriginFilter implements Filter {
      
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 转化响应
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // 设置响应头,设置允许访问为全部
        response.setHeader("Access-Control-Allow-Origin", "*");
        // 放行
        filterChain.doFilter(servletRequest, response);
      }
    }

    Tips:

    • 过滤器写好以后,我们把它配置到项目中即可,可以使用web.XML或者Java类的方式配置,具体方式可以参考之前的配置过滤器

    配置Spring配置文件

    在多数的情况下,我们是不需要去手写过滤器,Spring已经帮我们做好了,而且功能也比我们的完善,我们可以直接拿过来用

    <!--配置mvc的跨域访问-->
    <mvc:cors>
      <!--
        映射中对应的就是我们的请求url,配置哪一条允许跨域访问
        allowed-origins  =>允许访问的请求
        allowed-methods  =>允许访问的方式
        max-age          =>预检请求缓存时间
        -->
      <mvc:mapping path="/restjs/**" allowed-origins="*" allowed-methods="POST" max-age="1888"/>
    </mvc:cors>

    Tips:

    • path中,如果写成/rest/*的话表示rest下面的子代请求,不会去请求到孙子代,比如/rest/test/test2是请求不到的
    • 如果写成/rest/**的话表示rest下面的所有后代的请求,比如/rest/test/test2是可以请求到的

    配置JavaConfig

    使用Java类来进行配置其实也是大同小异,而且在WebMvcConfig接口中,已经为我们提供了对应的方法addCorsMappings,我们只需要重新该方法即可。

    @Override
    public void addCorsMappings(CorsRegistry registry) {
      /*
         * 在注册处添加Mappiwww.devze.comng,参数值就是对应配置文件里面path
         * 然后就可以一直去点,对应的配置xml里面的属性
         */
      registry.addandroidMapping("/rest/**")
              .allowedOrigins("*")
              .allowedMethods("POST")
              .maxAge(1811);
    }

    总结

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

    0

    上一篇:

    下一篇:

    精彩评论

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

    最新开发

    开发排行榜