对于web框架中的跨域问题是一个非常普遍的问题,常见的解决方案也有很多,如:jsonp、cros、websocket等。下面是最近处理springmvc中使用cors解决跨域问题的一些总结。

Filter

具体实现不在详细描述,基本原理利用filter拦截到所有请求,然后进行跨域设置。

拦截器

  • 实现代码

    public class WeCrosInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    if (request.getHeader(HttpHeaders.ORIGIN) != null) {
    response.addHeader("Access-Control-Allow-Origin", "*");
    response.addHeader("Access-Control-Allow-Credentials", "true");
    response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, HEAD");
    response.addHeader("Access-Control-Allow-Headers", "Content-Type");
    response.addHeader("Access-Control-Max-Age", "3600");
    }
    return true;
    } public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    } public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    }
    }
  • 配置

    <mvc:interceptors>
    <mvc:interceptor>
    <mvc:mapping path="/**/*"/>
    <bean class="com.***.interceptor.WeCrosInterceptor" />
    </mvc:interceptor>
    </mvc:interceptors>

注意:如果系统中有其他拦截器,要将该拦截器放在第一个。

springmvc4.2之后版本

@CrossOrigin注解

可注解在方法上,也可注解在类上

  • 示例

    @CrossOrigin(origins = "http://www.zhihu.com")
    @RequestMapping(value = "/allProductions", method = RequestMethod.GET)
    public Result getAllOldProductions() { }

xml全局配置

  • 所有跨域请求都可以访问

    <mvc:cors>
    <mvc:mapping path="/**" />
    </mvc:cors>
  • 细粒度的配置

    <mvc:cors>
    <mvc:mapping path="/api/**"
    allowed-origins="http://domain1.com, http://domain2.com"
    allowed-methods="GET, PUT"
    allowed-headers="header1, header2, header3"
    exposed-headers="header1, header2" allow-credentials="false"
    max-age="123" />
    <mvc:mapping path="/resources/**" allowed-origins="http://domain1.com" />
    </mvc:cors>

以上两种方式在正常使用<mvc:annotation-driven 加载情况下完全可以满足需求。

特殊情况下跨域问题

如果重写了RequestMappingHandlerMapping,就需要单独配置,此时会发现全局的xml配置没有作用了,具体原因是没有使用springmvc框架解析的跨域配置最终是注入给RequestMappingHandlerMapping这个类的对象的,重写后的mapping对象不会被注入,怎么解决这个问题呢?filter 
、拦截器都可以解决,但是都用了4.2的版本还要额外配置是不是太low了,经过查看源码,发现AbstractHandlerMapping有个setCorsConfigurations方法是用来设置跨域配置的,下面最终配置:

<bean name='handlerMapping' class="com.we.core.web.view.WeRequestMappingHandlerMapping">
<property name="corsConfigurations">
<map>
<entry key="/**">
<bean class="org.springframework.web.cors.CorsConfiguration">
<property name="allowedMethods" value="GET,POST,OPTIONS"/>
<property name="allowedOrigins" value="*"/>
<property name="allowedHeaders" value="*"/>
<property name="allowCredentials" value="true"/>
<property name="maxAge" value="1800"/>
</bean>
</entry>
</map>
</property>
</bean>

无需增加多余配置类,完美解决问题。

springmvc中跨域问题的更多相关文章

  1. React项目中跨域问题的解决方案

    刚刚找到到通过creat-react-app创建的项目中跨域问题的解决方案,记录下来以备后用. 如果接口地址为:    http://my.example.com/eg-api  则配置package ...

  2. SpringMVC跨域问题排查以及源码实现

    SpringMVC跨域问题排查以及源码实现 最近一次项目中,将SpringMVC版本从4.1.1升级到4.3.10,出现跨域失败的情况.关于同源策略和跨域解决方案,网上有很多资料. 项目采用的方式是通 ...

  3. SpringMvc跨域支持

    SpringMvc跨域支持 在controller层加上注解@CrossOrigin可以实现跨域 该注解有两个参数 1,origins  : 允许可访问的域列表 2,maxAge:飞行前响应的缓存持续 ...

  4. HTML中跨域请求天气粗略效果

    HTML中跨域请求天气粗略效果 html+css部分: <style> table{ border:1px red solid; border-collapse: collapse; ma ...

  5. 解决vue-cli项目开发中跨域问题

    一.开发环境中跨域 使用 Vue-cli 创建的项目,开发地址是 localhost:8080,需要访问非本机上的接口http://10.1.0.34:8000/queryRole.不同域名之间的访问 ...

  6. 关于springmvc跨域

    spingMVC 3.X跨域 关于跨域问题,主要用的比较多的是cros跨域. 详细介绍请看https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Acces ...

  7. springmvc跨域

    //mvc默认是text/plain;charset=ISO-8859-1@RequestMapping(value = "/xxx", produces = "appl ...

  8. springmvc跨域(转)

    跨域资源共享 CORS 详解  原文链接:http://www.ruanyifeng.com/blog/2016/04/cors.html   作者: 阮一峰 日期: 2016年4月12日 CORS是 ...

  9. SpringMvc 跨域处理

    导读 由于浏览器对于JavaScript的同源策略的限制,导致A网站(Ajax请求)不能通过JS去访问B网站的数据,于是跨域问题就出现了. 跨域指的是域名.端口.协议的组合不同就是跨域. http:/ ...

随机推荐

  1. 《基于WEB的独立学院补考重修管理系统研究》论文笔记(二十)

    <基于WEB的独立学院补考重修管理系统研究>论文笔记(1) 一.基本信息 标题:基于WEB的独立学院补考重修管理系统研究 时间:2016 来源:南通大学杏林学院 关键词:WEB:补考重修管 ...

  2. python 中的tile函数,shape函数,sum函数

    1.tile函数: tile函数是模板numpy.lib.shape_base中的函数.函数的形式是tile(A,reps) A的类型几乎所有类型都可以:array, list, tuple, dic ...

  3. linux 查看某个目录下文件的数量

    今日思语:时间是个庸医,却自称能包治百病~ 在linux环境下,经常需要查看某个文件目录下的文件数有多少,除了进入当前目录下查看,还可以使用命令: ls -l | grep "^-" ...

  4. 深入解析pure virtual function call

    在本文中,我们将不解释为什么会提示“纯虚拟函数调用”和如何提示“纯虚拟函数调用”,而是详细解释在win32平台的构造函数/析构函数中直接/间接调用纯虚拟函数时程序本身.在开始时,将显示一个经典示例,在 ...

  5. Chocolatey 方便的windows 包管理工具

    windows 在包管理上一般大家都是网上下载二进制文件或者就是通过软件管家进行安装,这些对于开发人员可能就有点不是 很专业了, Chocolatey 是一个不错的windows 软件包管理工具 安装 ...

  6. 12-ESP8266 SDK开发基础入门篇--PWM,呼吸灯

    https://www.cnblogs.com/yangfengwu/p/11094085.html PWM其实没有什么,就是看着官方给的API,,,然后就是用呗 对了,其实对于RTOS SDK版本的 ...

  7. windowns server 2008 r2 AD桌面文件重定向设置

    1.创建将要进行重定向的组(此处为chongdingxiangzu) 2.选择要重定向的用户,并将此用户加入到要重定向的组里 3.打开组策略管理,右击刚才用户所属的组织单位(OU)进行新建GPO(此处 ...

  8. Linux 系统管理——账号管理

    一.用户账号管理 1.用户账户概述 用户账户的常见分类: 超级用户:root  uid=0  gid=0  权限最大 普通用户:uid>=500  做一般权限的系统管理,权限有限. 程序用户:1 ...

  9. 计蒜客 38228. Max answer-线段树维护单调栈(The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer 南昌邀请赛网络赛) 2019ICPC南昌邀请赛网络赛

    Max answer Alice has a magic array. She suggests that the value of a interval is equal to the sum of ...

  10. CSP2019自闭记

    为什么我之前没有写呢,是因为我总是考的太lj,于是就不想写了. 这次不管考没考好都要强迫自己写,因为这是第一次参加提高组+第一次参加CSP. 当然什么初赛/复赛试题/答案什么的是不会出现的. Day ...