Springmvc跨域问题解决
2017-12-23 18:50
375 查看
关于springmvc跨域
spingMVC 3.X跨域
关于跨域问题,主要用的比较多的是cros跨域。
详细介绍请看https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
但是,在springmvc+angularjs下支持跨域请求时,出现复杂跨域场景(post + json)失败的情况。
开始的跨域配置如下:
spring-dispatcher-servlet.xml中配置如下:
针对简单跨域没问题。但是针对post+json请求却失败,提示跨域失败。
跟踪springmvc源码到FrameworkServlet中的doOption方法,发现,接受了option预检,但是spring主动返回allow,没有支持跨域的配置。
因此,加入新的配置如下:
web.xml配置如下:
此时,option请求被CrossFilter过滤器接入并赋予跨域响应头,同时也进入FrameworkServlet中的doOption方法。查看浏览器控制台,发现option请求返回支持跨域信息,后续的post请求进入controller。
springMVC 4.X跨域
升级spring版本的后,上述跨域并不支持所有浏览器。经测试,Safari正常,chrome异常。重新翻了一下最新的文档后,得到最新的跨域配置如下:
相比3.x系列,简单了很多。
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" reque 4000 st 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系列,简单了很多。
相关文章推荐
- SpringMvc解决跨域问题
- SpringMVC解决跨域问题
- SpringMvc解决跨域问题
- springmvc 数据传输跨域问题 access control allow origin——JSONP数据格式解决
- 基于springMVC与angularJS的跨域问题解决方案
- SpringMvc解决跨域问题
- springmvc http 接口使用 img 方式解决跨域问题
- 完美解决SpringMVC对Ajax访问WebSocket接口的跨域问题(二)
- SpringMVC解决跨域问题
- SpringMvc解决跨域问题
- springMVC解决跨域jsonp乱码问题的三种方法
- 完美解决SpringMVC对Ajax访问Restful接口的跨域问题(一)
- SpringMVC解决跨域问题
- SpringMVC之前后台分离开发,联调时的跨域问题的解决方法
- Springmvc自定义过滤器Filter,解决跨域问题
- springMVC 基于XML的配置-解决跨域问题
- springmvc解决跨域问题
- SpringMVC返回jsonp解决跨域问题
- springmvc解决跨域问题
- 跨域解决 & ajax post 请求springmvc ctr 问题