问题产生:已拦截跨源请求:同源策略禁止读取
在网页与接口不处于同一个服务器的前提下(前端代码放在A服务器,接口牌B服务器),ajax请求接口的时候,浏览器会为了安全问题,在接口返回数据的时候,对响应头进行检验。如果响应头中没有Access-Control-Allow-Origin:*和Access-Control-Allow-Headers:Origin, X-Requested-With, Content-Type, Accept这两个响应头的话,就会提示“已拦截跨源请求:同源策略禁止读取”错误。
解决思路:在接口响应头中加入Access-Control-Allow-Origin和Access-Control-Allow-Headers
方法一:直接在返回对象Response中添加header
方法二:加入过滤器,在过滤器filter中对返回对象Response添加header
方法三:在拦截器中对返回对象Response添加header
提示:方法一的作法并不实用,方法二比较实用而且能在任意项目中使用,方法三需要配合spring mvc、struts2等框架才能使用
案例
本人使用的是spring mvc框架,因此使用拦截器来处理“同源
策略禁止读取”这个问题。测试发现,在拦截器的preHandle方法中添加请求头,才会起作用。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
*
* @author 劳先生
* 解决浏览器出现的【已拦截跨源请求:同源策略禁止读取】问题
*/
public class AllowOriginIntercepter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}