fix(CasdoorLoginWindow,resources): 修复了内嵌浏览器创建失败无法登录问题,完善登录逻辑的错误处理,添加无内嵌浏览器时使用默认浏览器登录的逻辑,补提交上次缺失的资源文件,为内嵌浏览器添加返回登录界面功能

This commit is contained in:
Hydrogen
2025-08-18 01:33:03 +08:00
parent ba5c07746a
commit 2904258983
6 changed files with 83 additions and 42 deletions

View File

@@ -44,6 +44,7 @@ import java.awt.event.WindowEvent;
import java.io.*;
import java.lang.instrument.Instrumentation;
import java.lang.management.*;
import java.lang.reflect.InvocationTargetException;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.List;
@@ -83,7 +84,7 @@ public class AxisInnovatorsBox {
private final boolean isDebug;
private static DebugWindow debugWindow;
private LoginData loginData;
private static LoginData loginData;
public AxisInnovatorsBox(String[] args, boolean isDebug) {
this.args = args;
@@ -92,9 +93,12 @@ public class AxisInnovatorsBox {
organizingCrashReports(throwable instanceof Exception ?
(Exception) throwable : new Exception(throwable));
});
// 初始化,这里为了能够在登录窗口使用主题,特意将初始化放在构造函数中
main.initLog4j2();
main.setTopic();
// 加载登录信息,如果没有,弹出登录弹窗,后续可以删掉默认弹出
// TODO: login window
// TODO: login window should not be show when AxisInnovatorsBox initialize,
// it should be show when user click login button.
try {
StateManager stateManager = new StateManager();
String token = stateManager.getState("loginToken");
@@ -107,22 +111,29 @@ public class AxisInnovatorsBox {
} else if (loginResult.success()) {
loginData = loginResult.loginData();
stateManager.saveState("loginToken", loginResult.token());
logger.info("Login result: token: " + loginResult.token() + ", user: " + loginResult.user());
logger.info(
"Login result: token: " + loginResult.token() + ", user: " + loginResult.user());
JOptionPane.showMessageDialog(null, "登录成功", "登录",
JOptionPane.INFORMATION_MESSAGE);
} else {
// 登录失败,弹出错误提醒,这里只是输出登录错误信息
logger.error("Login error: " + loginResult.message());
JOptionPane.showMessageDialog(null, "登录失败: \n" + loginResult.message(), "登录失败", JOptionPane.ERROR_MESSAGE);
JOptionPane.showMessageDialog(null, "登录失败: \n" + loginResult.message(), "登录失败",
JOptionPane.ERROR_MESSAGE);
}
} else {
CasdoorServer casdoorServer = new CasdoorServer();
User user = casdoorServer.parseJwtToken(token);
loginData = new LoginData(token, user);
}
} catch (InterruptedException e) {
logger.error("InterruptedException: Failed to load login information", e);
} catch (InvocationTargetException e) {
logger.error("InvocationTargetException: Failed to load login information", e);
} catch (Exception e) {
logger.error("Failed to load login information", e);
}
logger.error("Exception: Failed to load login information", e);
} // 添加了更详细的异常处理
}
/**
@@ -978,8 +989,6 @@ public class AxisInnovatorsBox {
main = new AxisInnovatorsBox(args,isDebug);
try {
main.initLog4j2();
main.setTopic();
List<Map<String, String>> validFiles = ArgsParser.parseArgs(args);
for (Map<String, String> fileInfo : validFiles) {
@@ -993,6 +1002,7 @@ public class AxisInnovatorsBox {
}
main.thread = new Thread(() -> {
try {
// 主任务1加载插件
logger.info("Loaded plugins Started");

View File

@@ -91,6 +91,37 @@ public class CasdoorLoginWindow {
}
private void initUI() {
if (browser == null) {
try {
// 初始化浏览器
CefApp cefApp = CefAppManager.getInstance();
CefClient client = cefApp.createClient();
browser = client.createBrowser(
casdoorServer.getSigninUrl(),
false,
false);
} catch (Throwable e) {
logger.error("Failed to initialize CefBrowser", e);
// 浏览器初始化失败,弹出默认浏览器替代,并提示用户
// 如果浏览器初始化失败,改为在默认浏览器打开登录页面
openCasdoorLoginPageInDefaultBrowser();
// JOptionPane.showMessageDialog(dialog,
// "浏览器初始化失败,已在默认浏览器打开登录页面,请手动完成登录。",
// "内嵌浏览器初始化失败",
// JOptionPane.WARNING_MESSAGE
// );
String message = "浏览器初始化失败,已在默认浏览器打开登录页面,请手动完成登录。\n或者手动复制下面链接在浏览器打开进行登录\n"
+ casdoorServer.getSigninUrl();
JTextArea textArea = new JTextArea(message);
textArea.setEditable(false);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setBackground(null);
textArea.setSize(600, 400);
JOptionPane.showMessageDialog(dialog, new JScrollPane(textArea), "内嵌浏览器初始化失败", JOptionPane.WARNING_MESSAGE);
}
}
dialog = new JDialog();
dialog.setTitle("AXIS 认证");
dialog.setSize(500, 750);
@@ -100,42 +131,40 @@ public class CasdoorLoginWindow {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
if (browser != null) {
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
JButton backButton = new JButton("");
backButton.setIcon(LoadIcon.loadIcon("back.png", 24));
backButton.addActionListener(e -> browser.goBack());
backButton.setFocusPainted(false);
backButton.setBorderPainted(false);
JButton forwardButton = new JButton("");
forwardButton.setIcon(LoadIcon.loadIcon("forward.png", 24));
forwardButton.addActionListener(e -> browser.goForward());
forwardButton.setFocusPainted(false);
forwardButton.setBorderPainted(false);
JButton refreshButton = new JButton("");
refreshButton.setIcon(LoadIcon.loadIcon("refresh.png", 24));
refreshButton.addActionListener(e -> browser.reload());
refreshButton.setFocusPainted(false);
refreshButton.setBorderPainted(false);
// 将按钮面板添加到主panel顶部
buttonPanel.add(backButton);
buttonPanel.add(forwardButton);
buttonPanel.add(refreshButton);
panel.add(buttonPanel, 0);
JButton homeButton = new JButton("");
homeButton.setIcon(LoadIcon.loadIcon("material-symbols-home.png", 24));
homeButton.addActionListener(e -> browser.loadURL(casdoorServer.getSigninUrl()));
homeButton.setFocusPainted(false);
homeButton.setBorderPainted(false);
JButton backButton = new JButton("");
backButton.setIcon(LoadIcon.loadIcon("material-symbols-back.png", 24));
backButton.addActionListener(e -> browser.goBack());
backButton.setFocusPainted(false);
backButton.setBorderPainted(false);
JButton forwardButton = new JButton("");
forwardButton.setIcon(LoadIcon.loadIcon("material-symbols-forward.png", 24));
forwardButton.addActionListener(e -> browser.goForward());
forwardButton.setFocusPainted(false);
forwardButton.setBorderPainted(false);
JButton refreshButton = new JButton("");
refreshButton.setIcon(LoadIcon.loadIcon("material-symbols-refresh.png", 24));
refreshButton.addActionListener(e -> browser.reload());
refreshButton.setFocusPainted(false);
refreshButton.setBorderPainted(false);
// 将按钮面板添加到主panel顶部
buttonPanel.add(homeButton);
buttonPanel.add(backButton);
buttonPanel.add(forwardButton);
buttonPanel.add(refreshButton);
panel.add(buttonPanel, 0);
if (browser == null) {
// 初始化浏览器
CefApp cefApp = CefAppManager.getInstance();
CefClient client = cefApp.createClient();
browser = client.createBrowser(
casdoorServer.getSigninUrl(),
false,
false);
panel.add(browser.getUIComponent());
}
panel.add(browser.getUIComponent());
dialog.add(panel);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
@Override
@@ -152,7 +181,9 @@ public class CasdoorLoginWindow {
if (server == null) {
startLocalCallbackServer();
}
browser.loadURL(casdoorServer.getSigninUrl());
if (browser != null) {
browser.loadURL(casdoorServer.getSigninUrl());
}
}
/**

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB