SpringMVC 4.2 增加CORS跨域

1 入门干货 http://blog.csdn.net/isea533/article/details/50449907  --Spring MVC 4.2 增加 CORS 支持  --必看

   http://blog.csdn.net/wabiaozia/article/details/78771709  --我写的跨域小结 --必看

    跨域CORS和防止CSRF的几种方式:https://my.oschina.net/hosee/blog/903665  --必看

    https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS



https://my.oschina.net/hehongbo/blog/779802

http://www.imooc.com/article/7719

4 几种解决方案http://www.cnblogs.com/mafly/p/cors.html

5 代码干货 http://www.jianshu.com/p/d05303d34222

6 当然最好还是看官方文档 springmvc4.3.4 第27条 http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/

7 token 问什么放在header?http://blog.csdn.net/wabiaozia/article/details/75196787

8 几种跨域方式--阮一峰 

  http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html 浏览器同源政策及其规避方法

  http://www.ruanyifeng.com/blog/2016/04/cors.html  跨域资源共享 CORS 详解

  开发文档 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS(预请求和真正发送请求)

附录 

请求的流程先经过filter再到sevlet(doget dopost),web.xml中元素执行的顺序listener->filter->struts拦截器->servlet。

http://blog.csdn.net/wabiaozia/article/details/77124176

 Tomcat源码分析(二)------ 一次完整请求的里里外外 http://blog.csdn.net/cutesource/article/details/5040417

Servlet中的过滤器Filter详解 http://blog.csdn.net/sd0902/article/details/8395641

spingMVC 3.X跨域?

如何支持复杂跨域  http://www.cnblogs.com/asfeixue/p/4363372.html

关于跨域问题,主要用的比较多的是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中配置如下:
<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系列,简单了很多


OncePerRequestFilter的作用


Spring MVC中各个filter的用法

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菠萝科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值