原文:
http://my.oschina.net/tbaby/blog/501333
http://www.shaoqun.com/a/106409.aspx
http://blog.csdn.net/newjueqi/article/details/27058765
http://blog.csdn.net/ye1992/article/details/43487623
一、CORS概述
跨源资源共享标准通过新增一系列 HTTP 头,让服务器能声明那些来源可以通过浏览器访问该服务器上的各类资源(包括CSS、图片、JavaScript 脚本以及其它类资源)。另外,对那些会对服务器数据造成破坏性影响的 HTTP 请求方法(特别是 GET 以外的 HTTP 方法,或者搭配某些MIME类型的POST请求),标准强烈要求浏览器必须先以 OPTIONS 请求方式发送一个预请求(preflight request),从而获知服务器端对跨源请求所支持 HTTP 方法。在确认服务器允许该跨源请求的情况下,以实际的 HTTP 请求方法发送那个真正的请求。服务器端也可以通知客户端,是不是需要随同请求一起发送信用信息(包括 Cookies 和 HTTP 认证相关数据)。
二、CORS原理
例如:域名A(http://a.example)的某 Web 应用程序中通过<img>标签引入了域名B(http://b.foo)站点的某图片资源(http://b.foo/image.jpg)。这就是一个跨域请求,请求http报头包含Origin: http://a.example,如果返回的http报头包含响应头 Access-Control-Allow-Origin: http://a.example (或者Access-Control-Allow-Origin: http://a.example),表示域名B接受域名B下的请求,那么这个图片就运行被加载。否则表示拒绝接受请求。
三、CORS跨域请求控制方法
1.http请求头
Origin: 普通的HTTP请求也会带有,在CORS中专门作为Origin信息供后端比对,表明来源域。
Access-Control-Request-Method: 接下来请求的方法,例如PUT, DELETE等等
Access-Control-Request-Headers: 自定义的头部,所有用setRequestHeader方法设置的头部都将会以逗号隔开的形式包含在这个头中
2.http响应头
然后浏览器再根据服务器的返回值判断是否发送非简单请求。简单请求前面讲过是直接发送,只是多加一个origin字段表明跨域请求的来源。然后服务器处理完请求之后,会再返回结果中加上如下控制字段
Access-Control-Allow-Origin: 允许跨域访问的域,可以是一个域的列表,也可以是通配符"*"。这里要注意Origin规则只对域名有效,并不会对子目录有效。即http://foo.example/subdir/ 是无效的。但是不同子域名需要分开设置,这里的规则可以参照同源策略
Access-Control-Allow-Credentials: 是否允许请求带有验证信息,
Access-Control-Expose-Headers: 允许脚本访问的返回头,请求成功后,脚本可以在
Access-Control-Max-Age: 缓存此次请求的秒数。在这个时间范围内,所有同类型的请求都将不再发送预检请求而是直接使用此次返回的头作为判断依据,非常有用,大幅优化请求次数
Access-Control-Allow-Methods: 允许使用的请求方法,以逗号隔开
Access-Control-Allow-Headers: 允许自定义的头部,以逗号隔开,大小写不敏感
如果程序猿偷懒将Access-Control-Allow-Origin设置为:Access-Control-Allow-Origin: * 允许任何来自任意域的跨域请求,那么久存在被 DDoS攻击的可能。
实现方式:
1、nginx配置文件配置:
server {
location / {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Max-Age' 3600;
add_header 'Content-Type' 'application/json;charset=UTF-8';
add_header 'Content-Length' 0;
return 200;
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Max-Age' 0;
#add_header 'Content-Type' 'application/json;charset=UTF-8';
add_header 'XDomainRequestAllowed' '1';
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Max-Age' 0;
#add_header 'Content-Type' 'application/json;charset=UTF-8';
add_header 'XDomainRequestAllowed' '1';
}
}
以上是根据具体的 POST、PUT、GET等方式的配置:
还可以直接在 server节点下直接配置:
add_header 'Access-Control-Allow-Origin' '*'; 就是最简单的配置
方法2:直接在tomcat安装目录下的lib中添加cors-filter-1.7.jar,java-property-utils-1.9.jar 这2个jar包,并且在业务项目的web.xml 中配置想要应的filter配置文件:
<filter>
- <filter-name>CORS</filter-name>
- <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
- <init-param>
- <param-name>cors.allowOrigin</param-name>
- <param-value>*</param-value>
- </init-param>
- <init-param>
- <param-name>cors.supportedMethods</param-name>
- <param-value>GET,POST,HEAD,PUT,DELETE</param-value>
- </init-param>
- <init-param>
- <param-name>cors.supportedHeaders</param-name>
- <param-value>Accept,Origin,X-Requested-With,Content-Type,Last-Modified</param-value>
- </init-param>
- <init-param>
- <param-name>cors.exposedHeaders</param-name>
- <param-value>Set-Cookie</param-value>
- </init-param>
- <init-param>
- <param-name>cors.supportsCredentials</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>CORS</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
方法3:自己写的 filter类,自己在在业务项目中配置web.xml 中配置想要的xml 文件。
如:java类filter:
public class CorsFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
// TODO Auto-generated method stub
HttpServletResponse res = (HttpServletResponse) response;
res.setContentType("text/html;charset=UTF-8");
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
res.setHeader("Access-Control-Max-Age", "0");
res.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
res.setHeader("Access-Control-Allow-Credentials", "true");
res.setHeader("XDomainRequestAllowed","1");
chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
业务项目中的web.xml配置如下:
<filter>
<filter-name>cors</filter-name>
<filter-class>com.tianlong.common.base.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cors</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
相关推荐
通过上述分析和示例代码,我们可以看到在Java环境中解决JSP中的AJAX跨域访问问题并不复杂,关键在于理解跨域访问的原理以及正确配置CORS或实现JSONP。无论是通过设置响应头来启用CORS,还是通过包装数据来实现JSONP...
7. 跨域资源共享的安全考虑:虽然CORS提供了跨域访问的能力,但也带来了安全风险。开发者需要确保只允许可信的源进行跨域请求,并限制可能暴露敏感数据的API接口。 8. 预检请求(Preflight Request):当请求的HTTP...
Java Web中的Session跨域共享问题通常出现在分布式系统或者微服务架构中,多个Web服务器需要共享用户的登录状态。在传统的单体应用中,Session是存储在单一服务器上的,但随着技术的发展,应用程序往往被拆分为多个...
在使用pdf.js插件时,需要将其配置文件中的defaultUrl设置为空,以便可以跨域访问远程FTP服务器上的PDF文件。 ### 9. 浏览器的兼容性 在使用pdf.js插件时,需要考虑浏览器的兼容性问题。pdf.js插件支持多种浏览器...
"Java Web使用pdf.js在线预览远程服务器上的pdf文件"这个主题涵盖了如何利用pdf.js库实现在Web环境中流畅、安全地预览PDF文档。pdf.js是Mozilla开发的一个开源项目,它允许开发者在浏览器端直接渲染PDF内容,无需...
Java跨域单点登录(Single Sign-On,SSO)实现是一项关键的系统集成技术,它允许用户在多个应用系统中只需登录一次,就能访问所有相互信任的应用系统,无需再次进行身份验证。本项目代码着重展示了如何在Java环境中...
Tomcat是Apache软件基金会的一个开源项目,提供了一个轻量级的Java Web服务器和Servlet容器。在两个Tomcat服务器之间进行跨域访问演示,我们可以设置CORS(Cross-Origin Resource Sharing)头信息,允许特定的跨域...
1. **CORS(跨源资源共享)**:这是现代浏览器支持的最常用的方法,通过在服务器端设置响应头`Access-Control-Allow-Origin`,允许特定或所有源进行跨域访问。例如,服务器返回`Access-Control-Allow-Origin: *`表示...
综上所述,“tomcat服务器的跨域jar”主要涉及到Java Web开发中的跨域问题解决,具体通过设置CORS策略来实现,可以使用XML配置或编程方式。在Tomcat这样的Servlet容器中,我们可以通过部署包含跨域配置的JAR文件来...
// 允许跨域访问 response.setContentType("text/html;charset=UTF-8"); response.setHeader("Access-Control-Allow-Origin", "https://monline.01zhuanche.com"); response.setHeader("Access-Control-Allow-...
要实现Java跨域,首先需要在Web应用的`web.xml`配置文件中引入`cors-filter-1.3.2.jar`。配置如下: ```xml <filter-name>CorsFilter <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class> ...
标题“web项目跨域jar包”指的是针对这个问题的一种解决方案,即使用特定的Java JAR包来实现跨域访问控制。 `cors-filter-1.7.jar` 是一个用于处理跨域请求的过滤器,通常集成在Java Web应用服务器中,如Tomcat、...
1. "jsonp能跨域即在服务器A上访问服务器B.txt" - 这个文件可能包含了关于JSONP如何实现跨域请求的基本原理和步骤,通过动态创建`<script>`标签来加载服务器B的数据,从而绕过同源策略。 2. "不管是否跨域,只要用...
JavaScript 和 jQuery 是Web开发中广泛使用的两种技术,它们在实现跨域访问方面起着关键作用。跨域访问是Web应用程序中常见的需求,特别是在Ajax请求、API调用或数据共享时。由于浏览器的安全策略,不同域名、协议或...
"服务端跨域访问处理.rar"这个压缩包提供了一种解决方案,主要针对Java服务器环境。接下来,我们将深入探讨跨域访问的问题,以及如何通过描述中的步骤来解决它。 跨域访问是由于浏览器的安全策略——同源策略(Same...