web项目中使用shiro权限管理,session过期

嘣猪嗤痴 发布于 2016/05/23 09:15
阅读 8K+
收藏 3
Java web项目中权限控制使用的是shiro,不明白一点,当shiro配置的session过期时候,页面中的ajax请求要怎么处理,现在的是session过期后,ajax返回的数据是login页面,所以出现undefined,这个要怎么解决,shiro中是否有这样对应的解决办法
加载中
1
_DeepBlue
_DeepBlue
 
@RequestMapping(value = { "/login-form.html", "/" }, method = GET)
public String loginForm() {
 if(contextService.isAuthenticated()) {
 return "redirect:/home.html";
 } else {
 HttpServletRequest request = contextService.getRequest();
 HttpServletResponse response = contextService.getResponse();
 boolean isAjax = false;
 Enumeration<String> values = request.getHeaders("X-Requested-With");
 while(values.hasMoreElements()) {
 String value = values.nextElement();
 if("XMLHttpRequest".equalsIgnoreCase(value)) {
 isAjax = true;
 break;
 }
 }
 if(isAjax) {
 response.setHeader("Session-Status", "timeout");
 response.setHeader("Login-Path", contextService.getContextPath());
 }
 return "/login-form";
 }
}
$(function() {
	$(document).ajaxComplete(function(event, xhr, settings) {
		if (xhr.getResponseHeader('Session-Status') == 'timeout') {
			if (xhr.getResponseHeader('Login-Path')) {
				window.location.replace(xhr.getResponseHeader('Login-Path'));
			} else {
				alert("Session timeout, please relogin!");
			}
		} else if(403 == xhr.status) {
			window.location.reload();
		}
	});

});



我和夏天有个约会
我和夏天有个约会
牛逼啊,真的可以,大神,膜拜
嘣猪嗤痴
嘣猪嗤痴
回复 @_DeepBlue :登录页面每次登录才判断,那其他请求,登录页面咋判断是否是ajax请求呢
嘣猪嗤痴
嘣猪嗤痴
回复 @_DeepBlue : 登录页面??
_DeepBlue
_DeepBlue
回复 @嘣猪嗤痴 : 简单来说就是 在服务器端的登录页面主要判断是否是ajax 如果是就在响应头中加入一个标识 在浏览器端发起的ajax请求 在请求完成首先要做的就是判断响应头有没有服务器端加入的标识 如果有就证明session超时了 跳到登录页面
嘣猪嗤痴
嘣猪嗤痴
回复 @_DeepBlue :没明白是怎么回事,怎么是只在登录页面呢,我们这是登录完成之后,新的页面里的ajax ,这个ajax是定时执行的 ,十分钟刷新一次
下一页
0
杨少_winston
杨少_winston
过期跳到登录页是正常的不是吗?
0
北极心
北极心
               
0
北极心
北极心

                                                                   30%

                                                                                                40%

                                                                                                                     45%


0
shijacky
shijacky

1.简单点,服务端判断到是ajax请求的时候,直接报登陆失效的消息,客户端显示这个消息

2. 高级点,客户端收到服务端登陆失效的消息后,重定向到登陆页

0
p2ng
p2ng

 刚好用到的是jq,而且都有统一的ajaxSuccess的话,可以作统一前端拦截。跳转

0
红薯官方
红薯官方

我的做法是,后端统一拦截判断请求类型并检查访问身份是否有效,如返回403时是ajax发起的请求,则返回一段JSON,否则返回html。

你当然可以写一个js,做一个页面上面的全局拦截:

$(document).ajaxError(function(event,jqXhr, obj, text) {

//TODO ajax请求异常的处理逻辑

});

0
奥神Well
奥神Well

引用来自“_DeepBlue”的评论

 
@RequestMapping(value = { "/login-form.html", "/" }, method = GET)
public String loginForm() {
 if(contextService.isAuthenticated()) {
 return "redirect:/home.html";
 } else {
 HttpServletRequest request = contextService.getRequest();
 HttpServletResponse response = contextService.getResponse();
 boolean isAjax = false;
 Enumeration<String> values = request.getHeaders("X-Requested-With");
 while(values.hasMoreElements()) {
 String value = values.nextElement();
 if("XMLHttpRequest".equalsIgnoreCase(value)) {
 isAjax = true;
 break;
 }
 }
 if(isAjax) {
 response.setHeader("Session-Status", "timeout");
 response.setHeader("Login-Path", contextService.getContextPath());
 }
 return "/login-form";
 }
}
$(function() {
	$(document).ajaxComplete(function(event, xhr, settings) {
		if (xhr.getResponseHeader('Session-Status') == 'timeout') {
			if (xhr.getResponseHeader('Login-Path')) {
				window.location.replace(xhr.getResponseHeader('Login-Path'));
			} else {
				alert("Session timeout, please relogin!");
			}
		} else if(403 == xhr.status) {
			window.location.reload();
		}
	});

});



就是这个思路
返回顶部
顶部