ajax,post,get跨域请求报Access-Control-Allow-Origin 错误解决办法

背景了解:最近在做一个自动化校验的系统,这也是我第一次遇到页面和接口分开的项目,前端是用node.js跑的,后端是用tomcat,以下面登录功能为例,页面访问后端登录接口时,浏览器报以下错误。

has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource意思就是:

“已被CORS策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头”

原因:出于对用户信息的保护,也保证我们请求不产生混乱,浏览器的同源策略要求我们只能访问同源的资源,我页面服务器的端口是8888,tomcat的端口是8080,不同同源所以访问失败。

                                        图片来源:http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html

 

解决办法:网上的解决办法很多,我测试了下面两种简单的办法,亲测可用。

我的前端是vue.js+element,后端是java的ssm框架

方法一:既然说了“”请求的资源上不存在“Access-Control-Allow-Origin”标头””,name我就在controller文件对应的方法里给他添加一个标头就好了

    /**
     * 查询当前登录用户的信息
     *     DSY
     */
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    @ResponseBody
    public User login(HttpServletResponse response, @RequestParam(value="username")String username,@RequestParam(value="password")String password) {
        response.setHeader("Access-Control-Allow-Origin", "*");
    	return loginService.getUser(username, password);
    }

方法二:注意 !!!如果你用的也是spring框架,并且版本在4.2以上,可以用@CrossOrigin这个注解,括号中的url可以换成“”*“”,如果这个controller里有多个方法,注解可以直接写在类的最上边。

写在方法上

    /**
     * 查询当前登录用户的信息
     *	DSY
     */
    //写在方法上
    @CrossOrigin(origins = "http://localhost:8080/") // 实现跨域  要求spring的版本必须4.2以上
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    @ResponseBody
    public User login(HttpServletResponse response, @RequestParam(value="username")String username,@RequestParam(value="password")String password) {
    	return loginService.getUser(username, password);
    }

写在类上

/**
 * 登录相关
 *	DSY
 */
//写在类上,不用每个方法都写这个注解了
@CrossOrigin(origins="*",maxAge=3600)
@RestController
public class LoginController {

}

结语:解决办法还有很多,大家可以去尝试尝试,以后我遇到新的解决办法也会在博客里更新的。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当在使用 Ajax 发送跨域请求时,如果服务器未设置正确的跨域头部,浏览器会阻止请求并错 "No 'Access-Control-Allow-Origin'"。要解决这个问题,可以使用以下两种方法之一: 1. 通过后端设置 CORS 头部: 在服务器端代码中,设置响应头部 Access-Control-Allow-Origin,允许特定的源进行跨域访问。例如,在 PHP 中可以添加如下代码: ```php header('Access-Control-Allow-Origin: http://example.com'); ``` 这样,只有来自 http://example.com 的请求才能成功访问该服务器的资源。 2. 使用代理服务器: 可以通过在自己的服务器上设置代理来绕过跨域限制。你可以在后端创建一个接口,接收前端发送的请求并将其转发到目标服务器上,并将响应返回给前端。这样,前端实际上是与自己的服务器通信,而不是直接与目标服务器通信,避免了跨域问题。 以下是使用原生 JavaScript 进行 Ajax 请求的示例代码(假设使用第一种方法解决跨域问题): ```javascript var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://example.com/api/data', true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onreadystatechange = function() { if (xhr.readyState === XMLHttpRequest.DONE) { if (xhr.status === 200) { var response = JSON.parse(xhr.responseText); // 在这里处理响应数据 } else { console.error('请求失败:', xhr.status); } } }; xhr.send(); ``` 注意替换 `http://example.com/api/data` 为你实际请求的 URL。此外,如果需要发送 POST 请求,可以使用 `xhr.open('POST', url, true);` 并在 `send()` 方法中传递请求体数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值