什么是跨域?
跨域访问就是A网站的javascript代码访问B网站,然后浏览器就会自动阻止对跨域的访问也包括对后端数据的增删查,其中遵循了浏览器的同源策略。
发生跨域的情况?
只要协议名、域名、端口之间任意一与当前页面不同就会引起跨域问题。
举例:前端使用(http://localhost)去调用后端接口服务(http://debo.com)
解决方法
在实际开发中,可以使用CORS的方式,自己定义拦截器对开发测试环境解决跨域问题。
- CORS方式:使用我们自己定义的拦截器进行统一设置实现解决跨域问题。
拦截器代码:
package com.doubleme.core.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
*
* @ClassName CorsInterceptor
* @Description 跨域拦截器
* @Author DoubleME
* @CreateTime 2017年9月21日 上午12:43:26
*
*/
public class CorsInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
if (request.getHeader(HttpHeaders.ORIGIN) != null)
{
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
response.addHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
response.addHeader("Access-Control-Max-Age", "3600");
}
return true;
}
/**
* 在业务处理器处理请求执行完成后,生成视图之前执行的动作
* 可在modelAndView中加入数据,比如当前时间
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
/**
* 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
* 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
springmvc.xml配置文件
<mvc:interceptor>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<!-- 先拦截所有 -->
<mvc:mapping path="/**" />
<!-- 跨域拦截器类 -->
<bean class="com.doubleme.core.filter.CorsInterceptor"></bean>
</mvc:interceptor>