-
java 请求跨域问题解决方法实例详解
2020-08-30 17:18:19主要介绍了java 请求跨域问题解决方法实例详解的相关资料,需要的朋友可以参考下 -
Java请求跨域处理
2021-03-28 18:05:34Java请求跨域处理 参考 Access to XMLHttpRequest at ‘http://localhost:88/api/sys/login’ from origin ‘http://localhost:8001’ has been blocked by CORS policy: Response to preflight request doesn’t ...Java请求跨域处理
Access to XMLHttpRequest at ‘http://localhost:88/api/sys/login’ from origin ‘http://localhost:8001’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
跨域:浏览器对JavaScript施加的安全限制,默认不让js获取远程网站的数据
XMLHttpRequest对象发送AJAX请求
同源策略:指协议、域名、端口都要相同,其中有一个不同都会产生跨域
限制:
- 域名及其对应IP,发送跨域
- 主域相同,子域不同,跨域
- 同一域名,不同二级域名(有无www),跨域
跨域流程:
登录不属于简单请求,由于登录的content-type属于application/json所以数据非简单请求,此时先发送一个options 预检请求
服务器可对origin请求头做校验,仅允许部分请求源跨域访问数据
解决跨域:
- 使用NGINX 部署为同一域 NGINX拦在gateway前方
前后端请求都走nginx 通过动静分离 代理到不同实际地址,但请求的origin(请求域:协议+域名+端口)就一致了都是nginx的地址
- 跨域流程处理
1、添加响应头
• Access-Control-Allow-Origin:支持哪些来源的请求跨域
• Access-Control-Allow-Methods:支持哪些方法跨域
• Access-Control-Allow-Credentials:跨域请求默认不包含cookie,设置为true可以包含
cookie
• Access-Control-Expose-Headers:跨域请求暴露的字段
• CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:
Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如
果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。
• Access-Control-Max-Age:表明该响应的有效时间为多少秒。在有效时间内,浏览器无
须为同一请求再次发起预检请求。请注意,浏览器自身维护了一个最大有效时间,如果
该首部字段的值超过了最大有效时间,将不会生效。
-
在网关中添加跨域filter
springboot 自带CorsWebFilter 来解决跨域问题,通过spring boot自带的跨域解决方式来处理,若不允许跨域返回403,若允许返回允许响应头信息
package priv.yuzuki.gulimall.gateway.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.reactive.CorsWebFilter; import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; /** * CorsConfiguration * * @author yuzuki * @date 2021/3/28 17:33 * @since 1.0.0 */ @Configuration public class MyCorsConfiguration { @Bean public CorsWebFilter corsWebFilter(){ // CorsConfigurationSource corsConfigurationSource = new CorsConfigurationSource() { // @Override // public org.springframework.web.cors.CorsConfiguration getCorsConfiguration(javax.servlet.http.HttpServletRequest request) { // return null; // } // }; // 注意使用 reactive包下的类,因为spring cloud 都是响应式编程所以要都使用reactive包下的类 UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration(); // 配置跨域 corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); // 测试效果,如果只允许GET请求,看POST请求会被如何拒绝 // corsConfiguration.addAllowedMethod(HttpMethod.GET); corsConfiguration.addAllowedOrigin("*"); // 是否允许携带cookie跨域 corsConfiguration.setAllowCredentials(true); source.registerCorsConfiguration("/**",corsConfiguration); return new CorsWebFilter(source); } }
-
出错
:8001/#/login:1 Access to XMLHttpRequest at ‘http://localhost:88/api/sys/login’ from origin ‘http://localhost:8001’ has been blocked by CORS policy: The ‘Access-Control-Allow-Origin’ header contains multiple values ‘http://localhost:8001, http://localhost:8001’, but only one is allowed.
若多出配置跨域会返回多个相同响应头导致出错
spring boot 响应式编程跨域请求源码分析
核心是
org.springframework.web.cors{.reactive}.CorsWebFilter
用户只需给出自定义的跨域配置,由spring boot自动扫描CorsWebFilter注入IOC容器并产生作用
跨域过滤的核心方法为
CorsWebFilter#Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain)
@Override public boolean process(@Nullable CorsConfiguration config, ServerWebExchange exchange) { ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); response.getHeaders().addAll(HttpHeaders.VARY, VARY_HEADERS); // 根据请求头中是否携带origin请求头或origin代表的资源域与请求域是否同源(协议+域名+端口不一致)判断是否跨域,跨域就往下判断是否允许,否则请求不规范,未携带origin请求头或origin的内容与请求源地址不同 if (!CorsUtils.isCorsRequest(request)) { return true; } if (response.getHeaders().getFirst(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN) != null) { logger.trace("Skip: response already contains \"Access-Control-Allow-Origin\""); return true; } boolean preFlightRequest = CorsUtils.isPreFlightRequest(request); if (config == null) { if (preFlightRequest) { rejectRequest(response); return false; } else { return true; } } return handleInternal(exchange, config, preFlightRequest); }
最终处理方法:
protected boolean handleInternal(ServerWebExchange exchange, CorsConfiguration config, boolean preFlightRequest) { ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); HttpHeaders responseHeaders = response.getHeaders(); String requestOrigin = request.getHeaders().getOrigin(); // 检测请求origin是否在允许范围内(由之前通过@Configuration+@Bean给出的自定义配置判断 String allowOrigin = checkOrigin(config, requestOrigin); if (allowOrigin == null) { logger.debug("Reject: '" + requestOrigin + "' origin is not allowed"); rejectRequest(response); return false; } HttpMethod requestMethod = getMethodToUse(request, preFlightRequest); // 检测请求方法是否在指定范围内 List<HttpMethod> allowMethods = checkMethods(config, requestMethod); if (allowMethods == null) { logger.debug("Reject: HTTP '" + requestMethod + "' is not allowed"); rejectRequest(response); return false; } List<String> requestHeaders = getHeadersToUse(request, preFlightRequest); // 检测请求头是否在指定范围内 List<String> allowHeaders = checkHeaders(config, requestHeaders); if (preFlightRequest && allowHeaders == null) { logger.debug("Reject: headers '" + requestHeaders + "' are not allowed"); rejectRequest(response); return false; } // 设置允许请求origin的响应头 responseHeaders.setAccessControlAllowOrigin(allowOrigin); // 预检请求才设置允许请求方法的响应头 if (preFlightRequest) { responseHeaders.setAccessControlAllowMethods(allowMethods); } // 预检请求且允许请求头非空才设置允许请求头的响应头 if (preFlightRequest && !allowHeaders.isEmpty()) { responseHeaders.setAccessControlAllowHeaders(allowHeaders); } if (!CollectionUtils.isEmpty(config.getExposedHeaders())) { responseHeaders.setAccessControlExposeHeaders(config.getExposedHeaders()); } // 判断是否允许携带cookie if (Boolean.TRUE.equals(config.getAllowCredentials())) { responseHeaders.setAccessControlAllowCredentials(true); } // 判断是否设置允许响应时间 if (preFlightRequest && config.getMaxAge() != null) { responseHeaders.setAccessControlMaxAge(config.getMaxAge()); } return true; }
小结
origin请求头是浏览器自带的,无需用户干预,如果不带,是否表明没有发生跨域
不带/带了但是请求同源都不会发生跨域处理
同源策略:
如果两个 URL 的 protocol、port (如果有指定的话)和 host 都相同的话,则这两个 URL 是同源。这个方案也被称为“协议/主机/端口元组”,或者直接是 “元组”。(“元组” 是指一组项目构成的整体,双重/三重/四重/五重/等的通用形式)。
如何避免引导正常用户引发跨站请求伪造?(CSRF,Cross-site request forgery)(通过使用网站返回的cookie以非本意的方式发送请求,通过恶意网站B,引诱用户在B网站做任何操作从而B网站获取用户cookie并给给已登录的A网站发送下单、转账等请求)通过浏览器自带的origin同源策略可在一定程度上防止该操作
如果非正常用户去更改origin来避免浏览器的同源机制,除非获取正常用户的电脑,否则无法完成操作
浏览器通过同源策略在一定程度上阻止恶意请求(CSRF),但业务上产生跨域资源共享(CORS)场景则通过跨域策略来允许访问非同源请求获取资源
-
java 请求跨域问题
2017-08-14 17:59:50* response请求跨域公共设置 */ publicstatic HttpServletResponse SetHttpServletResponse( HttpServletResponse response) { response.setHeader("Access-Control-Allow-Origin","*"); response/*
* response请求跨域公共设置
*/
public
static
HttpServletResponse SetHttpServletResponse(
HttpServletResponse response) {
response.setHeader(
"Access-Control-Allow-Origin"
,
"*"
);
response.setHeader(
"Access-Control-Allow-Methods"
,
"POST, GET, OPTIONS, DELETE"
);
response.setHeader(
"Access-Control-Max-Age"
,
"3600"
);
response.setHeader(
"Access-Control-Allow-Headers"
,
"x-requested-with"
);
return
response;
}
public
String xxx(){
Util.SetHttpServletResponse(response);
//解决跨域
...
return
xxx;
}
原文链接:http://blog.csdn.net/mr_ooo/article/details/70224724
-
解决java请求跨域
2017-05-31 11:42:17第一、导入jar包 com.thetransactioncompany java-property-utils 1.9.1 com.thetransactioncompany cors-filter 2.5 第二、修改web配置文件第一、导入jar包
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>java-property-utils</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>2.5</version>
</dependency>第二、修改web配置文件
<!-- 跨域 -->
<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> -
java请求跨域问题解决方法
2017-04-18 09:42:00/* * response请求跨域公共设置 */ public static HttpServletResponse SetHttpServletResponse( HttpServletResponse response) { response.setHeader("Access-Control-Allow-Origin", "*新建Util类,在Util中添加下面方法:
/* * response请求跨域公共设置 */ public static HttpServletResponse SetHttpServletResponse( HttpServletResponse response) { response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); return response; }
在接口处调用此方法:
public String xxx(){ Util.SetHttpServletResponse(response);//解决跨域 ... return xxx; }
-
java请求跨域问题最简单暴力的方式
2019-09-18 11:10:29response.addHeader("Access-Control-Allow-Origin", "*"); response.addHeader("Access-Control-Allow-Method", "POST,GET"); -
java http请求 跨域_java web跨域请求
2021-02-12 22:38:49java web中如何跨域请求呢?使用jsonp,详情请参考:http://json-p.org/页面代码如下:function jsonpCallback(result) {alert(JSON.stringify(result));/*for(var i in result) {alert(i+":"+result[i]);//循环输出a:1,... -
java http请求 跨域_java解决请求跨域的两种方法
2021-02-27 21:11:55java解决请求跨域问题,有以下两种写法1.使用拦截器,实现javax.servlet.Filter接口import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.... -
java 跨域访问_java解决请求跨域的两种方法
2021-02-27 10:07:19java解决请求跨域问题,有以下两种写法1.使用拦截器,实现javax.servlet.Filter接口import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.... -
java跨域访问_java解决请求跨域的两种方法
2021-02-12 09:50:30java解决请求跨域问题,有以下两种写法1.使用拦截器,实现javax.servlet.Filter接口import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.... -
java httpclient 跨域_httpClient请求跨域服务器实例
2021-02-27 21:09:36运行jar包实例:importorg.apache.commons.httpclient.HttpClient;importorg.apache.commons.httpclient.HttpException;importorg.apache.commons.httpclient....importorg.apache.commons.httpclient.cookie.... -
java跨域返回数据库_java解决请求跨域的两种方法|chu
2021-03-13 00:47:16java解决请求跨域问题,有以下两种写法1.使用拦截器,实现javax.servlet.Filter接口import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.... -
java 前台解决跨域请求_Java 解决跨域请求
2021-03-16 17:14:10import org.springframework.util.StringUtils;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet....import java.io.IOException;/*** 跨域请求处理*/pu... -
java解决请求跨域的两种方法
2020-08-25 17:28:46主要为大家详细介绍了java解决请求跨域的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Java解决请求跨域问题
2020-09-22 10:37:20Java解决跨域问题 跨域是什么? 跨域(Access-Control-Allow-Origin),指的是由浏览器的同源策略造成的,是浏览器施加的安全限制。所谓同源是指,域名,协议,端口均相同;所有只要域名,协议,端口有所不同就会... -
java jsonp跨域_JAVA 跨域请求 不用JSONP 不用CORS
2021-03-06 04:34:38@RequestMapping(value = "/crossDomain")@ResponseBodypublic Object crossDomain(ServletRequest request, ServletResponse response) {logger.info(ZhongYiYaoAreaController.class + "跨域请求data开始");... -
java ajax 跨域请求数据_Java Ajax jsonp 跨域请求
2021-03-11 12:53:581. 什么是JSONP 一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的 JSONP是一种协议,为了解决客户端请求服务器跨域的问题,但是并非是正式的传输协议。该协议的一个... -
java处理get请求跨域问题_SAP ABAP和Java跨域请求问题的解决方案
2021-03-18 11:10:36And in this blog, I just record down my own study experience about how to achieve cross domain request in ABAP and Java. Cross Domain Request in ABAP Create a new ICF node in tcode SICF, implement ... -
Java基础-请求跨域
2019-11-23 09:41:52一、是什么请求跨域? 跨域问题的体现: 什么是同源策略?- 假设有两个url,如果这两个url的协议、ip(域名)、端口完全一样,则这两个url就称这为同源。 什么是跨域问题?- 如果一个页面发送一个请求,请求的url... -
AJAX跨域请求 JAVA跨域请求 js跨域 一行代码解决跨域问题 前后端分离跨域
2020-06-05 17:58:51只需一行代码就能解决跨域 只用修改后端, 前端不用处理, 适用于JAVA.SpringMVC 包括SpringBoot与SSM都适用 给Controller添加注解 生效的只有一个注解, 在SpringBoot中无需额外的包 @CrossOrigin 完整代码 @Cross...