Angularjs 会话覆盖实现
我正在为我的web应用程序使用SpringBoot、AngularJS和REST。我还使用JWT/oAuth令牌进行用户身份验证和授权,这意味着会话是无状态的 我们有一个要求,其中一个重复的会话不应该被允许为用户 我已经实现了一种方法,如果用户从同一台机器或任何其他机器的任何其他浏览器登录,那么将显示会话覆盖确认消息 如果会话被覆盖,则每当用户尝试执行任何活动时,第一个会话都将终止Angularjs 会话覆盖实现,angularjs,design-patterns,oauth,spring-security,jwt,Angularjs,Design Patterns,Oauth,Spring Security,Jwt,我正在为我的web应用程序使用SpringBoot、AngularJS和REST。我还使用JWT/oAuth令牌进行用户身份验证和授权,这意味着会话是无状态的 我们有一个要求,其中一个重复的会话不应该被允许为用户 我已经实现了一种方法,如果用户从同一台机器或任何其他机器的任何其他浏览器登录,那么将显示会话覆盖确认消息 如果会话被覆盖,则每当用户尝试执行任何活动时,第一个会话都将终止 为此,该用户的最后令牌生成时间将保留在服务器内存中 如果传入令牌生成时间与内存中的时间匹配,则授予访问权限,否则抛
为此,该用户的最后令牌生成时间将保留在服务器内存中
如果传入令牌生成时间与内存中的时间匹配,则授予访问权限,否则抛出会话过期错误。
当用户成功注销时,该用户的条目将从内存中清除,新的身份验证请求不会抛出会话覆盖错误 现在发生的情况是,每当用户没有成功注销并且只是关闭浏览器窗口时,服务器值就不会被清除。 当用户再次尝试登录时,会抛出会话覆盖消息,即使(从用户的角度来看)并没有重复的会话 我的问题是:在出现上述情况时,是否有任何方法可以避免显示会话覆盖消息,但如果用户确实在尝试复制会话,则可以同时显示覆盖消息 是否有任何应用程序/设计可用于处理此类情况
欢迎任何建议/想法。当我需要检测用户是否手动或通过会话超时注销(通常他们只是关闭浏览器而忘记注销)时,我也有类似的情况 我所做的是利用spring
ApplicationListener
public class SessionAuditListener implements ApplicationListener<ApplicationEvent> {
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
if (applicationEvent instanceof HttpSessionDestroyedEvent) {
// do whatever it needs here
HttpSession httpSession = ((HttpSessionDestroyedEvent) applicationEvent).getSession();
}
}
}
公共类SessionAuditListener实现ApplicationListener{
@凌驾
ApplicationEvent上的公共无效(ApplicationEvent ApplicationEvent){
if(HttpSessionDestroyeEvent的applicationEvent实例){
//这里需要什么就做什么
HttpSession HttpSession=((HttpSessionDestroyedEvent)applicationEvent).getSession();
}
}
}
当我需要检测用户是手动注销还是由于会话超时(通常他们只是关闭浏览器而忘记注销)时,我也有类似的情况
我所做的是利用springApplicationListener
public class SessionAuditListener implements ApplicationListener<ApplicationEvent> {
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
if (applicationEvent instanceof HttpSessionDestroyedEvent) {
// do whatever it needs here
HttpSession httpSession = ((HttpSessionDestroyedEvent) applicationEvent).getSession();
}
}
}
公共类SessionAuditListener实现ApplicationListener{
@凌驾
ApplicationEvent上的公共无效(ApplicationEvent ApplicationEvent){
if(HttpSessionDestroyeEvent的applicationEvent实例){
//这里需要什么就做什么
HttpSession HttpSession=((HttpSessionDestroyedEvent)applicationEvent).getSession();
}
}
}