我正在寻找更好的架构解决方案。目前我们有以下终点:
/**
* Endpoint for frontend to be sure we are logged in
*/
@RequestMapping(value = "/is_auth")
public boolean getAuth() {
return true;
}
Spring Security涵盖了此终点,只有经过身份验证的用户才能访问它。
让前端了解用户身份验证状态的最佳做法是什么?
答案 0 :(得分:1)
看起来您正在使用池来检查登录状态。你的控制器方法
@RequestMapping(value = "/is_auth")
public boolean getAuth() {
return true;
}
永远不会返回false
。所以通常在这种情况下不需要返回值。
@ResponseStatus(value = HttpStatus.OK)
@RequestMapping(value = "/is_auth")
public void ping() {
// log ?
}
我认为最好的解决方案是客户端和服务器之间的 websocket 连接。如果您随后实施SessionListener
,如果会话过期,您可以非常轻松地向相应的客户端发送登录状态:
//
// pseudo code
//
@Component
public class SessionListener implements HttpSessionListener {
private static final Logger logger = LoggerFactory.getLogger(SessionListener.class);
@Autowired
private IWebsocketService websocketService; // you own service here
@Override
public void sessionCreated(HttpSessionEvent se) {
logger.debug("sessionCreated: {}", se.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
String sessionId = se.getSession().getId();
logger.debug("sessionDestroyed: {}", sessionId);
websocketService.sendLoginStatus(sessionId, false);
}
}
编辑:这是一个很好的例子,如何使用spring和javascript实现websockets:Using WebSocket to build an interactive web application