Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 会话覆盖实现_Angularjs_Design Patterns_Oauth_Spring Security_Jwt - Fatal编程技术网

Angularjs 会话覆盖实现

Angularjs 会话覆盖实现,angularjs,design-patterns,oauth,spring-security,jwt,Angularjs,Design Patterns,Oauth,Spring Security,Jwt,我正在为我的web应用程序使用SpringBoot、AngularJS和REST。我还使用JWT/oAuth令牌进行用户身份验证和授权,这意味着会话是无状态的 我们有一个要求,其中一个重复的会话不应该被允许为用户 我已经实现了一种方法,如果用户从同一台机器或任何其他机器的任何其他浏览器登录,那么将显示会话覆盖确认消息 如果会话被覆盖,则每当用户尝试执行任何活动时,第一个会话都将终止 为此,该用户的最后令牌生成时间将保留在服务器内存中 如果传入令牌生成时间与内存中的时间匹配,则授予访问权限,否则抛

我正在为我的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();
}
}
}

当我需要检测用户是手动注销还是由于会话超时(通常他们只是关闭浏览器而忘记注销)时,我也有类似的情况

我所做的是利用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();
}
}
}