解决方案:
1,原声ajax中提供了些属性:
dataType:‘jsonp‘
但是我没测试过。
2:如果你项目没有用框架,servlet实现的,那在你需要跨域请求的那个servlet配置中增加如下配置(注意红色部分)
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>xxx.xx.xx.xx.pressAgencyCtrl</servlet-class>
<init-param>
<description>跨域访问</description>
<param-name>accessControlAllowOrigin</param-name>
<param-value>*</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>abc</servlet-name>
<url-pattern>/kyqq</url-pattern>
</servlet-mapping>
3:如果你使用了框架,比如springmvc等,提供以下两种方式,创建一个filter,在filter中实现,如下
view pla----------------------------------------------------------------------
- package xxxxxxxxxxxxxxx;
- import java.io.IOException;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.http.HttpServletResponse;
- public class Kuayu implements Filter {
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- }
- @Override
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- throws IOException, ServletException {
- //在此处实现跨域设置
- HttpServletResponse httpResponse=(HttpServletResponse) response;
- httpResponse.setHeader("Access-Control-Allow-Origin", "*");//设置所有的请求都可跨域请求
- httpResponse.setHeader("Access-Control-Allow-Headers", "Authentication");//认证
- chain.doFilter(request, httpResponse);
- }
- @Override
- public void destroy() {
- }
- }
- web.xml 配置
- <filter>
- <filter-name>kuayuqingqiu</filter-name>
- <filter-class>com.xx.xx.Kuayu</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>kuayuqingqiu</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-------------------------------------------------------------------------------------------
在spring框架4.2版本后,Spring给出了注解的方式解决问题。
即在Controller控制器中,在Controller注解上方添加@CrossOrigin注解。
最后来点名词解释:
Access-Control-Allow-Origin: 允许跨域访问的域,可以是一个域的列表,也可以是通配符"*"。这里要注意Origin规则只对域名有效,并不会对子目录有效。即http://foo.lwq/lxq/ 是无效的。但是不同子域名需要分开设置,这里的规则可以参照同源策略
Access-Control-Allow-Credentials: 是否允许请求带有验证信息,XMLHttpRequest请求的withCredentials标志设置为true时,认证通过,浏览器才将数据给脚本程序。
Access-Control-Expose-Headers: 允许脚本访问的返回头,请求成功后,脚本可以在XMLHttpRequest中访问这些头的信息
Access-Control-Max-Age: 缓存此次请求的秒数。在这个时间范围内,所有同类型的请求都将不再发送预检请求而是直接使用此次返回的头作为判断依据,非常有用,大幅优化请求次数
Access-Control-Allow-Methods: 允许使用的请求方法,以逗号隔开
Access-Control-Allow-Headers: 允许自定义的头部,以逗号隔开,大小写不敏感