在日常的项目开发时会不可避免的需要进行跨域操作,而在实际进行跨域请求时,经常会遇到类似 No 'Access-Control-Allow-Origin' header is present on the requested resource.这样的报错。 这样的错误,一般是由于CORS跨域验证机制设置不正确导致的,本文将详细讲解CORS跨域验证机制的原理,让您轻松掌握CORS跨域设置的使用方法,安全、方便的进行前端开发。 什么是CORS CORS(Cross-Origin Resource Sharing 跨源资源共享),当一个请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。 例如最常见的,在一个域名下的网页中,调用另一个域名中的资源。 相对于上面这种静态的调用方式,还可以通过Ajax技术来动态发起跨域请求。例如如下的方式,利用XMLHttpRequest对象发送一个GET请求,获取另一个域名下的图片内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<!DOCTYPE html> <html> <head>CORS Test</head> <body> <div id="img_Div"></div> <script type="text/javascript"> //XmlHttpRequest对象 function createXmlHttpRequest(){ if(window.ActiveXObject){ //如果是IE浏览器 return new ActiveXObject("Microsoft.XMLHTTP"); }else if(window.XMLHttpRequest){ //非IE浏览器 return new XMLHttpRequest(); } } function getFile() { var img_Container = document.getElementById("img_Div"); var xhr = createXmlHttpRequest(); xhr.open('GET', 'http://oss.youkouyang.com/1.jpg', true); xhr.setRequestHeader('Content-Type', 'image/jpeg'); xhr.responseType = "blob"; xhr.onload = function() { if (this.status == 200) { var blob = this.response; var img = document.createElement("img"); img.onload = function(e) { window.URL.revokeObjectURL(img.src); }; img.src = window.URL.createObjectURL(blob); img_Container.appendChild(img); } } xhr.send(null); } </script> <div class="row"> <input type="button" onclick="getFile()" value="Get" /> </div> </body> </html> |
CORS的作用 为了改善网络应用程序,开发人员要求浏览器供应商允许跨域请求。跨域请求主要用于: 调用XMLHttpRequest或fetchAPI通过跨站点方式访问资源 网络字体,例如Bootstrap(通过CSS使用@font-face 跨域调用字体) 通过canvas标签,绘制图表和视频。 CORS的安全隐患 跨域请求和Ajax技术都会极大地提高页面的体验,但同时也会带来安全的隐患,其中最主要的隐患来自于CSRF(Cross-site request forgery)跨站请求伪造。 CSRF攻击的大致原理是: 用户通过浏览器,访问正常网站A(例如某银行),通过用户的身份认证(比如用户名/密码)成功A网站。 网站A产生Cookie信息并返回给用户的浏览器; 用户保持A网站页面登录状态,在同一浏览器中,打开一个新的TAB页访问恶意网站B; 网站B接收到用户请求后,返回一些攻击性代码,请求A网站的资源(例如转账请求); 浏览器执行恶意代码,在用户不知情的情况下携带Cookie信息,向网站A发出请求。 网站A根据用户的Cookie信息核实用户身份(此时用户在A网站是已登录状态),A网站会处理该请求,导致来自网站B的恶意请求被执行。 CORS验证机制 出于安全原因,浏览器限制从脚本中发起的跨域HTTP请求。默认的安全限制为同源策略, 即JavaScript或Cookie只能访问同域下的内容。 W3C推荐了一种跨域的访问验证的机制,即CORS(Cross-Origin Resource Sharing 跨源资源共享)。 这种机制让Web应用服务器能支持跨站访问控制,使跨站数据传输更加安全,减轻跨域HTTP请求的风险。 CORS验证机制需要客户端和服务端协同处理。 CORS浏览器支持情况 目前主流浏览器都已基本提供对跨域资源共享的支持,移动端浏览器也几乎全部支持。 客户端处理机制 基于上述的CSRF的风险,各主流的浏览器都会对动态的跨域请求进行特殊的验证处理。验证处理分为简单请求验证处理和预先请求验证处理。 简单请求 当请求同时满足下面两个条件时,浏览器会直接发送GET请求,在同一个请求中做跨域权限的验证。 请求方法是下列之一: GET HEAD POST 请求头中的Content-Type请求头的值是下列之一: application/x-www-form-urlencoded multipart/form-data text/plain 简单请求时,浏览器会直接发送跨域请求,并在请求头中携带Origin 的header,表明这是一个跨域的请求。 服务器端接到请求后,会根据自己的跨域规则,通过Access-Control-Allow-Origin和Access-Control-Allow-Methods响应头,来返回验证结果。 如果验证成功,则会直接返回访问的资源内容。 如果验证失败,则返回403的状态码,不会返回跨域请求的资源内容。 可以通过浏览器的Console查看具体的验证失败原因 预先请求 当请求满足下面任意一个条件时,浏览器会先发送一个OPTION请求,用来与目标域名服务器协商决定是否可以发送实际的跨域请求。 请求方法不是下列之一: GET HEAD POST 请求头中的Content-Type请求头的值不是下列之一: application/x-www-form-urlencoded multipart/form-data text/plain 浏览器在发现页面中有上述条件的动态跨域请求的时候,并不会立即执行对应的请求代码,而是会先发送Preflighted requests(预先验证请求),Preflighted requests是一个OPTION请求,用于询问要被跨域访问的服务器,是否允许当前域名下的页面发送跨域的请求。 OPTIONS请求头部中会包含以下头部:Origin、Access-Control-Request-Method、Access-Control-Request-Headers。 服务器收到OPTIONS请求后,设置Access-Control-Allow-Origin、Access-Control-Allow-Method、Access-Control-Allow-Headers头部与浏览器沟通来判断是否允许这个请求。 如果Preflighted requests验证通过,浏览器才会发送真正的跨域请求。 如果Preflighted requests验证失败,则会返回403状态,浏览器不会发送真正的跨域请求。 可以通过浏览器的Console查看具体的验证失败原因 […]
View Details1、java智能提示 (1). 打开Eclipse,选择打开" Window - Preferences"。 (2). 在目录树上选择"Java-Editor-Content Assist",在右侧的"Auto-Activation"找到"Auto Activation triggers for java"选项。默认触发代码提示的就是"."这个符号。 (3). 在"Auto Activation triggers for java"选项中,将"."更改:.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 2、XML智能提示 (1). 打开Eclipse,选择打开" Window - Preferences"。 (2). 在目录树上选择"XML-Editor-Content Assist",在右侧的"Auto-Activation"找到"Prompt when these characters are inserted "选项。 (3). 在"Prompt when these characters are inserted"选项中,将"<=: ,"更改:<=:.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW(, 3、快捷键 (1)Ctrl+Space 说明:内容助理。提供对方法,变量,参数,javadoc等得提示,应运在多种场合,总之需要提示的时候可先按此快捷键。注:避免输入法的切换设置与此设置冲突 (2)Ctrl+Shift+Space 说明:变量提示 (3)Ctrl+/ 说明:添加/消除//注释,在eclipse2.0中,消除注释为Ctrl+\ (4)Ctrl+Shift+/ 说明:添加/* */注释 (5)Ctrl+Shift+\ 说明:消除/* */注释 (6)Ctrl+Shift+F 说明:自动格式化代码 (7)Ctrl+1 说明:批量修改源代码中的变量名,此外还可用在catch块上. (8)Ctril+F6 说明:界面切换 (9)Ctril+Shift+M 说明:查找所需要得包 (10)Ctril+Shift+O 说明:自动引入所需要得包 (11)Ctrl+Alt+S 说明:源代码得快捷菜单。其中的Generate getters and setters 和 Surround with try/catchblock比较常用.建议把它们添加为快捷键.快捷键设置在windows->preferences->Workbench->Keys 4、跟踪调式 单步返回 F7 单步跳过 F6 单步跳入 F5 单步跳入选择 Ctrl+F5 调试上次启动 F11 继续 F8 使用过滤器单步执行 Shift+F5 添加/去除断点 […]
View Details最近在做SpringBoot的项目,用到了session,发现放置好session后,过一会就失效了,用下面发语句获取session失效时间,发现是60s
1 2 3 |
request.getSession().getMaxInactiveInterval(); 去网上查找,发现大多解决问题的办法是 在启动类中main方法的下面加入以下方法来手动设置session失效时间 |
1 2 3 4 5 6 7 8 9 10 11 12 |
@Bean public EmbeddedServletContainerCustomizer containerCustomizer(){ return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainer Container) { container.setSessionTimeout(1800);//单位为S } }; } 但是社会在发展,时代在进步,SpringBoot2.0以后已经不支持这种方式了 ps:可以在pom文件中查看你的SpringBooot版本。 |
1 2 3 4 5 6 7 8 |
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> SpringBoot2.0以后的版本只需要在application.properties中加入以下配置就好 |
1 2 3 4 |
server.servlet.session.timeout = PT5H 这里重点解释一下 PT5H 意思是设置session失效的时间是5小时 通过查看setTimeouot的方法,这里要求传入Duration的实例 |
1 2 3 4 5 6 7 8 9 10 11 |
public void setTimeout(Duration timeout) { this.timeout = timeout; } Duration是在Java8中新增的,主要用来计算日期差值 Duration是被final声明的,并且是线程安全的 Duration转换字符串方式,默认为正,负以-开头,紧接着P,以下字母不区分大小写 D :天 T:天和小时之间的分隔符 H :小时 M:分钟 S:秒 每个单位都必须是数字,且时分秒顺序不能乱 比如P2dt3m5s P3d pt3h |
最后总结一下Duration最实用的一个功能其实是 between 方法,因为有很多时候我们需要计算两个日期之间的天数或者小时数,用这个就可以很方便的进行操作。 BugHome版权所有丨转载请注明出处:https://minei.me/archives/342.html from:http://www.cnblogs.com/ergexy/p/9684933.html
View Details