Questions|跨域问题(“No 'Access-Control-Allow-Origin' header is present on the requested resource”)
【Questions|跨域问题(“No 'Access-Control-Allow-Origin' header is present on the requested resource”)】今天试了一下只用SpringMVC写接口,然后用本地的 ajax 去访问接口请求 json 数据,但浏览器报了一个“跨域”请求的错误,个人理解的跨域问题是,服务端和客户端的请求不在同一个域名下,但是我这都是在本机上部署的呀,这是什么问题呢?
原来我理解的“跨域”只是我个人的理解,在网上搜索解决方法,都是在SpringMVC 的服务器中写一个过滤器 Filter ,让 Filter 拦截请求,在response返回的时候加上一些请求头,这样就可以解决跨域的问题,类似于下面这样:
package com.kay.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Created by kay on 2017/12/7.
*/
public class CrossFilter implements Filter{
public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response= (HttpServletResponse) servletResponse;
String origin= servletRequest.getRemoteHost()+":"+servletRequest.getRemotePort();
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Headers", "Authentication");
/* response.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,DELETE");
response.setHeader("Access-Control-Max-Age","3600");
response.setHeader("Access-Control-Allow-Credentials","true");
*/
filterChain.doFilter(servletRequest,servletResponse);
}
public void destroy() {}
}
然后在web.xml中配置一下filter:
cors
com.kay.filter.CrossFilter
cors
/*
而在前端请求中,ajax 参数中的 dataType 要改为 “text”,不支持 dataType:”json”:
$.ajax({
url:"http://localhost:8081/list",
type:"GET",//请求方式
dataType:"text",//返回参数的类型 text/html
success:function (data) {//请求成功后调用的函数
alert("succ:"+data);
},
error:function (textStatus) {//请求失败后调用的函数
alert("fail");
}
})
为什么要加像 ”Access-Control-Allow-Origin“ 这样的响应头就能解决跨域问题呢?
跨域请求又叫,”跨域资源共享”(Cross-origin resource sharing),它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。CORS需要浏览器和服务器同时支持。
服务器会检查 浏览器的请求中是否 有 ”Origin“请求头,它是在跨域请求发出的时候 由浏览器自动加上的,然后服务器检查这个 请求头设置的 服务器的源(来自于哪里)来判断是否响应,是否允许这个请求访问,我们会看到设置
response.setHeader("Access-Control-Allow-Origin", "*");
它的意思就是允许所有的源访问服务器,也可以只将自己的源(域名)设置就不允许其他的源访问。更加详细的解释,
请访问 阮一峰 老师的日志《跨域资源共享 CORS 详解》http://www.ruanyifeng.com/blog/2016/04/cors.html
推荐阅读
- =======j2ee|spring用注解实现注入的@resource,@autowired,@inject区别
- jar|springboot项目打成jar包和war包,并部署(快速打包部署)
- 数据库|效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)...
- java人生|35K 入职华为Java开发那天,我哭了(这 5 个月做的一切都值了)
- Java毕业设计项目实战篇|Java项目:在线嘿嘿网盘系统设计和实现(java+Springboot+ssm+mysql+maven)
- 微服务|微服务系列:服务发现与注册-----Eureka(面试突击!你想了解的Eureka都在这里.持续更新中......)
- java|ApplicationListener和SpringApplicationRunListener的联系
- Spring|SpringSecurity--自定义登录页面、注销登录配置
- 性能|性能工具之 Jmeter 通过 SpringBoot 工程启动
- 代码狂魔|Spring源码分析之IOC容器初始化流程