Jersey中'Access-Control-Allow-Origin'请求头被编码问题咨询
解决Jersey HK2过滤器中Access-Control-Allow-Origin头被编码的问题
你必须修改现有实现——编码后的Access-Control-Allow-Origin不符合CORS规范,浏览器会判定跨域请求无效,导致前端出现CORS错误。
问题原因
你直接将请求头的Origin值设置到响应头时,Jersey HK2的处理环节(或过滤器链中的其他组件)自动对非字母数字字符进行了URL编码,导致响应头中的值无法与请求的Origin匹配。
解决方案
有两种可靠的修改方式:
方式一:手动解码Origin值后设置响应头
在设置响应头前,对获取到的Origin值进行URL解码,确保响应头使用原始的未编码字符串:
import java.net.URLDecoder; import java.nio.charset.StandardCharsets; // ... final String origin = httpRequest.getHeader("origin"); // 解码Origin值,避免编码后的响应头 String decodedOrigin = URLDecoder.decode(origin, StandardCharsets.UTF_8.name()); httpResponse.addHeader("Access-Control-Allow-Origin", decodedOrigin);
方式二:使用Jersey官方CorsFilter组件
替换自定义过滤器为Jersey自带的CorsFilter,它会自动正确处理CORS相关头,避免编码问题:
import org.glassfish.jersey.server.filter.CorsFilter; // 在Jersey的资源配置中注册CorsFilter CorsFilter corsFilter = new CorsFilter(); // 可配置允许的Origin(按需设置,也可允许所有) corsFilter.getAllowedOrigins().add("https://example.com:8443"); // 可选:配置允许的HTTP方法、请求头等 register(corsFilter);
验证
修改完成后重新测试跨域请求,在Chrome开发者工具中检查响应头的Access-Control-Allow-Origin值,确认与请求头的Origin完全一致(未编码)即可。
内容的提问来源于stack exchange,提问作者Darshan Mehta
相关产品推荐
相关产品推荐

