解决浏览器出现的【已拦截跨源请求:同源策略禁止读取】问题

问题产生:已拦截跨源请求:同源策略禁止读取

在网页与接口不处于同一个服务器的前提下(前端代码放在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 {

    }

}
  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
跨域访问的问题可以通过以下几种方式来解决: 1. JSONP:JSONP是一种跨域访问的解决方案,它的原理是利用script标签没有跨域限制的特性,通过动态创建script标签的方式来获取跨域数据。服务器端需要接收一个回调函数的参数,并将返回的数据作为参数传递给该回调函数,最终将数据以js代码的形式返回给客户端。客户端可以通过定义该回调函数并在script标签中指定回调函数名的方式来获取到跨域数据。 2. CORS:跨域资源共享(CORS)是一种通过添加特定的HTTP头来允许跨域访问的解决方案。服务器端需要在响应头中添加Access-Control-Allow-Origin字段来指定允许跨域访问的域名或通配符(*),并且可以通过其他Access-Control-*字段来控制请求的方法、头信息等。 3. 代理:代理是一种通过在服务端转发请求来实现跨域访问的解决方案。客户端通过向代理服务器发送请求,代理服务器再将请求发送给目标服务器,并将目标服务器返回的数据返回给客户端。由于请求是由代理服务器发送的,因此不存在跨域访问的问题。 4. postMessage:postMessage是一种通过window对象的postMessage方法来实现跨域通信的解决方案。客户端通过调用postMessage方法将数据发送给另一个窗口,另一个窗口可以通过监听message事件来获取数据。由于postMessage方法不受同源策略的限制,因此可以实现跨域通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值