手机网站 案例,优化设计六年级下册数学答案,丹阳信息网,济南制作网站的公司吗文章目录 什么是跨域跨域带来的问题 gateway解决跨域解决跨域的其他方式比较代码示例 总结提升 什么是跨域
跨域#xff08;Cross-Origin#xff09;是指在浏览器中#xff0c;当一个Web应用程序试图访问与其所属页面不同的源#xff08;origin#xff09;的资源时#… 文章目录 什么是跨域跨域带来的问题 gateway解决跨域解决跨域的其他方式比较代码示例 总结提升 什么是跨域
跨域Cross-Origin是指在浏览器中当一个Web应用程序试图访问与其所属页面不同的源origin的资源时浏览器会对这种行为进行安全限制并阻止一些跨域请求以保护用户的数据安全。
在浏览器遵循同源策略的限制下同一个源的脚本只能访问相同源下的资源不能访问其他源下的资源。同源策略通过限制跨域请求防止恶意网站通过跨站脚本攻击XSS和跨站请求伪造CSRF等手段盗取用户的敏感信息或进行其他恶意行为。
通常情况下如果一个请求的协议、主机或端口任意一个与当前页面的源即协议、主机和端口不同则该请求就被认为是跨域请求。
跨域带来的问题
跨域请求受到同源策略Same-Origin Policy的限制主要出于安全考虑。同源策略限制了跨域请求对其他源的读取访问防止恶意网站窃取用户数据。这种限制导致跨域请求无法直接进行而带来以下问题
AJAX请求被拒绝浏览器会阻止在跨域请求中使用XMLHttpRequest对象进行通信。 Cookie不可用跨域请求默认不会发送源站的Cookie信息导致无法验证用户身份。 访问被拒绝跨域请求可能会受到服务器的访问控制策略阻止。
gateway解决跨域
Gateway网关是一种中间层服务位于客户端和后端服务之间。它负责请求的转发、路由和协议转换等工作并提供了跨域处理的解决方案。以下是Gateway解决跨域问题的主要方式
反向代理Gateway可以作为后端服务的反向代理将客户端的请求转发到目标服务上。由于Gateway与后端服务在同一域内因此不存在跨域问题。 跨域资源共享CORSGateway可以配置CORS策略允许特定域下的请求进行跨域访问。通过在响应头中添加Access-Control-Allow-Origin字段指定允许跨域请求的域名实现跨域访问。 JSONP代理Gateway可以充当JSONP的代理在服务端发起对目标服务的请求然后返回给客户端一个回调函数包裹的响应数据。通过动态创建
解决跨域的其他方式比较 代码示例
Component
Order(2)
public class CorsResponseHeaderFilter implements GlobalFilter {private static final String ANY *;OverrideSuppressWarnings(serial)public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {return chain.filter(exchange).then(Mono.fromRunnable(() - {exchange.getResponse().getHeaders().entrySet().stream().filter(kv - (kv.getValue() ! null kv.getValue().size() 1)).filter(kv - (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)|| kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)|| kv.getKey().equals(HttpHeaders.VARY))).forEach(kv -{// Vary只需要去重即可if(kv.getKey().equals(HttpHeaders.VARY)) {kv.setValue(kv.getValue().stream().distinct().collect(Collectors.toList()));} else{ListString value new ArrayList();if(kv.getValue().contains(ANY)){ //如果包含*则取*value.add(ANY);kv.setValue(value);}else{value.add(kv.getValue().get(0)); // 否则默认取第一个kv.setValue(value);}}});}));}
}
在这段代码中通过实现GlobalFilter接口并使用Component注解将该类作为一个全局过滤器进行注册。同时使用Order(2)注解来指定该过滤器的执行顺序。
在filter方法中首先调用chain.filter(exchange)将请求转发给下一个过滤器或目标服务处理。然后通过then方法和Mono.fromRunnable创建一个新的Mono在请求完成后执行一些操作。
在这个新的Mono中我们获取到响应对象ServerHttpResponse然后遍历响应头的键值对。针对部分特定的响应头进行以下处理
对于Access-Control-Allow-Origin、Access-Control-Allow-Credentials和Vary这三个响应头我们判断其值是否存在且长度大于1即有多个值。如果满足条件我们对其进行相应的处理。 如果是Vary头则将其值去重即去除重复的值。 如果是Access-Control-Allow-Origin或Access-Control-Allow-Credentials头将其值设置为一个新的包含只有一个元素的列表。 如果原始值中包含通配符*则新列表只包含一个元素*即保持通配符不变。 否则新列表只包含原始值的第一个元素即保持原样。 通过这些处理我们实现了对跨域请求响应头的筛选和修改确保在跨域请求中返回符合要求的响应头以便客户端能够正常访问跨域资源。
总结提升
跨域是浏览器限制网页脚本访问不同域名下资源的安全机制。同源策略要求网页脚本只能访问与其所在网页具有相同协议、域名和端口的资源。这种限制是为了保护用户的隐私和安全防止恶意网站获取用户的敏感信息。
为了解决跨域请求的问题浏览器提供了跨域资源共享CORS等机制。CORS允许服务器在响应中设置特定的HTTP头以授权其他域名的请求访问资源。通过在响应头中添加Access-Control-Allow-Origin字段服务器可以指定允许访问的域名。这样浏览器就可以根据响应头的设置决定是否允许跨域请求。
除了CORS还有其他一些解决跨域请求的方法如JSONP。JSONP通过动态创建
跨域是一个常见的开发问题了解跨域的原理和解决方法对于开发人员来说是很重要的。通过合理使用CORS和其他跨域解决方案我们可以在保护用户安全的前提下实现不同域名之间的数据交互。