什么是跨域
跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。
同源策略限制了一下行为:
- Cookie、LocalStorage 和 IndexDB 无法读取
- DOM 和 JS 对象无法获取
- Ajax请求发送不出去
发
常见的跨域场景
所谓的同源是指,域名、协议、端口均为相同。
http://www.nealyang.cn/index.html 调用 http://www.nealyang.cn/server.php 非跨域 http://www.nealyang.cn/index.html 调用 http://www.neal.cn/server.php 跨域,主域不同 http://abc.nealyang.cn/index.html 调用 http://def.neal.cn/server.php 跨域,子域名不同 http://www.nealyang.cn:8080/index.html 调用 http://www.nealyang.cn/server.php 跨域,端口不同 https://www.nealyang.cn/index.html 调用 http://www.nealyang.cn/server.php 跨域,协议不同 localhost 调用 127.0.0.1 跨域
可使用JSONP
另一种方式在服务端使用过滤解决
自行编写Filter解决跨域
@Override public void init(FilterConfig config) throws ServletException { //得到配置参数 String initParameter = config.getInitParameter("allow-origin"); //首次加载判断 if(initParameter != null ){ if(initParameter.equals("*")){ origins = new String[]{"*"}; }else{ origins = initParameter.split(","); } } } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest; HttpServletResponse resp = (HttpServletResponse) servletResponse; //跨域,得到头部的Origin String origin = req.getHeader("Origin"); if(origin != null && !origin.isEmpty()){ for (String s : origins) { if(s.equals("*") || s.equals(origin)){ //设置头部响应回去 resp.setHeader("Access-Control-Allow-Origin",origin); break; } } filterChain.doFilter(req,resp); } } @Override public void destroy() { } }
<filter> <filter-name>myCors</filter-name> <filter-class>com.dz147.Filter.MyCorsFilter</filter-class> <init-param> <param-name>allow-origin</param-name> <param-value>*</param-value> </init-param> </filter> <filter-mapping> <filter-name>myCors</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
如有使用SSM框架提供了一个更加便捷的方式只需要在Controll类上面或者某个方法上面写上跨域的注解即可