如果是springboot应用:增加一个全局配置就可以了
package org.nf.config.system;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @Description 跨域配置
* @Date 2019/1/27 13:31
**/
@Configuration
public class CORSConfig {
@Bean
public WebMvcConfigurer corsConfigurer(){
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("*")
.allowedOrigins("*");
}
};
}
}
跨域指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript 施加的安全限制。(浏览器也不是对于从所有网站请求来的脚本都会执行,只有同源的脚本才会执行)
协议、域名、端口号都相同叫同源
协议、域名、端口号只要有一个不同,就叫非同源(跨域)
注意:http://localhost:8080/index.html 调用 http://127.0.0.1:8080/welcom.jsp 虽然localhost等同于 127.0.0.1 但是也是非同源的。 img、iframe、script 等标签的 src 属性是特例,它们是可以访问非同源网站的资源的。
对于非同源的会有如下情况:
1、Cookie、LocalStorage 和 IndexDB 无法读取
2、DOM 和 Js对象无法获得
3、AJAX 请求不能发送
解决方式如下:
nginx 转发,HttpClient 请求转发(服务器端使用HttpClient类对象向跨域的服务器请求数据,再转发给前端),JSONP 方式(----请求的是个脚本的地址------使用 JSONP模式来请求数据的时候服务端返回的是一段可执行的 JavaScript代码。因为jsonp 跨域的原理就是用的动态加载 script的src ,所以我们只能把参数通过 url的方式传递,所以jsonp的 type类型只能是get !【最终渲染在界面的是
//对于上面的JSONP 请求,其实jQuery会转化为
<script type="text/javascript" src="http://localhost:8080/JavaWeb01/getPassWord?userName=Tom&backFunction=jQuery3047_153227&_=15228">
</script>
】),response 添加 header
//*表示支持所有网站访问,也可以额外配置相应网站
resp.setHeader("Access-Control-Allow-Origin", "*");
jsonp的
$.ajax({
type:"get",
async:false,
url:"http://localhost:8080/JavaWeb01/getPassWordByUserNameServlet?userName=Tom",
dataType:"jsonp",//数据类型为jsonp
jsonp:"backFunction",//服务端用于接收callBack调用的function名的参数
success:function (data) {
alert(data["passWord"]);
},
error:function () {
alert("error");
}
});
jsonp相应的后端代码
@WebServlet("/getPassWordByUserNameServlet")
public class UserServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName = req.getParameter("userName");
String passWord = null;
if(userName != null){
passWord = "123";
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("passWord",passWord);
//1、第一种方法:*表示支持所有网站访问,也可以额外配置相应网站
//resp.setHeader("Access-Control-Allow-Origin", "*");
//2、第二种方法:jsonp
String backFunction = req.getParameter("backFunction");
resp.getWriter().println(backFunction+"("+jsonObject.toJSONString()+")");
//resp.getWriter().println(jsonObject.toJSONString());
}
}
使用注解解决跨域问题
对于spring应用或者springboot应用,一般使用注解都是可以解决跨域问题
如果加了@CrossOrigin注解还是有跨域问题的话,就要考虑是否有缓存/前端是否请求有问题等了
参考:
如何解决跨域问题
https://www.cnblogs.com/ysocean/p/9380551.html