SpringMVC cors配置
目前跨域有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配置相关推荐
- 使用注解开发SpringMVC详细配置教程
目录 1.使用注解开发SpringMVC 1.新建一个普通的maven项目,添加web支持 2.在pom.xml中导入相关依赖 3.配置web.xml 4.编写SpringMVC配置文件 1. 自动扫 ...
- 19-spring学习-springMVC环境配置
新建一共环境,添加spring支持,就可以开发springMVC了. 既然是springMVC,就必须为其定义相关配置. 1,springMVC所有配置都需要在applicationContext.x ...
- SpringMVC自动配置||如何修改SpringBoot的默认配置
SpringMVC自动配置 1. Spring MVC auto-configuration Spring Boot 自动配置好了SpringMVC 以下是SpringBoot对SpringMVC的默 ...
- SpringMVC基础配置及使用
SpringMVC基础配置及使用 SpringMVC: 1.SpringMVC和Spring的关系: 软件开发的三层架构: web层[表示层.表现层]---->Service层----& ...
- tns03505 无法解析名称_SpringBootWeb源码解析SpringMVC自动配置
SpringMVC自动配置 在 Spring Boot 中引入了 spring-boot-starter-web 依赖,并完成了 DispatcherServlet 的自动配置之后,便会通过 WebM ...
- 框架写mysql插入为空_学习springMVC框架配置遇到的问题-数据写入不进数据库时的处理办法...
Idea简单SpringMVC框架配置 前边已经介绍过了Struts在Idea上的配置,相对于Struts来说,我觉得SpringMVC有更多的优势,首先Struts是需要对action进行配置,页面 ...
- SpringBoot之SpringMVC自动配置
关于SpringBoot中的SpringMVC自动配置的一些思考 : 自动配置 Spring Boot 自动配置好了SpringMVC 以下是SpringBoot对SpringMVC的默认配置:(We ...
- SprinBoot实现接管SpringMVC自定义配置
只需要添加一个类型为WebMvcConfigurer的类,并使用注解@Configuration标注即可重写SpringMVC的配置,如果想要全面接管,即只有写过的配置生效,不使用默认配置,再添加注解 ...
- SpringMVC、SpringMVC XML配置(纯XML方式)
1.引入SrpingMVC所使用的Java包: cglib-nodep-2.1_3.jar.commons-logging.jar.spring-aspects-4.1.7.RELEASE.jar.s ...
最新文章
- BZOJ 2140 稳定婚姻(强联通分量判环)【BZOJ修复工程】
- local reference table overflow 内存泄露
- jQuery笔记总结篇
- 剑指offer-求二叉树深度
- Jira filter subscribe issues
- Windows phone 开发基础(14) WP8磁贴分两种的创建方式(内建和外建)
- Python爬虫入门_之urllib2urllib
- C语言程序设计孙鸿飞PPT,清华大学出版社-图书详情-《C语言程序设计》
- Spark ML机器学习
- mysql可以装到其他端口吗_linux下怎么在另一个端口安装高版本mysql
- 前端经典练手项目|用 JavaScript 实现网页版扫雷
- 电子计算机出现的背景,世界第一台电子计算机产生的背景是什么
- 如何选择SAP培训?
- 本田智能驾驶功能介绍-TSR/CTM/MVC360
- lightoj 1224(trie)
- 爬取公众号的文章,同时处理图片不显示问题(JAVA)
- 算法(5)动态规划法
- java的体系结构_java体系结构介绍
- TMC6300-LA:微型BLDC/PMSM驱动
- 一个完整的SEO优化方案