java cas 5.3.x /cas/login 登录 httpheaders.getfirst("authorization") 获取包含中文时乱码解决方法
5条回答 默认 最新
檀越@新空间 2025-08-19 00:36关注上午好☀️☀️☀️️
本答案参考通义千问在使用 CAS 5.3.x 时,如果遇到
/cas/login页面中中文乱码问题,以及通过httpHeaders.getFirst("authorization")获取到的包含中文的值出现乱码,这通常是因为 字符编码设置不正确 所导致。
🛠 一、问题分析
-
/cas/login 页面中文乱码
这通常是由于服务器(如 Tomcat)默认的字符编码不是 UTF-8,或者请求的 HTTP 头部未指定正确的字符集。 -
httpHeaders.getFirst("authorization")中文乱码
在 CAS 认证过程中,Authorization请求头中可能会包含 Base64 编码的凭证信息。如果这些数据中包含中文,而没有正确解码或编码,就会出现乱码。
✅ 二、解决方案
1. 设置 Tomcat 的字符编码为 UTF-8
确保 Tomcat 的
server.xml文件中配置了URIEncoding="UTF-8":<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />重要: 如果你使用的是 Spring Boot + Embedded Tomcat,可以在
application.properties或application.yml中添加如下配置:server.tomcat.uri-encoding=UTF-8或者:
server: tomcat: uri-encoding: UTF-8
2. 设置 HTTP 请求头的字符编码
在处理请求之前,手动设置请求的字符编码为 UTF-8:
request.setCharacterEncoding("UTF-8");注意: 此方法应在获取请求参数之前调用,否则无效。
3. 对
Authorization请求头进行正确处理当从
httpHeaders.getFirst("authorization")获取到字符串时,如果其中包含中文,应确保其是 Base64 编码后的字符串,并且需要进行 URL Decode 和 Base64 解码 操作。✅ 示例代码:
import org.springframework.web.util.UriComponentsBuilder; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; public String getDecodedAuthorization(String authorizationHeader) { if (authorizationHeader == null || authorizationHeader.isEmpty()) { return null; } // 去除 "Basic " 前缀 String base64Credentials = authorizationHeader.substring("Basic ".length()).trim(); // URL 解码(如果存在) String decodedCredentials = URLDecoder.decode(base64Credentials, StandardCharsets.UTF_8); // Base64 解码 byte[] decodedBytes = Base64.getDecoder().decode(decodedCredentials); return new String(decodedBytes, StandardCharsets.UTF_8); }注意: 确保你的 CAS 客户端发送的
Authorization头是 Base64 编码的 UTF-8 字符串,例如:Authorization: Basic dXNlcjpwYXNzd29yZA==
4. 配置 Spring MVC 的字符编码过滤器(可选)
在
web.xml或 Spring Boot 应用中添加字符编码过滤器:<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
🧪 三、验证步骤
- 修改
server.xml或application.properties。 - 添加字符编码过滤器。
- 在获取
Authorization头后,使用上述代码进行解码。 - 重启服务并测试中文是否正常显示和解析。
✅ 四、总结
| 问题 | 解决方案 | |------|----------| | /cas/login 页面中文乱码 | 设置 Tomcat 的
URIEncoding="UTF-8"| | httpHeaders.getFirst("authorization") 中文乱码 | 使用URLDecoder和Base64解码 |
如有更多关于 CAS 的集成问题,欢迎继续提问!
解决 无用评论 打赏 举报-