Hola @jzyong
Encontramos que el chequeo "Config.SERVER_AUTH.equals(auth)" está duplicado en al menos 7 handlers HTTP administrativos (ExitServerHandler, GmHandler, ReloadConfigHandler, ReloadScriptHandler, JvmInfoHandler, ThreadInfoHandler, SetServerStateHandler).
Situación actual:
Cada handler repite el mismo bloque de validación; si se agrega un nuevo endpoint administrativo y se olvida copiar el chequeo, queda expuesto sin autenticación (ExitServerHandler incluso puede apagar el servidor).
Solución propuesta:
Aplicar el patrón Decorator con una clase AuthenticatedHandlerDecorator que implemente IHandler y centralice la verificación, delegando al handler real solo si la autenticación es válida.
Esto reduce la duplicación y hace que la protección de nuevos endpoints administrativos sea explícita en su registro, no opcional. Quedamos atentos a sus comentarios.
- Implementación del Decorador: AuthenticatedHandlerDecorator
public class AuthenticatedHandlerDecorator implements IHandler {
private final IHandler delegate;
public AuthenticatedHandlerDecorator(IHandler delegate) {
this.delegate = delegate;
}
@Override
public void run() {
String auth = delegate.getParam("auth");
// Centraliza la verificación de autenticación
if (!Config.SERVER_AUTH.equals(auth)) {
delegate.sendMsg("验证失败"); // Mensaje de fallo
return;
}
delegate.run(); // Delega el comportamiento original si está autenticado
}
}
2. Clase concreta: ExitServerHandler
@HandlerEntity(path = "/server/exit")
public class ExitServerHandler extends HttpHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(ExitServerHandler.class);
@Override
public void run() {
String info = String.format("%s关闭服务器", MsgUtil.getIp(getSession()));
LOGGER.info(info);
sendMsg(info);
MailConfig mailConfig = MailManager.getInstance().getMailConfig();
String[] recives = mailConfig.getReciveUser().toArray(new String[mailConfig.getReciveUser().size()]);
MailManager.getInstance().sendTextMail("服务器关闭", Config.SERVER_NAME + info, recives);
System.exit(1);
}
}

Hola @jzyong
Encontramos que el chequeo "Config.SERVER_AUTH.equals(auth)" está duplicado en al menos 7 handlers HTTP administrativos (ExitServerHandler, GmHandler, ReloadConfigHandler, ReloadScriptHandler, JvmInfoHandler, ThreadInfoHandler, SetServerStateHandler).
Situación actual:
Cada handler repite el mismo bloque de validación; si se agrega un nuevo endpoint administrativo y se olvida copiar el chequeo, queda expuesto sin autenticación (ExitServerHandler incluso puede apagar el servidor).
Solución propuesta:
Aplicar el patrón Decorator con una clase AuthenticatedHandlerDecorator que implemente IHandler y centralice la verificación, delegando al handler real solo si la autenticación es válida.
Esto reduce la duplicación y hace que la protección de nuevos endpoints administrativos sea explícita en su registro, no opcional. Quedamos atentos a sus comentarios.
public class AuthenticatedHandlerDecorator implements IHandler {
}
2. Clase concreta: ExitServerHandler
@HandlerEntity(path = "/server/exit")
public class ExitServerHandler extends HttpHandler {
}