在用Spring MVC解决跨域请求之前,我们先来看看什么是跨域。跨域限制是浏览器行为,不是服务器行为。 浏览器认为地址栏输入时安全的,所以不限制认为是跨域。所以,只要服务器配置为所有域都可以进行请求,那么不在服务器运行的HTML就可以完成http请求。
为了更好的解决Spring MVC跨域请求,我们再来看看跨域的核心方法,同源策略:同源指的是域名(或IP),协议,端口都相同,不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况下,不能读写对方的资源。同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。
设想这样一种情况:A网站是一家银行,用户登录以后,又去浏览其他网站。如果其他网站可以读取A网站的Cookie,会发生什么?
很显然,如果Cookie包含隐私(比如存款总额),这些信息就会泄漏。更可怕的是,Cookie往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。由此可见,"同源政策"是必需的,否则 Cookie 可以共享,互联网就毫无安全可言了。
同源策略限制以下几种行为:
-Cookie、LocalStorage 和 IndexDB 无法读取
-DOM 和 Js对象无法获得
-AJAX 请求不能发送
SpringMVC解决跨域问题方式:
1.JSONP
2.CORS
3.WebSocket
下面着重介绍第二种CORS方法:
1、创建类
package com.hzc.util;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;
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);
}
}
2、配置web.xml
<filter>
<filter-name>cors</filter-name>
<filter-class>com.hzc.util.CrossFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cors</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
此时,option请求被CrossFilter过滤器接入并赋予跨域响应头,同时也进入FrameworkServlet中的doOption方法。查看浏览器控制台,发现option请求返回支持跨域信息,后续的post请求进入controller。
到这里就介绍完了Spring MVC解决跨域请求的所有内容,当然Spring MVC采用CORS方法解决跨域请求的整个过程如上面所述,只有简单的两步。至于其他的两种方法在本站的Spring MVC视频教程中有详细的讲解,觉得有需要的小伙伴可以前去观看学习。
QCode09-04 14:38
Code大师09-04 14:50
不写代码你养我啊08-23 11:14
不写代码你养我啊09-17 18:02
要学习了06-18 18:13