shiro超时 ajax,Shiro:ajax的session超时处理

本问题解决方案参照网站多篇文章融合解决,在此表示感谢!

环境:springboot+shiro+jquery-easyui

问题:在ajax请求时,如果此时session已经失效,系统没有自动跳转到登录页面。后来在服务端加了判断ajax请求的代码,结果还是没有用,无法取到ajax特定的head值(X-Requested-With)。发现jquery-easyui表单提交时没有就没有传递这个值。

解决办法:

1.添加拦截器

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class SessionFilter extends FormAuthenticationFilter {

private Logger logger = LoggerFactory.getLogger(SessionFilter.class);

private final static String X_REQUESTED_WITH_STRING = "X-Requested-With";

private final static String XML_HTTP_REQUEST_STRING = "XMLHttpRequest";

private final static String SESSION_OUT_STIRNG = "sessionOut";

@Override

protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {

if (this.isLoginRequest(servletRequest, servletResponse)) {

if (this.isLoginSubmission(servletRequest, servletResponse)) {

return this.executeLogin(servletRequest, servletResponse);

} else {

return true;

}

} else {

if (isAjax((HttpServletRequest) servletRequest)) {

servletResponse.getWriter().print(SESSION_OUT_STIRNG);

} else {

this.saveRequestAndRedirectToLogin(servletRequest, servletResponse);

}

return false;

}

}

public boolean isAjax(HttpServletRequest httpServletRequest) {

String header = httpServletRequest.getHeader(X_REQUESTED_WITH_STRING);

if (XML_HTTP_REQUEST_STRING.equalsIgnoreCase(header)) {

logger.debug("当前请求为Ajax请求:{}", httpServletRequest.getRequestURI());

return Boolean.TRUE;

}

logger.debug("当前请求非Ajax请求:{}", httpServletRequest.getRequestURI());

return Boolean.FALSE;

}

}

2.覆盖默认shiro拦截器

@Bean

public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {

ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

// 必须设置 SecurityManager

shiroFilterFactoryBean.setSecurityManager(securityManager);

// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面

shiroFilterFactoryBean.setLoginUrl("/login");

// 登录成功后要跳转的链接

shiroFilterFactoryBean.setSuccessUrl("/index");

// 未授权界面;

shiroFilterFactoryBean.setUnauthorizedUrl("/403");

// 自定义拦截器

Map filtersMap = new LinkedHashMap();

// 限制同一帐号同时在线的个数。

filtersMap.put("kickout", filterKickoutSessionControl());

shiroFilterFactoryBean.setFilters(filtersMap);

// 权限控制map.

Map filterChainDefinitionMap = new LinkedHashMap();

filterChainDefinitionMap.put("/servlet/authimage", "anon");

filterChainDefinitionMap.put("/**", "authc");

shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

Map filters=new LinkedHashMap<>();

filters.put("authc", new SessionFilter());

shiroFilterFactoryBean.setFilters(filters);

return shiroFilterFactoryBean;

}

这个是重点,覆盖shiro默认的拦截器:

Map filters=new LinkedHashMap<>();

filters.put("authc", new SessionFilter());

shiroFilterFactoryBean.setFilters(filters);

3.改造前端

一开始采用了修改form提交的参数,把iframe=false就可以提交X-Requested-With,但是这样的异步请求实在太多,不仅仅在form提交,还有combo,tree等等。所以最后用了网上说的方法,改造$.ajax达到统一处理。

//首先备份下jquery的ajax方法

var _ajax = $.ajax;

// 重写jquery的ajax方法

$.ajax = function(opt) {

// 备份opt中error和success方法

var fn = {

error : function(XMLHttpRequest, textStatus, errorThrown) {

},

success : function(data, textStatus) {

}

}

if (opt.error) {

fn.error = opt.error;

}

if (opt.success) {

fn.success = opt.success;

}

// 扩展增强处理

var _opt = $.extend(opt, {

error : function(XMLHttpRequest, textStatus, errorThrown) {

debugger;

erro = eval("(" + XMLHttpRequest.responseText + ")");

// 错误方法增强处理

fn.error(XMLHttpRequest, textStatus, errorThrown);

},

success : function(data, textStatus) {

if (data != 'sessionOut') {

fn.success(data, textStatus)

return false;

} else {

top.location.href = appPath + "/";

}

}

});

return _ajax(_opt);

};

这个地方要根据个人情况修改一下:

06ef5f140768b0950f55de0502cb8b1b.png

ajax提交session超时跳转页面使用全局的方法来处理

来自:http://www.jb51.net/article/43770.htm 如果是ajax提交,超时时从服务器发出的跳转命令就不会起作用,所以如果是session超时,而且是在ajax请求,就在 ...

Ajax请求Session超时的解决办法:拦截器 &plus; 封装jquery的post方法

目标:前端系统,后端系统等,统一处理Session超时和系统错误的问题. 可能需要处理的问题:Session超时.系统500错误.普通的业务错误.权限不足. 同步请求:            Sess ...

Ajax请求Session超时解决

web前端js代码: $.ajaxSetup({ contentType : "application/x-www-form-urlencoded;charset=utf-8", ...

Shiro中session超时页面跳转的处理

问题描述 shiro在管理session后,在session超时会进行跳转,这里有两种情况需要考虑,一种是ajax方式的请求超时,一种页面跳转请求的超时. 本文从这两个方面分别考虑并处理. ajax请 ...

java Servlet Filter 拦截Ajax请求,统一处理session超时的问题

后台增加filter,注意不要把druid也屏蔽了 import java.io.IOException; import javax.servlet.Filter; import javax.serv ...

spring security:ajax请求的session超时处理

当前端在用ajax请求时,如果没有设置session超时时间并且做跳转到登录界面的处理,那么只是靠后台是很难完成超时的一系列动作的:但是如果后台 没有封装一个ajax请求公共类,那么在ajax请求上下 ...

解决spring-security session超时 Ajax 请求没有重定向的问题

开始时, 代码是这样的: $.ajax({ type : "POST", url : sSource, cache : false, dataType : "json&q ...

dwz ajax session超时跳转登录页(struts2自定义拦截器)

1.定义struts2拦截器(网上例子很多) 代码如下: package rt.intercepter; import java.util.Map; import javax.servlet.http ...

Ajax 提交session实效跳转到完整的登陆页面

在spring security 中 Ajax提交时,session超时,局部加载登陆页面,为解决这个问题,重写ajax提交,返回的是modeview或者没有制定datatype时; 如果检测到加载到 ...

随机推荐

Java &plus; Excel 接口自动化

最近项目比较悠闲,想找点事干,写了个 Excel 接口测试的 "框架" 以前用 python 写过一个,这次用 java, 应该说框架都不算,反正就是写了,能帮我解决问题就行. 当 ...

iOS-OC-基础-NSDictionary常用方法

/*=============================NSDictionary(不可变字典)的使用=========================*/ //————————————————— ...

accordion

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值