2016-12-01 83 views
0

我在尋找更好的體系結構解決方案。目前,我們有以下終點:Spring Security:使用Ajax進行身份驗證

/** 
* Endpoint for frontend to be sure we are logged in 
*/ 
@RequestMapping(value = "/is_auth") 
public boolean getAuth() { 
    return true; 
} 

這個終點是由Spring Security的覆蓋,只有授權用戶才能訪問它。

使前端知道用戶身份驗證狀態的最佳做法是什麼?

回答

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); 
    } 

} 

編輯:這是一個很好的例子,如何實現與春天和JavaScript的WebSockets:Using WebSocket to build an interactive web application

+0

感謝您的回答! @dit,我使用auth2和SSO維護服務器端的會話。但問題是我不知道如何維護前端的身份驗證狀態。你能否提供JS代碼示例。 –

+0

@Rudziankoŭ見我的編輯。這個例子非常好。 – dit

相關問題