目前跨域有2种解决方案

1、jsonp:这种方式比较古老。 需要前后端配合 这里就不多说了 。 好处就是兼容老的浏览器

2、cors:这种方式是目前的主流。 CORS就是。。什么什么共享。 原理呢。就是服务器在response里面配置上各种允许。就好了。

cors又分2种

网上资料很多。我这里简单概述一下

1、简单请求:平常get、post(表单提交) 啥头信息都不加的情况 就是简单请求

2、复杂请求:如:post 传递 json形式的data 就是复杂请求

一、自定义Filter

之前api项目一直使用CorsFilter 。原理其实就是

写一个Filter在response中增加各种允许。 允许什么域名来访问,允许什么头信息之类的

public class CorsFilter implements Filter {  private String allowOrigin;  private String allowMethods;  private String allowCredentials;  private String allowHeaders;  private String exposeHeaders;  @Override  public void init(FilterConfig filterConfig) throws ServletException {  allowOrigin = filterConfig.getInitParameter("allowOrigin");  allowMethods = filterConfig.getInitParameter("allowMethods");  allowCredentials = filterConfig.getInitParameter("allowCredentials");  allowHeaders = filterConfig.getInitParameter("allowHeaders");  exposeHeaders = filterConfig.getInitParameter("exposeHeaders");  System.out.println("allowOrigin = " + allowOrigin);System.out.println("allowMethods = " + allowMethods);System.out.println("allowCredentials = " + allowCredentials);System.out.println("allowHeaders = " + allowHeaders);System.out.println("exposeHeaders = " + exposeHeaders);}  @Override  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {  HttpServletRequest request = (HttpServletRequest) req;  HttpServletResponse response = (HttpServletResponse) res;  if (StringUtil.isNotEmpty(allowOrigin)) {  List<String> allowOriginList = Arrays.asList(allowOrigin.split(","));  if (allowOriginList != null && allowOriginList.size() > 0) {  String currentOrigin = request.getHeader("Origin");  if (allowOriginList.contains(currentOrigin)) {  response.setHeader("Access-Control-Allow-Origin", currentOrigin);  }  }  }  if (StringUtil.isNotEmpty(allowMethods)) {  response.setHeader("Access-Control-Allow-Methods", allowMethods);  }  if (StringUtil.isNotEmpty(allowCredentials)) {  response.setHeader("Access-Control-Allow-Credentials", allowCredentials);  }  if (StringUtil.isNotEmpty(allowHeaders)) {  response.setHeader("Access-Control-Allow-Headers", allowHeaders);  }  if (StringUtil.isNotEmpty(exposeHeaders)) {  response.setHeader("Access-Control-Expose-Headers", exposeHeaders);  }  chain.doFilter(req, res);  }  @Override  public void destroy() {  }
}  
<filter><filter-name>corsFilter</filter-name><filter-class>com.yunxin.iambuyer.ucenter.filter.CorsFilter</filter-class><init-param><param-name>allowOrigin</param-name><param-value>http://XXX</param-value></init-param><init-param><param-name>allowMethods</param-name><param-value>GET,POST,PUT,DELETE,OPTIONS</param-value></init-param><init-param><param-name>allowCredentials</param-name><param-value>true</param-value></init-param><init-param><param-name>allowHeaders</param-name><param-value>Content-Type</param-value></init-param></filter><filter-mapping><filter-name>corsFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

二、springMVC自带的配置

在SpringMVC 配置文件中 增加

<!--cors跨域支持-->
<mvc:cors><mvc:mapping path="/**"allowed-origins="http://127.0.0.1:8020,http://127.0.0.1:8081"allowed-methods="GET,POST,PUT,DELETE,OPTIONS"allowed-headers="Content-Type,token"allow-credentials="true"max-age="123" />
</mvc:cors>

需要注意的有一点

1、通常我们在项目中都有增加拦截器、过滤器。

在跨域首次会发送OPTIONS申请。如果这时候被过滤器拦截下来。并且返回业务的错误信息。会提示跨域。

这里是因为在这个错误信息返回的时候没有走springMVC配置的CORS跨域配置。 所以需要手动在返回的响应中。增加这个

比如我这个权限校验的过滤器

@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {String method = request.getMethod();//options请求直接放行if(method.equals("OPTIONS")){return true;}//过滤不需要过滤接口boolean isOver = RenderUtil.inContainURL(request, jwtProperties.getJwt_noAuthPath());if (isOver) {return true;}String msg = "请登录后再操作";/*String content = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx582097e6b4749e25&redirect_uri=http%3A%2F%2Fapi.ruhexiu.com%2Frest-rp%2Fuser%2FwxLogin&response_type=code&scope=snsapi_userinfo&state=#wechat_redirect";*/Map<String, String> map = new HashMap<>();map.put("ret", "202");map.put("msg", msg);map.put("content",msg);final String requestHeader = request.getHeader(jwtProperties.getJwt_header());String authToken = null;if (requestHeader != null && requestHeader.startsWith("Bearer ")) {authToken = requestHeader.substring(7);//验证token是否过期,包含了验证jwt是否正确try {boolean flag = jwtTokenUtil.isTokenExpired(authToken);if (flag) {RenderUtil.renderJson(response, map,request);return false;}} catch (JwtException e) {//有异常就是token解析失败RenderUtil.renderJson(response, map,request);return false;}} else {//header没有带Bearer字段RenderUtil.renderJson(response, map,request);return false;}return true;}

比如上面在

RenderUtil.renderJson(response, map,request);

这行代码的时候就会返回错误信息。所以在这个返回响应里面需要增加对CORS跨域的支持

  /*** 渲染json对象*/public static void renderJson(HttpServletResponse response, Object jsonObject,HttpServletRequest request) {try {response.setContentType("application/json");response.setCharacterEncoding("UTF-8");//这里设置跨域response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));response.setHeader("Access-Control-Allow-Methods","GET,POST,PUT,DELETE,OPTIONS");response.setHeader("Access-Control-Allow-Headers","*");response.setHeader("Access-Control-Allow-Credentials","true");response.setHeader("Access-Control-Max-Age","123");PrintWriter writer = response.getWriter();writer.write(JSON.toJSONString(jsonObject));} catch (IOException e) {e.printStackTrace();}}

这样配置上springMVC提供的CORS配置。好使。

over~

SpringMVC cors配置相关推荐

  1. 使用注解开发SpringMVC详细配置教程

    目录 1.使用注解开发SpringMVC 1.新建一个普通的maven项目,添加web支持 2.在pom.xml中导入相关依赖 3.配置web.xml 4.编写SpringMVC配置文件 1. 自动扫 ...

  2. 19-spring学习-springMVC环境配置

    新建一共环境,添加spring支持,就可以开发springMVC了. 既然是springMVC,就必须为其定义相关配置. 1,springMVC所有配置都需要在applicationContext.x ...

  3. SpringMVC自动配置||如何修改SpringBoot的默认配置

    SpringMVC自动配置 1. Spring MVC auto-configuration Spring Boot 自动配置好了SpringMVC 以下是SpringBoot对SpringMVC的默 ...

  4. SpringMVC基础配置及使用

    SpringMVC基础配置及使用 SpringMVC: 1.SpringMVC和Spring的关系:     软件开发的三层架构: web层[表示层.表现层]---->Service层----& ...

  5. tns03505 无法解析名称_SpringBootWeb源码解析SpringMVC自动配置

    SpringMVC自动配置 在 Spring Boot 中引入了 spring-boot-starter-web 依赖,并完成了 DispatcherServlet 的自动配置之后,便会通过 WebM ...

  6. 框架写mysql插入为空_学习springMVC框架配置遇到的问题-数据写入不进数据库时的处理办法...

    Idea简单SpringMVC框架配置 前边已经介绍过了Struts在Idea上的配置,相对于Struts来说,我觉得SpringMVC有更多的优势,首先Struts是需要对action进行配置,页面 ...

  7. SpringBoot之SpringMVC自动配置

    关于SpringBoot中的SpringMVC自动配置的一些思考 : 自动配置 Spring Boot 自动配置好了SpringMVC 以下是SpringBoot对SpringMVC的默认配置:(We ...

  8. SprinBoot实现接管SpringMVC自定义配置

    只需要添加一个类型为WebMvcConfigurer的类,并使用注解@Configuration标注即可重写SpringMVC的配置,如果想要全面接管,即只有写过的配置生效,不使用默认配置,再添加注解 ...

  9. SpringMVC、SpringMVC XML配置(纯XML方式)

    1.引入SrpingMVC所使用的Java包: cglib-nodep-2.1_3.jar.commons-logging.jar.spring-aspects-4.1.7.RELEASE.jar.s ...

最新文章

  1. BZOJ 2140 稳定婚姻(强联通分量判环)【BZOJ修复工程】
  2. local reference table overflow 内存泄露
  3. jQuery笔记总结篇
  4. 剑指offer-求二叉树深度
  5. Jira filter subscribe issues
  6. Windows phone 开发基础(14) WP8磁贴分两种的创建方式(内建和外建)
  7. Python爬虫入门_之urllib2urllib
  8. C语言程序设计孙鸿飞PPT,清华大学出版社-图书详情-《C语言程序设计》
  9. Spark ML机器学习
  10. mysql可以装到其他端口吗_linux下怎么在另一个端口安装高版本mysql
  11. 前端经典练手项目|用 JavaScript 实现网页版扫雷
  12. 电子计算机出现的背景,世界第一台电子计算机产生的背景是什么
  13. 如何选择SAP培训?
  14. 本田智能驾驶功能介绍-TSR/CTM/MVC360
  15. lightoj 1224(trie)
  16. 爬取公众号的文章,同时处理图片不显示问题(JAVA)
  17. 算法(5)动态规划法
  18. java的体系结构_java体系结构介绍
  19. TMC6300-LA:微型BLDC/PMSM驱动
  20. 一个完整的SEO优化方案

热门文章

  1. 李彦宏布局人工智能,2014年百度都研发了哪些“未来产品”
  2. 小程序私有化部署,米筷如何异军突起?
  3. 2023中国智慧医院建设、装备及应用展览会
  4. vue+element-ui el-pagination 分页后 导出全部数据
  5. 协方差与联合概率密度的关系、协方差的几何意义
  6. hive instr 函数
  7. Kernel Exception 问题分析详解
  8. 上一篇、下一篇之实现思路
  9. 也谈新基建,生态新思路
  10. 讨论:如何解决系统启动盘符飘逸的问题