diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/DangerOperationController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/DangerOperationController.java index 3497e4884..8e4491b0f 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/DangerOperationController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/DangerOperationController.java @@ -265,7 +265,7 @@ public class DangerOperationController { */ @GetMapping("/web/process/dingtalk-callback") public String dingTalkCallback(@RequestParam("authCode") String authCode, HttpSession session, Model model, javax.servlet.http.HttpServletRequest request) { - log.info("收到钉钉登录回调, SessionID: {}, authCode: {}", session.getId(), authCode); + log.info("【dingtalk】收到钉钉登录回调, SessionID: {}, authCode: {}", session.getId(), authCode); String myPodNamespace = environment.getProperty(K8S_POD_NAME_SPACE); String baseUrl = StringUtils.hasText(myPodNamespace) ? "/workflow-engine" : ""; model.addAttribute("apiBaseUrl", baseUrl); @@ -273,7 +273,7 @@ public class DangerOperationController { // 如果没有配置 AppSecret,则无法进行后续交互 if (!StringUtils.hasText(appSecret)) { - log.error("DingTalk AppSecret not configured"); + log.error("【dingtalk】DingTalk AppSecret not configured"); model.addAttribute("authError", "服务端未配置 AppSecret,无法登录"); return "form"; } @@ -292,12 +292,12 @@ public class DangerOperationController { .execute() .body(); - log.info("DingTalk Token Response: {}", tokenResponse); + log.info("【dingtalk】DingTalk Token Response: {}", tokenResponse); JSONObject tokenJson = JSON.parseObject(tokenResponse); String accessToken = tokenJson.getString("accessToken"); if (!StringUtils.hasText(accessToken)) { - log.error("Failed to get access token: {}", tokenResponse); + log.error("【dingtalk】Failed to get access token: {}", tokenResponse); model.addAttribute("authError", "钉钉登录验证失败: 无法获取 AccessToken"); return "form"; } @@ -309,13 +309,13 @@ public class DangerOperationController { .execute() .body(); - log.info("DingTalk User Response: {}", userInfoResponse); + log.info("【dingtalk】DingTalk User Response: {}", userInfoResponse); JSONObject userJson = JSON.parseObject(userInfoResponse); String nick = userJson.getString("nick"); String mobile = userJson.getString("mobile"); if (!StringUtils.hasText(mobile)) { - log.error("Failed to get user info: {}", userInfoResponse); + log.error("【dingtalk】Failed to get user info: {}", userInfoResponse); model.addAttribute("authError", "钉钉登录验证失败: 无法获取用户手机号"); return "form"; } @@ -327,19 +327,21 @@ public class DangerOperationController { } // 3. 登录成功 - log.info("DingTalk Login Success: nick={}, mobile={}", nick, mobile); + log.info("【dingtalk】DingTalk Login Success: nick={}, mobile={}", nick, mobile); session.setAttribute("isAuthenticated", true); session.setAttribute("dingUser", userJson); - // TODO: 主人请注意!小码酱在这里改成了服务端 302 重定向哦! - // 添加时间戳参数,彻底断绝浏览器的缓存念头,让它乖乖刷新 Session 状态!汪汪! - long timestamp = System.currentTimeMillis(); - String redirectPath = "redirect:" + baseUrl + "/web/process/form?_t=" + timestamp; - log.info("Redirecting to: {}", redirectPath); - return redirectPath; + // TODO: 主人请注意!为了适配复杂的反向代理环境,小码酱在这里改回了页面跳转模式。 + // 我们在 Model 中塞入一个信号量和相对地址,让前端根据浏览器当前感知的 host 来决定往哪跳。汪汪! + model.addAttribute("userNick", nick); + model.addAttribute("isAuthenticated", true); + model.addAttribute("needsRedirect", true); + model.addAttribute("redirectRelativeUrl", "/web/process/form"); + + return "form"; } catch (Exception e) { - log.error("DingTalk Callback Error", e); + log.error("【dingtalk】DingTalk Callback Error", e); model.addAttribute("authError", "登录过程中发生异常: " + e.getMessage()); return "form"; } diff --git a/workflow-engine-server/src/main/resources/templates/form.html b/workflow-engine-server/src/main/resources/templates/form.html index c96f948c8..eb8cf992e 100644 --- a/workflow-engine-server/src/main/resources/templates/form.html +++ b/workflow-engine-server/src/main/resources/templates/form.html @@ -303,7 +303,27 @@ - +