Webflux实现登出功能时无法删除jwt与SESSION Cookie该如何处理?
问题解答
1. 为什么登出后Cookie仍然保留?
你当前使用的response.getCookies().remove()方法仅能移除本次响应对象中暂存的待添加Cookie,无法触发浏览器删除本地已存储的Cookie。Cookie本身存储在用户浏览器端,服务端没有权限直接删除浏览器本地的Cookie数据,只能通过返回同名、过期时间设置为过去时间点、属性(路径、Domain、HttpOnly等)与原Cookie完全一致的Cookie,让浏览器识别为过期后自动删除。
另外代码中调用WebSession::invalidate仅会销毁服务端存储的会话数据,不会主动通知浏览器清理本地的SESSION Cookie,所以浏览器仍会保留旧的SESSION Cookie。
2. 如何实现登出时彻底删除相关Cookie
将登出成功处理器中删除Cookie的逻辑,替换为添加过期Cookie的逻辑即可,修改后示例代码如下:
@Override public Mono<Void> onLogoutSuccess(WebFilterExchange exchange, Authentication authentication) { ServerHttpResponse response = exchange.getExchange().getResponse(); response.setStatusCode(HttpStatus.FOUND); response.getHeaders().setLocation(URI.create("/loginpage")); // 构造过期的jwt Cookie,属性需和登录时设置的完全一致 ResponseCookie expiredJwt = ResponseCookie.from("jwt", "") .httpOnly(true) .path("/") .maxAge(0) // 设为0表示立即过期 .build(); response.addCookie(expiredJwt); // 构造过期的SESSION Cookie ResponseCookie expiredSession = ResponseCookie.from("SESSION", "") .path("/") .maxAge(0) .build(); response.addCookie(expiredSession); return exchange.getExchange().getSession() .flatMap(WebSession::invalidate); }
注意:如果当初设置Cookie时指定了Domain、自定义路径等特殊属性,删除时构造的过期Cookie也要保持完全相同的属性,否则浏览器无法匹配到原Cookie完成删除操作。
内容的提问来源于stack exchange,提问作者Serg
相关产品推荐
相关产品推荐

