From 4e325c3f2c6ad1b86fefa193d8ff46706c1ef0f7 Mon Sep 17 00:00:00 2001 From: chenxing Date: Thu, 6 Aug 2026 20:56:27 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=9C=A8=E5=90=8E=E7=AB=AF=E5=AF=B9=20s?= =?UTF-8?q?ervice=20=E5=8F=82=E6=95=B0=E5=81=9A=20URL=20=E8=A7=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E7=A7=BB=E9=99=A4=E5=89=8D=E7=AB=AF=E8=A7=A3=E7=A0=81?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 前端 bschlogin.js 的 getQueryVariable 未对 query value 做 decodeURIComponent, 会把浏览器地址栏里百分号编码态的 service(http%3A%2F%2F...) 原样 POST 给后端, 导致 WebApplicationServiceFactory.createService 拿到的仍是编码串,CAS 服务注册表 正则 ^(https|imaps|http)://.* 匹配不到而抛 UnauthorizedServiceException (带 service 登录报"建立会话失败")。改为在后端 login() 入口统一解码,方便后续扩展。 --- .../cas/web/custom/controller/LoginController.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/org/apereo/cas/web/custom/controller/LoginController.java b/src/main/java/org/apereo/cas/web/custom/controller/LoginController.java index 6dbfa0c..e534c89 100644 --- a/src/main/java/org/apereo/cas/web/custom/controller/LoginController.java +++ b/src/main/java/org/apereo/cas/web/custom/controller/LoginController.java @@ -37,6 +37,7 @@ import javax.servlet.http.HttpSession; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URLEncoder; +import java.net.URLDecoder; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @@ -116,6 +117,19 @@ public class LoginController { HttpServletRequest request, HttpServletResponse response) throws IOException { + // 前端未对 service 做 URL 解码(bschlogin.js getQueryVariable 直接 slice 不做 decodeURIComponent), + // 会把浏览器地址栏里百分号编码态的 service(http%3A%2F%2F...)原样 POST 给后端,导致 + // WebApplicationServiceFactory.createService 拿到的仍是编码串,CAS 服务注册表正则 + // ^(https|imaps|http)://.* 匹配不到而抛 UnauthorizedServiceException(带 service 登录报“建立会话失败”)。 + // 统一在此把 service 解码成真实 URL(http://...)并向后透传解码值,方便后续其它逻辑直接读取。 + if (service != null && !service.trim().isEmpty()) { + try { + service = URLDecoder.decode(service, "UTF-8"); + } catch (Exception e) { + logger.warn("service 参数 URL 解码失败,按原值使用: {}", service); + } + } + HttpSession session = request.getSession(); try {