如何在会话结束时将Web应用程序流重定向到特定页面?

时间:2017-09-04 11:42:30

标签: javascript jquery angularjs web-applications session-management

我有一个在AngularJS / Javascript上开发的Web应用程序,后端是Java / Spring。我有一个与我的Web应用程序的会话管理相关的问题。

我已使用session-config中的web.xml session-timeout参数设置会话超时,如下所示

<session-config>
    <session-timeout>1</session-timeout>
</session-config>

1分钟后,会话超时。我有一个场景,我需要在会话超时后将我的Web应用程序流重定向到登录页面。

场景1:如果我点击任何需要加载新页面的链接/按钮,它会自动检测到会话超时并将应用程序重定向到登录页面。这个工作很精细。

场景2:但如果页面包含我选择的任何下拉菜单,则应用程序不会重定向到登录页面。 这就是问题。

通常情况下,当我从下拉列表中选择任何值时,它会对后端进行休息调用并获取填充页面上的值所需的数据。现在,如果会话在一分钟后结束,并且如果我选择下拉列表,则会话结束时不会对后端进行任何调用。

现在,在这种情况下应该做些什么来确保即使我选择了下拉菜单,如果会话结束,它也会以某种方式检测到它并将应用程序重定向到登录页面。当我选择下拉值并且可以根据需要重定向流时,有没有办法使用角度JS或javascript检查会话是否仍然存在?

考虑到当我选择下拉列表时,流程不会进入后端,我想我可能只需要在客户端(前端)而不是后端处理此重定向。不知道如何做到这一点。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以使用http intercetor来帮助您。基本上,拦截器将在您每次发出请求时执行,在发出请求时发出错误,在您响应时或在响应中出现错误时执行。根据响应状态,您可以将控件重定向到错误页面。

app.factory('CustomHttpInterceptor',[ '$q' , '$location', function( $q , $location, TimeoutBroadCaster ){
        return{
            request: function(config) {
                return config;
            },

            requestError: function(config) {
                return config;
            },

            response: function(res) {
                return res;
            },

            responseError: function(res) {              
                if(res.status != 200){
                     $location.path( 'timed-out' );
                }
                return res;
            }
        }

    }

    ]);

然后在应用程序启动时的config方法中,使用

将此拦截器推送到队列中
$httpProvider.interceptors.push('CustomHttpInterceptor');

为了简化操作,在服务器端,您可以提供一些自定义错误状态,这可以帮助您确定会话是否超时并专门针对该条件进行检查。