qq_36657274 2025-08-19 00:35 采纳率: 12.5%
浏览 9

java cas 5.3.x /cas/login 中文乱码解决

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") 获取到的包含中文的值出现乱码,这通常是因为 字符编码设置不正确 所导致。


    🛠 一、问题分析

    1. /cas/login 页面中文乱码
      这通常是由于服务器(如 Tomcat)默认的字符编码不是 UTF-8,或者请求的 HTTP 头部未指定正确的字符集。

    2. 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.propertiesapplication.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 DecodeBase64 解码 操作。

    ✅ 示例代码:

    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>
    

    🧪 三、验证步骤

    1. 修改 server.xmlapplication.properties
    2. 添加字符编码过滤器。
    3. 在获取 Authorization 头后,使用上述代码进行解码。
    4. 重启服务并测试中文是否正常显示和解析。

    ✅ 四、总结

    | 问题 | 解决方案 | |------|----------| | /cas/login 页面中文乱码 | 设置 Tomcat 的 URIEncoding="UTF-8" | | httpHeaders.getFirst("authorization") 中文乱码 | 使用 URLDecoderBase64 解码 |


    如有更多关于 CAS 的集成问题,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 8月19日