`

java web服务器实现跨域访问

阅读更多

原文:

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>

 

 

分享到:
评论

相关推荐

    跨域访问---------

    现在的web工程越来也大,传统的开发模式已经显得捉襟见肘了,不仅开发人员在开发过程中很痛苦,后期维护的人员也更痛苦。...下面我们介绍一种测地解决前端跨域访问的方式,本地服务器请求转发的方式。

    JWT(java web Token)

    token 去访问实现了jwt认证的web服务器。 token 可保存自定义信息,如用户基本信息, web服务器用解析token,解决跨域授权的问题

    java web开发技术大全

    3.5.3 实例:使用XMLHttpRequest跨域访问Web资源 3.5.4 实例:AJAX的3种交换数据方法 3.6 小结 第4章 Servlet技术 4.1 Servlet的Helloworld程序 4.1.1 实例:在My Eclipse中编写Helloworld程序 ...

    java web技术开发大全(最全最新)

    3.5.3 实例:使用XMLHttpRequest跨域访问Web资源 3.5.4 实例:AJAX的3种交换数据方法 3.6 小结 第4章 Servlet技术 4.1 Servlet的Helloworld程序 4.1.1 实例:在My Eclipse中编写Helloworld程序 4.1.2 ...

    spring boot版web socket模板

    Spring Boot 是一个快速构建 Java Web 应用程序的框架,它是 Spring Framework 的一部分,可以整合各种第三方库和服务,提供了很多便捷的功能。其中,Spring Boot 版本的 WebSocket 功能是实现实时通信的常用方式之...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    综上所述,“认我测”在线认证检测系统,率先填补了认证检测领域移动端的空缺,提供了Web浏览器+移动端的双端访问模式,给用户提供了多种访问途径,真正实现了用户和检测机构的随时随地在线下单检测。 关键词:...

    web实验REST API1

    主要是采用三个注解进行设计,@CrossOrigin解决跨域问题,因为采用的是本地服务器,本地服务器是8080端口,web就需要是8081端口,访问的话会出现跨

    java二次开发源码下载-identity-agent-sso:身份代理sso

    开发人员以最少的麻烦开发跨域单点登录和联合访问控制解决方案。 目录 试用样品 先决条件 WSO2 身份服务器,它是 . 我们假设您将使用来处理企业级 Java 项目的开发。 因此,我们将用于演示。 用于演示基于 SAML 的 ...

    resource-proxy:DotNet,Java和PHP的代理文件

    最佳实务有几种推荐的解决方案可以代替您自己的资源代理使用: 在未启用的Web服务器上启用 。 在或配置安全设置。 访问安全服务以存储您的用户名/密码凭据。与CORS配合使用的开发人员工具在使用启用了CORS的服务时...

    Flex企业应用开发实战源代码

    3.2.5 域及跨域访问 99 3.3 Flex Module 101 3.3.1 创建模块 102 3.3.2 模块的编辑与编译 104 3.3.3 模块文件的加载 104 3.3.4 主应用和模块的交互 107 3.4 Flex库文件SWC 107 3.5 Flex编译模式、链接模式与...

    JavaScript权威指南(第6版)中文文字版

    《JavaScript权威指南(第6版)》要讲述的内容涵盖JavaScript语言本身,以及web浏览器所实现的JavaScript API。本书第6版涵盖了 html5 和 ecmascript 5,很多章节完全重写,增加了当今 web 开发的最佳实践的内容,新增...

    JavaScript权威指南(第6版)

    《JavaScript权威指南(第6版)》要讲述的内容涵盖JavaScript语言本身,以及web浏览器所实现的JavaScript API。本书第6版涵盖了 html5 和 ecmascript 5,很多章节完全重写,增加了当今 web 开发的最佳实践的内容,新增...

    JavaScript权威指南(第6版)(中文版)

    《JavaScript权威指南(第6版)》主要讲述的内容涵盖JavaScript语言本身,以及Web浏览器所实现的JavaScript API。本书第6版涵盖了HTML5和ECMAScript 5,很多章节完全重写,增加了当今Web开发的最佳实践的内容,新增...

    JavaScript权威指南(第6版)

    《JavaScript权威指南(第6版)》主要讲述的内容涵盖JavaScript语言本身,以及Web浏览器所实现的JavaScript API。本书第6版涵盖了HTML5和ECMAScript 5,很多章节完全重写,增加了当今Web开发的最佳实践的内容,新增...

    JavaScript权威指南(第6版) 中文版

    《JavaScript权威指南(第6版)》要讲述的内容涵盖JavaScript语言本身,以及web浏览器所实现的JavaScript API。本书第6版涵盖了 html5 和 ecmascript 5,很多章节完全重写,增加了当今 web 开发的最佳实践的内容,新增...

    SSO CAS 单点登录实例SSOAuth+SSOWebDemo1+SSOWebDemo2.zip

    样例包含一个身份认证的服务器和两个简单的 Web应用,使得这两个 Web应用通过统一的身份认证服务来完成Web-SSO的功能。此样例所有的源代码和二进制代码都可以从网站地址http://gceclub.sun.com.cn/wangyu/下载。 ...

    hiproxy::hammer_and_wrench:hiproxy是基于Node.js的前端开发人员的轻量级代理工具,它支持类似NGINX的配置。 :fire:

    例如,如果您作为一个团队工作,并且团队中的每个开发人员都需要不同的代理设置,那么您将不再需要修改主机文件或将类的Web服务器用作反向代理。 hiproxy扩展了hosts文件的语法以支持端口号。 此外,hiproxy还通过...

    Sosoo 1.0网络爬虫程序.doc

    支持跨域跨主机的访问 支持多种文件格式的下载 支持对html中连接的递归处理 支持http1.1协议但不支持1.0 支持匿名代理(http),但不知道需要验证代理。 待扩展的功能: 提供全功能http协议处理 提供javasript...

Global site tag (gtag.js) - Google Analytics