You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确配置Jasig CAS错误模板以替换JSON错误响应?

Jasig CAS 404自定义模板配置及OAuth2授权码重复错误解决

一、404页面返回JSON而非自定义模板的解决步骤

Jasig CAS(Apereo CAS旧版本)默认会根据请求头(如Accept: application/json)或请求类型返回JSON格式错误,要强制渲染自定义模板,需按以下步骤配置:

  1. 确认模板位置与命名
    确保自定义404模板放在src/main/resources/templates/errors目录下,命名为404.html(多语言场景可命名为404_zh.html等),模板需符合Thymeleaf语法规范。

  2. 禁用REST风格错误响应
    在cas.properties中添加以下配置,强制所有错误请求走视图模板:

    # 关闭REST错误响应
    cas.view.rest.error.enabled=false
    # 启用默认错误视图处理器
    cas.webflow.error.handler.default.error.view=true
    
  3. 配置Spring MVC错误页面映射

    • 在web.xml中添加全局错误页面映射:
      <error-page>
          <error-code>404</error-code>
          <location>/error/404</location>
      </error-page>
      
    • 在CAS的Spring配置文件(如cas-servlet.xml)中添加视图解析映射:
      <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
          <property name="defaultErrorView" value="errors/404"/>
          <property name="statusCodes">
              <props>
                  <prop key="errors/404">404</prop>
              </props>
          </property>
      </bean>
      

    若使用Java配置类,可实现ErrorPageRegistrar:

    @Configuration
    public class CasErrorPageConfig implements ErrorPageRegistrar {
        @Override
        public void registerErrorPages(ErrorPageRegistry registry) {
            registry.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/404"));
        }
    }
    
  4. 验证请求头处理
    若客户端请求携带Accept: application/json,CAS仍可能返回JSON,可在CAS的过滤器中强制修改请求头,或在模板控制器中统一处理响应类型。

二、OAuth2授权码重复使用的TechnicalException解决

该错误由pac4j框架抛出,原因是OAuth2授权码遵循一次性使用原则,重复提交会触发校验失败,解决方法如下:

  1. 排查客户端请求逻辑
    检查OAuth客户端是否存在重复提交授权码的情况(如前端重复点击、请求重试机制异常),确保授权码仅在获取令牌时使用一次。

  2. 配置分布式授权码存储
    若CAS部署在集群环境,默认内存存储的授权码可能无法同步,导致节点间重复校验失败。可切换到JDBC或Redis存储:

    • JDBC存储配置(cas.properties):
      cas.oauth.code.store.type=JDBC
      cas.oauth.code.store.jdbc.driverClass=com.mysql.cj.jdbc.Driver
      cas.oauth.code.store.jdbc.url=jdbc:mysql://localhost:3306/cas_oauth
      cas.oauth.code.store.jdbc.user=root
      cas.oauth.code.store.jdbc.password=your_db_password
      
    • Redis存储配置(cas.properties):
      cas.oauth.code.store.type=REDIS
      cas.oauth.code.store.redis.host=localhost
      cas.oauth.code.store.redis.port=6379
      cas.oauth.code.store.redis.password=your_redis_password
      
  3. 调整授权码过期时间
    若授权码过期时间过短,可能导致客户端在有效期内未完成令牌请求,过期后重复提交。可适当延长过期时间(单位:秒):

    cas.oauth.code.expiration.time=300
    

内容的提问来源于stack exchange,提问作者Lavandysh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:52:01