我有一个在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检查会话是否仍然存在?
考虑到当我选择下拉列表时,流程不会进入后端,我想我可能只需要在客户端(前端)而不是后端处理此重定向。不知道如何做到这一点。
任何帮助都将不胜感激。
答案 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');
为了简化操作,在服务器端,您可以提供一些自定义错误状态,这可以帮助您确定会话是否超时并专门针对该条件进行检查。