Commit c6e0febc by stylefeng

优化session超时问题

parent 7a92ee98
...@@ -18,11 +18,15 @@ ...@@ -18,11 +18,15 @@
*/ */
package com.stylefeng.guns.core.intercept; package com.stylefeng.guns.core.intercept;
import com.stylefeng.guns.core.shiro.ShiroKit;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.AccessControlFilter; import org.apache.shiro.web.filter.AccessControlFilter;
import org.apache.shiro.web.util.WebUtils;
import javax.servlet.ServletRequest; import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/** /**
* Filter that allows access to resources if the accessor is a known user, which is defined as * Filter that allows access to resources if the accessor is a known user, which is defined as
...@@ -63,12 +67,39 @@ public class GunsUserFilter extends AccessControlFilter { ...@@ -63,12 +67,39 @@ public class GunsUserFilter extends AccessControlFilter {
* execute. * execute.
*/ */
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
HttpServletRequest httpServletRequest = WebUtils.toHttp(request);
HttpServletResponse httpServletResponse = WebUtils.toHttp(response);
/** /**
* 让请求继续执行,直到走到SessionTimeoutInterceptor * 如果是ajax请求则不进行跳转
*/ */
if (httpServletRequest.getHeader("x-requested-with") != null
&& httpServletRequest.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
httpServletResponse.setHeader("sessionstatus", "timeout");
return false;
} else {
/**
* 第一次点击页面
*/
String referer = httpServletRequest.getHeader("Referer");
if (referer == null) {
saveRequestAndRedirectToLogin(request, response);
return false;
} else {
//saveRequestAndRedirectToLogin(request, response); /**
return true; * 从别的页面跳转过来的
*/
if (ShiroKit.getSession().getAttribute("sessionFlag") == null) {
httpServletRequest.setAttribute("tips", "session超时");
httpServletRequest.getRequestDispatcher("/login.html").forward(request, response);
return false;
} else {
saveRequestAndRedirectToLogin(request, response);
return false;
}
}
}
} }
} }
...@@ -16,7 +16,7 @@ import org.springframework.stereotype.Component; ...@@ -16,7 +16,7 @@ import org.springframework.stereotype.Component;
*/ */
@Aspect @Aspect
@Component @Component
public class SessionInterceptor extends BaseController { public class SessionHolderInterceptor extends BaseController {
@Pointcut("execution(* com.stylefeng.guns.*..controller.*.*(..))") @Pointcut("execution(* com.stylefeng.guns.*..controller.*.*(..))")
public void cutService() { public void cutService() {
......
package com.stylefeng.guns.core.intercept;
import com.stylefeng.guns.core.base.controller.BaseController;
import com.stylefeng.guns.core.shiro.ShiroKit;
import com.stylefeng.guns.core.support.HttpKit;
import org.apache.shiro.session.InvalidSessionException;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* 验证session超时的拦截器
*
* @author fengshuonan
* @date 2017年6月7日21:08:48
*/
@Aspect
@Component
@Order(100)
public class SessionTimeoutInterceptor extends BaseController {
@Pointcut("execution(* com.stylefeng.guns.*..controller.*.*(..))")
public void cutService() {
}
@Around("cutService()")
public Object sessionTimeoutValidate(ProceedingJoinPoint point) throws Throwable {
String servletPath = HttpKit.getRequest().getServletPath();
if (servletPath.equals("/kaptcha") || servletPath.equals("/login") || servletPath.equals("/global/sessionError")) {
return point.proceed();
}else{
if(ShiroKit.getSession().getAttribute("sessionFlag") == null){
ShiroKit.getSubject().logout();
throw new InvalidSessionException();
}else{
return point.proceed();
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment