文档章节

Spring跨域问题

刘引惟
 刘引惟
发布于 2016/11/17 10:55
字数 420
阅读 68
收藏 2
  • spingMVC 3.X跨域

关于跨域问题,主要用的比较多的是cros跨域。

详细介绍请看https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

 

但是,在springmvc+angularjs下支持跨域请求时,出现复杂跨域场景(post + json)失败的情况。

开始的跨域配置如下:

public class CrossInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        response.addHeader("Access-Control-Allow-Origin","*");
        response.addHeader("Access-Control-Allow-Methods","*");
        response.addHeader("Access-Control-Max-Age","100");
        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
        response.addHeader("Access-Control-Allow-Credentials","false");
        return super.preHandle(request, response, handler);
    }

}

 

spring-dispatcher-servlet.xml中配置如下:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**/*"/>
        <bean class="cn.***.filter.CrossInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

 

针对简单跨域没问题。但是针对post+json请求却失败,提示跨域失败。

跟踪springmvc源码到FrameworkServlet中的doOption方法,发现,接受了option预检,但是spring主动返回allow,没有支持跨域的配置。

因此,加入新的配置如下:

public class CrossFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
            // CORS "pre-flight" request
            response.addHeader("Access-Control-Allow-Origin", "*");
            response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            response.addHeader("Access-Control-Allow-Headers", "Content-Type");
            response.addHeader("Access-Control-Max-Age", "1800");//30 min
        }
        filterChain.doFilter(request, response);
    }
}

 

web.xml配置如下:

<filter>
    <filter-name>cors</filter-name>
    <filter-class>cn.***.filter.CrossFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>cors</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

此时,option请求被CrossFilter过滤器接入并赋予跨域响应头,同时也进入FrameworkServlet中的doOption方法。查看浏览器控制台,发现option请求返回支持跨域信息,后续的post请求进入controller。

 

  • springMVC 4.X跨域

升级spring版本的后,上述跨域并不支持所有浏览器。经测试,Safari正常,chrome异常。重新翻了一下最新的文档后,得到最新的跨域配置如下:

<mvc:cors>
        <mvc:mapping path="/**" allowed-origins="*" allow-credentials="true" max-age="1800" allowed-methods="GET,POST,OPTIONS"/>
    </mvc:cors>

相比3.x系列,简单了很多。

本文转载自:http://www.cnblogs.com/asfeixue/p/4363372.html

下一篇: SOCKET
刘引惟
粉丝 7
博文 85
码字总数 18139
作品 0
浦东
私信 提问
Spring @CrossOrigin 注解原理

现实开发中,我们难免遇到跨域问题,以前笔者只知道jsonp这种解决方式,后面听说spring只要加入@CrossOrigin即可解决跨域问题。本着好奇的心里,笔者看了下@CrossOrigin 作用原理,写下这篇博...

暗中观察
03/13
640
0
SpringMVC跨域配置以及权限控制拦截跨域请求时的问题解决

背景 最近公司开始推行前后端分离的架构,于是不可避免的引入了跨域的问题,跨域的概念可以参考大佬的博客,这里就不再赘述了。 作为Java最流行框架之一的Spring其实已经帮我们写好了很多代码...

Iceberg_XTY
2018/09/29
1K
0
SpringBoot +spring security 与CSRF有关的几个 问题

1、问题 开启 csrf 后 列表页面没有数据 页面console.log(403) 2、科普 首先,科普一下,什么是"CSRF"? 这是一个web应用安全的问题,CSRF(Cross-site request forgery)跨站请求伪造,也被称...

douruanliang
2018/05/15
0
0
Spring Boot点滴笔记

Spring Boot导入xml配置文件 使用Spring Boot后再也不想回到一堆xml配置的spring项目中了。但Spring boot有时候也避免不了需要xml配置文件。 可以在启动类中加入@ImportResource Spring Boot...

hutaishi
2017/11/01
57
0
javaWeb项目跨域问题解决方案:

1.简单的servlet项目 1.配置一个filter过滤器,过滤所有的请求,并且设置响应头 package Filter; import javax.servlet.*;import javax.servlet.http.HttpServletResponse;import java.io.IO......

文文1
2018/11/26
32
0

没有更多内容

加载失败,请刷新页面

加载更多

python学习10.04:Python list列表使用技巧及注意事项

前面章节介绍了很多关于 list 列表的操作函数,细心的读者可能会发现,有很多操作函数的功能非常相似。例如,增加元素功能的函数有 append() 和 extend(),删除元素功能的有 clear()、 remo...

太空堡垒185
19分钟前
3
0
新手插画学习的方法?教你如何自学?

插画学习的方法?教你如何自学? 从小喜欢画一些漫画头像随笔画,但是其实没有基础。个人偏好小清新手绘风的插画(如下图),每每看到都希望自己能画出这样的作品。 我其实很想说画这种美术功...

huihuajiaocheng
25分钟前
4
0
面试题

1、实现clone();

gtandsn
36分钟前
4
0
CentOS 7 部署 tesseract-ocr

官方地址 github yum-config-manager --add-repo https://download.opensuse.org/repositories/home:/Alexander_Pozdnyakov/CentOS_7/ 若提示 yum-config-manager: command not found 执行以......

阿白
36分钟前
3
0
JAVA比较器中comparator的使用

一个专用的比较器Comparator Comparator是一个专用的比较器,当一个不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较。Comparator体现了一种策略模式...

daxiongdi
37分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部