为了在前端通知用户超时,您需要从后端传递此信息。为此,我使用https://www.javaworld.com/article/2073234/tracking-session-expiration-in-browser.html 中的信息作为基线。
在控制器的每个响应方法中,您需要包含包含会话超时时间以及当前服务器时间的 cookie。由于听起来您已经在 web.xml 中设置了会话超时,因此您可以将 cookie 添加到您的响应中,类似于:
@RequestMapping(value="/example", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public ResponseEntity<Object> getExample(HttpServletRequest servletRequest, HttpServletResponse servletResponse) {
addTimeoutCookies(servletRequest, servletResponse);
//Do actual actions
return new ResponseEntity<Object>(HttpStatus.OK)
}
private void addTimeoutCookies(HttpServletRequest servletRequest, HttpServletResponse servletResponse) {
long currTime = System.currentTimeMillis();
long expiryTime = currTime + servletRequest.getSession().getMaxInactiveInterval() * 1000;
Cookie serverTimeCookie = new Cookie("serverTime", "" + currTime);
serverTimeCookie.setPath("/");
servletResponse.addCookie(serverTimeCookie);
Cookie expiryCookie = new Cookie("sessionExpiry", "" + expiryTime);
expiryCookie.setPath("/");
servletResponse.addCookie(expiryCookie);
}
然后,在前端,您需要检索这些 cookie 的值并将它们与客户端当前时间进行比较,以确定何时通知用户即将到来的会话超时。这是一个简单的代码块,基于此处的其他答案和链接中的文章:
var currTimeCookieName = 'serverTime';
var expireTimeCookieName = 'sessionExpiry';
var offset;
var warningTime = 5 * 60 * 1000;
var timeoutWarningMessage = 'Your session is going to be end by 5 min, Please click OK to continue';
function getCookie(name)
{
var name = name + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++)
{
var c = ca[i].trim();
if (c.indexOf(name)==0) return c.substring(name.length,c.length);
}
return "";
}
var serverTime = getCookie(currTimeCookieName);
serverTime = serverTime==null ? null : Math.abs(serverTime);
var offset = (new Date()).getTime() - serverTime;
function getTimeToWarning() {
var expireTime = getCookie(expireTimeCookieName);
return expireTime + offset - currTime - warningTime;
}
function checkForTimeout() {
var timeUntilWarning = getTimeToWarning();
setTimeout(function(){
if (getTimeToWarning() > 0) {
checkForTimeout();
} else {
if(confirm(timeoutWarningMessage)) {
//TODO do a backend call or other action to extend the session here
setTimeout(function() {
checkForTimeout();
}, 1 * 60 * 1000);
}
}
}, timeUntilWarning);
}
checkForTimeout();