java web服务器实现跨域访问
一、CORS概述
跨源资源共享标准通过新增一系列HTTP头,让服务器能声明那些来源可以通过浏览器访问该服务器上的各类资源(包括CSS、图片、JavaScript脚本以及其它类资源)。另外,对那些会对服务器数据造成破坏性影响的HTTP请求方法(特别是GET以外的HTTP方法,或者搭配某些MIME类型的POST请求),标准强烈要求浏览器必须先以OPTIONS请求方式发送一个预请求(preflightrequest),从而获知服务器端对跨源请求所支持HTTP方法。在确认服务器允许该跨源请求的情况下,以实际的HTTP请求方法发送那个真正的请求。服务器端也可以通知客户端,是不是需要随同请求一起发送信用信息(包括Cookies和HTTP认证相关数据)。
二、CORS原理
例如:域名A(http://a.example)的某Web应用程序中通过标签引入了域名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''text/plaincharset=UTF-8'; add_header'Content-Length'0; return200; } }
方法2:直接在tomcat安装目录下的lib中添加cors-filter-1.7.jar,java-property-utils-1.9.jar这2个jar包,并且在业务项目的web.xml中配置想要应的filter配置文件:
CORS com.thetransactioncompany.cors.CORSFilter cors.allowOrigin * cors.supportedMethods GET,POST,HEAD,PUT,DELETE cors.supportedHeaders Accept,Origin,X-Requested-With,Content-Type,Last-Modified cors.exposedHeaders Set-Cookie cors.supportsCredentials true CORS /*
方法3:自己写的 filter类,自己在在业务项目中配置web.xml中配置想要的xml文件。
如:java类filter:
publicclassCorsFilterimplementsFilter{ @Override publicvoidinit(FilterConfigfilterConfig)throwsServletException{ //TODOAuto-generatedmethodstub } @Override publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException, ServletException{ //TODOAuto-generatedmethodstub HttpServletResponseres=(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 publicvoiddestroy(){ //TODOAuto-generatedmethodstub } }
业务项目中的web.xml配置如下:
cors com.tianlong.common.base.CorsFilter cors /*
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。