博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Spring MVC跨域
阅读量:4964 次
发布时间:2019-06-12

本文共 2865 字,大约阅读时间需要 9 分钟。

1.Sping MVC 3.X跨域

关于跨域问题,主要用的比较多的是cros跨域。
详细介绍请看
 
但是,在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中配置如下:

 

针对简单跨域没问题。但是针对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配置如下:
cors
cn.***.filter.CrossFilter
cors
/*

 

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

2.Sping MVC 4.X跨域

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

 

 

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

 

3.过滤器响应头常用的设置

 

response.setHeader("Access-Control-Allow-Origin", "*");              response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE,PUT");              response.setHeader("Access-Control-Max-Age", "3600");              response.setHeader("Access-Control-Allow-Headers","appKey,token,Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since");              response.setHeader("Access-Control-Allow-Credentials", "true");            /* 设置响应头为Json */            response.setCharacterEncoding("UTF-8");            response.setContentType("application/json");

 

 

 

----转自:

 

转载于:https://www.cnblogs.com/zf29506564/p/7146936.html

你可能感兴趣的文章
js 基础拓展
查看>>
C#生成随机数
查看>>
Android应用程序与SurfaceFlinger服务的连接过程分析
查看>>
Java回顾之多线程
查看>>
机电行业如何进行信息化建设
查看>>
9、总线
查看>>
Git 笔记 - section 1
查看>>
2018 Multi-University Training Contest 10 - TeaTree
查看>>
2018 Multi-University Training Contest 10 - Count
查看>>
HDU6203 ping ping ping
查看>>
《人人都是产品经理》书籍目录
查看>>
如何在git bash中运行mysql
查看>>
OO第三阶段总结
查看>>
构建之法阅读笔记02
查看>>
DataTable和 DataRow的 区别与联系
查看>>
检索COM 类工厂中CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败
查看>>
mysql数据库中数据类型
查看>>
Fireworks基本使用
查看>>
两台电脑间的消息传输
查看>>
Linux 标准 I/O 库
查看>>