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

Quarkus HTTP表单认证场景下会话无法正常登出问题如何解决?

问题原因
  • 你仅删除了客户端侧的认证Cookie与重定向Cookie,没有销毁服务端存储的对应会话实例,服务端仍会将该会话判定为有效状态
  • 未清除当前请求上下文绑定的安全认证信息,导致后续同会话请求仍能识别到登录状态
修复方案

方案1:修改现有RoutingContext实现

在删除Cookie前先销毁服务端会话即可,修改后的代码如下:

@Path("/auth")
public class AuthController {

    @LoggerName("AuthController")
    Logger log;

    @ConfigProperty(name = "quarkus.http.auth.form.cookie-name")
    String COOKIE_NAME;

    @ConfigProperty(name = "quarkus.http.auth.form.location-cookie")
    String REDIRECT_COOKIE_NAME;

    @ConfigProperty(name = "quarkus.http.auth.form.login-page")
    String LOGIN_PAGE;

    @GET
    @Path("/logout")
    public void logout(@Context RoutingContext ctx) {
        // 新增:销毁服务端会话,这是登出的核心逻辑
        if (ctx.session() != null) {
            ctx.session().destroy();
        }
        // 保留原有删除Cookie的逻辑,双重保证客户端无残留认证信息
        var c1 = ctx.removeCookie(COOKIE_NAME);
        var c2 = ctx.removeCookie(REDIRECT_COOKIE_NAME);
        log.info(String.format("c1 = %s, c2 = %s", c1.getName(), c2.getName()));
        ctx.redirect(LOGIN_PAGE);
    }
}

方案2:使用标准Servlet API简化实现

如果你的Quarkus应用引入了web扩展,可直接注入HttpServletRequest调用标准logout方法,不需要手动处理Cookie和会话:

@Path("/auth")
public class AuthController {

    @ConfigProperty(name = "quarkus.http.auth.form.login-page")
    String LOGIN_PAGE;

    @GET
    @Path("/logout")
    public Response logout(@Context HttpServletRequest request) throws ServletException {
        // 标准API自动完成会话销毁、Cookie清除、安全上下文清理
        request.logout();
        request.getSession().invalidate();
        return Response.temporaryRedirect(URI.create(LOGIN_PAGE)).build();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 14:09:02