Shiro中Session过期页面跳转回登录页面处理问题
2017-09-28 17:55
489 查看
Session超时的两种情况:
shiro在管理session后,在session超时会进行跳转,这里有两种情况需要考虑,一种是ajax方式的请求超时,一种页面跳转请求的超时;
解决问题的思路:通过定义过滤器来检查是否Session过期问题,当前是否session超时,超时判定是否是ajax请求,如果是ajax请求,则在response头部设置session-status值,返回到前端读取到相应值后进行处理;
后台代码
package xxxxxx.sys_common.core.shiro.filter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.shiro.web.filter.AccessControlFilter;
import xxxxxx.model.entity.SysUser;
import xxxxxx.core.shiro.token.manager.TokenManager;
import xxxxxx.utils.LoggerUtils;
/**
* 判断登录过滤器
*/
public class LoginFilter extends AccessControlFilter {
/**
* 是否允许访问
*/
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
SysUser token = TokenManager.getToken();
//Session未失效时验证通过
if(null != token || isLoginRequest(request, response)){
return Boolean.TRUE;
}
//如果是ajax请求响应头会有,x-requested-with
if(ShiroFilterUtils.isAjax(request)){
LoggerUtils.debug(getClass(), "当前用户没有登录,并且是Ajax请求!");
ShiroFilterUtils.out(response, resultMap);
//通过返回TRUE,通过前台的统一AJAX接受头部设置的sessionstatus参数,判断是否跳转到登录页面
return Boolean.TRUE;
}//FALSE Session失效,切实非AJAX请求,验证是否,调用onAccessDenied跳转到登录页面
return Boolean.FALSE;
}
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
//保存Request和Response 到登录后的链接
saveRequestAndRedirectToLogin(request, response);
return false;
}
}
package xxxxxx.core.shiro.filter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import xxxxxx.LoggerUtils;
import net.sf.json.JSONObject;
/**
* Shiro Filter 工具类
*
*/
public class ShiroFilterUtils {
final static Class<? extends ShiroFilterUtils> CLAZZ = ShiroFilterUtils.class;
//登录页面
static final String LOGIN_URL="/u/login";
//没有授权提醒
static final String UNAUTHORIZED = "/open/unauthorized";
/**
*是否是Ajax请求,如果是ajax请求响应头会有,x-requested-with
* @param request
* @return
*/
public static boolean isAjax(ServletRequest request){
return "XMLHttpRequest".equalsIgnoreCase(((HttpServletRequest)request).getHeader("X-Requested-With"));
}
/**
* response 设置超时
* @param hresponse
* @param resultMap
* @throws IOException
*/
public static void out(ServletResponse servletResponse){
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setCharacterEncoding("UTF-8");
//在响应头设置session状态
response.setHeader("session-status", "timeout");
}
}
shiro.xml配置文件
<bean id="login" class="com.htdadao.pms.sys_common.core.shiro.filter.LoginFilter"/>
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="filters">
<util:map>
<entry key="login" value-ref="login"></entry>
</util:map>
</property>
</bean>
前台代码
<script>
//全局的ajax访问,处理ajax清求时session超时
$.ajaxSetup({
contentType:"application/x-www-form-urlencoded;charset=utf-8",
complete:function(XMLHttpRequest,textStatus){
//通过XMLHttpRequest取得响应头,sessionstatus,
var sessionstatus=XMLHttpRequest.getResponseHeader("session-status");
if(sessionstatus=="timeout"){
//如果超时就处理 ,指定要跳转的页面(比如登陆页)
window.location.replace("<%=realPath%>"+"/u/login");
}
}
});
</script>
参考
Shiro中session超时页面跳转的处理 http://blog.csdn.net/jrn1012/article/details/70396502
Ajax状态值及状态码 http://www.cnblogs.com/luoguixin/p/6249566.html
jQuery - 拦截所有Ajax请求(统一处理超时、返回结果、错误状态码 )(备注:分别可以通过设置header,返回Json,或者设置HTTP的status指的方式返回前台通知超时)http://www.hangge.com/blog/cache/detail_1412.html
shiro在管理session后,在session超时会进行跳转,这里有两种情况需要考虑,一种是ajax方式的请求超时,一种页面跳转请求的超时;
解决问题的思路:通过定义过滤器来检查是否Session过期问题,当前是否session超时,超时判定是否是ajax请求,如果是ajax请求,则在response头部设置session-status值,返回到前端读取到相应值后进行处理;
后台代码
package xxxxxx.sys_common.core.shiro.filter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.shiro.web.filter.AccessControlFilter;
import xxxxxx.model.entity.SysUser;
import xxxxxx.core.shiro.token.manager.TokenManager;
import xxxxxx.utils.LoggerUtils;
/**
* 判断登录过滤器
*/
public class LoginFilter extends AccessControlFilter {
/**
* 是否允许访问
*/
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
SysUser token = TokenManager.getToken();
//Session未失效时验证通过
if(null != token || isLoginRequest(request, response)){
return Boolean.TRUE;
}
//如果是ajax请求响应头会有,x-requested-with
if(ShiroFilterUtils.isAjax(request)){
LoggerUtils.debug(getClass(), "当前用户没有登录,并且是Ajax请求!");
ShiroFilterUtils.out(response, resultMap);
//通过返回TRUE,通过前台的统一AJAX接受头部设置的sessionstatus参数,判断是否跳转到登录页面
return Boolean.TRUE;
}//FALSE Session失效,切实非AJAX请求,验证是否,调用onAccessDenied跳转到登录页面
return Boolean.FALSE;
}
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
//保存Request和Response 到登录后的链接
saveRequestAndRedirectToLogin(request, response);
return false;
}
}
package xxxxxx.core.shiro.filter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import xxxxxx.LoggerUtils;
import net.sf.json.JSONObject;
/**
* Shiro Filter 工具类
*
*/
public class ShiroFilterUtils {
final static Class<? extends ShiroFilterUtils> CLAZZ = ShiroFilterUtils.class;
//登录页面
static final String LOGIN_URL="/u/login";
//没有授权提醒
static final String UNAUTHORIZED = "/open/unauthorized";
/**
*是否是Ajax请求,如果是ajax请求响应头会有,x-requested-with
* @param request
* @return
*/
public static boolean isAjax(ServletRequest request){
return "XMLHttpRequest".equalsIgnoreCase(((HttpServletRequest)request).getHeader("X-Requested-With"));
}
/**
* response 设置超时
* @param hresponse
* @param resultMap
* @throws IOException
*/
public static void out(ServletResponse servletResponse){
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setCharacterEncoding("UTF-8");
//在响应头设置session状态
response.setHeader("session-status", "timeout");
}
}
shiro.xml配置文件
<bean id="login" class="com.htdadao.pms.sys_common.core.shiro.filter.LoginFilter"/>
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="filters">
<util:map>
<entry key="login" value-ref="login"></entry>
</util:map>
</property>
</bean>
前台代码
<script>
//全局的ajax访问,处理ajax清求时session超时
$.ajaxSetup({
contentType:"application/x-www-form-urlencoded;charset=utf-8",
complete:function(XMLHttpRequest,textStatus){
//通过XMLHttpRequest取得响应头,sessionstatus,
var sessionstatus=XMLHttpRequest.getResponseHeader("session-status");
if(sessionstatus=="timeout"){
//如果超时就处理 ,指定要跳转的页面(比如登陆页)
window.location.replace("<%=realPath%>"+"/u/login");
}
}
});
</script>
参考
Shiro中session超时页面跳转的处理 http://blog.csdn.net/jrn1012/article/details/70396502
Ajax状态值及状态码 http://www.cnblogs.com/luoguixin/p/6249566.html
jQuery - 拦截所有Ajax请求(统一处理超时、返回结果、错误状态码 )(备注:分别可以通过设置header,返回Json,或者设置HTTP的status指的方式返回前台通知超时)http://www.hangge.com/blog/cache/detail_1412.html
相关文章推荐
- Shiro中Session过期页面跳转回登录页面处理问题
- Shiro中Session过期页面跳转回登录页面处理问题
- 解决easyui在session过期后iframe跳转到登录页面的问题
- java web session过期 跳转登录页面,怎么跳出iframe的问题
- frameset、iframe框架登录跳转, 处理session为空的登录页面问题
- 处理jquery的ajax请求session过期跳转到登录页面
- ajax前置处理实现异步请求session过期时跳转登录页面
- 记录问题:登录session过期,ajax请求被web security拦截,页面没有数据且没有重定向到login页面
- java web session过期 跳转页面没有跳出frame的问题
- shiro +springmvc+freemarker session问题处理 shiro无法记录登陆前页面问题
- session过期情况下弹出窗口显示2个登陆页面的问题处理
- Ext6.x+springmvc+shiro框架下实现session过期跳转到登录页面
- Session过期后自动跳转到登录页面的实例代码
- 重写ajax方法实现异步请求session过期时跳转登录页面
- session过期后登录页面嵌套在框架中问题的解决方案
- strust2拦截器处理Session超时跳转登录页面
- jQuery ajax全局函数处理session过期后的ajax跳转问题
- jQuery ajax全局函数处理session过期后的ajax跳转问题
- Shiro中session超时页面跳转的处理
- 当 jquery 发送 ajax 请求的时候遇到服务端session过期超时返回 302 跳转登陆页面的时候怎么办的处理方法