请求转发vs重定向、同源策略与跨域
在Java Web开发和前端交互中请求转发、重定向与跨域问题是高频考点也是实际开发中不可或缺的知识点。本文结合表格对比、实例说明完整梳理三者的逻辑、差异及实用解决方案帮大家分清易混淆概念高效应对开发中的相关场景。一、同源策略1. 同源判定标准同源策略的判定是协议Protocol 域名/主机Host 端口Port三者完全一致与IP地址无关。默认端口可省略浏览器会自动匹配——http协议默认端口为80https协议默认端口为443。例如http://www.example.com 与 http://www.example.com:80 属于同源二者访问时不会触发跨域限制。2. 重定向与跨域的关联重定向是浏览器主动发起的新请求而同源策略限制的是「AJAX/fetch 等脚本发起的请求」并不限制浏览器地址栏的主动跳转。具体来说重定向本身不受同源策略拦截可实现不同源站点的跳转如从自身网站跳转到百度、GitHub等外部网站但重定向后若发起AJAX请求仍需遵循同源策略若不满足同源条件则会被拦截。二、知识点梳理1. 请求转发Forwardvs 重定向Redirect请求转发和重定向是Java Web中页面跳转的两种方式二者在请求机制、访问范围等方面差异显著具体对比如下特性请求转发Forward重定向Redirect请求次数1 次浏览器仅发起1次请求服务器内部转发2 次浏览器发起2次独立请求先请求原地址再跳转目标地址地址栏 URL不变始终显示发起请求的Servlet/Controller地址改变跳转后显示目标地址访问范围仅当前项目内部资源无法访问外部网站可访问任意网络资源同项目、外部网站均可数据传递共享同一个request对象可通过request.setAttribute()传递数据两次请求相互独立无法通过request对象传参可通过Cookie、Session间接传递响应状态码200正常响应由目标资源返回302临时重定向告知浏览器跳转新地址用途示例项目内页面跳转、带数据传递如登录成功后跳转到首页并携带用户信息跨项目跳转、外部网站跳转、防止表单重复提交如提交表单后重定向到结果页2. 同源策略与跨域1同源策略Same-Origin Policy同源策略是浏览器的安全机制目的是防止恶意网站窃取用户敏感数据如Cookie、LocalStorage、DOM内容等限制不同源页面之间的脚本交互。同源策略的限制范围AJAX/fetch 等脚本发起的请求不同源页面之间的DOM访问如iframe嵌套不同源页面无法操作其DOMCookie、LocalStorage、SessionStorage 的读写操作本质隔离不同网站的资源避免A网站的脚本随意操作B网站的内容保障用户访问安全。2同源判定三要素两个URL需同时满足以下三个条件才算同源任意一项不同即为跨域协议Protocol一致如都是http或都是httpshttp与https属于不同源域名/主机Host一致如www.example.com 与 sub.example.com 属于不同源子域名不同端口Port一致如8080与8081属于不同源默认端口http:80、https:443可省略且不影响判定3跨域Cross-Origin当两个URL的协议、域名、端口任意一个不同时就属于跨域访问此时浏览器会触发同源策略拦截脚本发起的请求如AJAX导致请求失败。示例以 http://www.example.com:8080 为基准判断是否跨域https://www.example.com:8080 → 协议不同http vs https跨域http://sub.example.com:8080 → 域名不同主域名 vs 子域名跨域http://www.example.com:8081 → 端口不同8080 vs 8081跨域http://192.168.1.1:8080 → 主机不同域名 vs IP跨域即使IP对应同一个服务器4重定向与跨域的关系重定向是浏览器层面的主动跳转不受同源策略限制可实现不同源站点的跳转如从自己的网站跳转到百度、GitHub等外部网站重定向后的AJAX请求仍受同源策略限制若需正常访问需通过对应跨域解决方案处理。三、常见跨域解决方案实际开发中跨域问题十分常见尤其是前后端分离项目以下是4种主流解决方案结合原理和适用场景整理方便大家按需选择解决方案原理适用场景CORS跨域资源共享服务器通过设置响应头如Access-Control-Allow-Origin明确允许指定源或所有源访问自身资源浏览器检测到该响应头后允许跨域请求。前后端分离项目主流方案支持GET、POST等所有请求方式兼容性好现代浏览器均支持。JSONP利用script标签不受同源策略限制的特性通过动态加载外部脚本将后端返回的数据作为回调函数参数传递给前端。仅支持GET请求兼容性好支持旧版浏览器适合简单跨域数据获取。代理服务器前端不直接请求目标服务器而是请求与自身同源的代理服务器由代理服务器转发请求到目标服务器再将响应结果返回给前端规避同源限制。开发环境如Vue CLI的proxy配置、React的setupProxy快速解决开发阶段的跨域问题。Nginx 反向代理通过配置Nginx服务器将所有前端请求转发到目标服务器统一请求源前端只访问NginxNginx再与目标服务器交互从根源上避免跨域。生产环境部署性能稳定、配置灵活适合正式上线的项目。四、要点总结1. 请求转发与重定向请求转发一次请求地址栏不变仅支持项目内部跳转可通过request对象传递数据响应状态码为200用于项目内带数据的跳转。重定向两次独立请求地址栏会改变可跳转至外部网站或跨项目资源无法通过request传参响应状态码为302用于跨源跳转、防表单重复提交。2. 同源策略与跨域同源协议、域名/主机、端口三者完全一致与IP地址无关、跨域不满足同源条件的访问会被浏览器同源策略拦截主要拦截脚本请求重定向可跨域重定向是浏览器主动跳转不受同源策略限制但重定向后的AJAX请求仍需遵循同源策略注意同源判定以协议、域名、端口为准与IP地址无关即使域名和IP对应同一个服务器也可能属于跨域如localhost和127.0.0.1Java Web中response.sendRedirect()会提交响应后续若再操作response对象如设置响应头、输出内容会抛出异常需注意重定向后及时return请求转发仅支持当前项目内部跳转无法跳转到外部网站仅可访问项目内的Servlet、JSP、Controller等资源。如果觉得有帮助欢迎点赞、收藏关注~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2447628.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!