`
aaronhugo
  • 浏览: 19002 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

easyui shiro session超时跳转至登录页

    博客分类:
  • web
阅读更多

 问题描述:java web项目中使用shiro做安全框架,前端使用easyui;在session过期时shiro配置了自动跳转至登录页面url,由于使用了easyui在前端做数据的展示、表单的提交等操作,于是出现session过期时使用easyui访问某个操作不会跳转至登录页面。easyui操作代码如下:

 

$("#formxx").form("submit", {
		url : 'addEntityurl',
		type : 'json',
		onSubmit : function(param) {
			var isValid = $(this).form("validate");
			if (!isValid) {
				$.messager.progress("close");
			}
			return isValid;
		},
		success : function(data) {
			var data = eval('(' + data + ')');
			if (data.code > 0) {
				$.messager.alert("提示", "保存成功");
			}
		}
	});
 shiro代码如下:

 

 

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" />
		<property name="loginUrl" value="/login" />
		<!-- 登录成功页面,登录成功后跳转到该页面  -->
        <property name="successUrl" value="/index"/>
</bean>
 

 

具体原因:

      1,shiro配置的loginUrl在session过期时跳转至登录页面url的过程是针对普通数据访问方式的情况下,在异步数据访问方式下需要另外处理。

       2,easyui的onSumbit表单提交方法也不是异步ajax方式,而是重新生成了一个iframe,然后用的submit提交,也就是说其就是一个ajax的架子,实际上在Request Header中根本没有异步方法的参数标识:X-Requested-With:XMLHttpRequest,如图:

 

解决方案:

       1,第一步,针对异步ajax的访问情况,可以在项目中添加一个Filter,判断在过期的情况下当前访问url是否为ajax请求url(通过Request Header中的异步方法参数标识:X-Requested-With:XMLHttpRequest),如果是ajax请求,然后在Response Header中添加一个参数:sessionstatus:timeout;第二步,写一个全局js文件,通过$.ajaxSetup设置AJAX的全局默认配置,即获取Response Header参数:sessionstatus,如果sessionstatus==timeout,则跳至登录页。

       2,不使用easyui的onSumbit表单提交方式,可采用jquery.ajax方式即可。

 

解决方案完整代码如下:

    一、自定义filter的代码:

@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest httpRequest = (HttpServletRequest)request;
		HttpServletResponse httpResponse = (HttpServletResponse)response;
		String requestUrl = httpRequest.getRequestURI().replace(httpRequest.getContextPath(), "");
		
		//不过滤图片验证码路径、短信路径
		if(!requestUrl.contains("/createImg") && !requestUrl.contains("/getPhoneMsg") && !SecurityUtils.getSubject().isAuthenticated()){
			if(null != httpRequest.getHeader("X-Requested-With") && httpRequest.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
				//在ajax响应头部设置一个sessionstatus状态,用于在ajax全局js(common.js)中判断
				httpResponse.setHeader("sessionstatus", "timeout");
				httpResponse.getWriter().print("timeout");//
				return;
			}
		}
		
		chain.doFilter(request, response);
	}

 

   二、全局js代码:

$.ajaxSetup({
	error : function(XMLHttpRequest, textStatus, errorThrown){
		if(XMLHttpRequest.status == 403){
			alert('您没有权限访问此资源');
			return false;
		}
	},
	complete : function(XMLHttpRequest, textStatus){
		var sessionStatus = XMLHttpRequest.getResponseHeader("sessionstatus");
		console.log("sessionStatus= "+sessionStatus);
		if(sessionStatus == 'timeout'){
			var top = getTopWindow();
			top.location.href = '<c:url value="/" />';
		}
	}

});

function getTopWindow(){
	var p = window;
	while (p != p.parent){
		p = p.parent;
	}
	return p;
}

 

    三、异步表单提交代码:

function saveEntity(index) {
        //不使用easyui的onsubmit方法,新ajax方式是:先对表单做验证,再提交
	if(validate("formxx")){
		$.ajax({
			type : 'POST',
			url:'addentityurl',
			data:$('#formxx').serialize(),
			success : function(data) {
				if (data.code > 0) {
					$.messager.alert("提示", "保存成功");
				}
			}
		});
	}
}

function validate(id){
    var validate = $("#"+id).form('validate');
    if(!validate){
    	$.messager.alert("确认", '请正确填写表单!',"",function(){
    		$("#"+id).find(".validatebox-invalid:first").focus();
        });
        return false;
    }
    return true;
}

以上这种方式如果表单中有附件需要上传,则无法实现,因此建议使用jquery.easyui+jquery.form插件,代码如下:

 

function saveEntity(index) {
	//此为jquery.form插件的提交方法
	$("#formxx").ajaxSubmit({
		type: "POST",
		url:"addurl",
		dataType: "json",
		beforeSubmit: function(a,form,options){
			//此为easyui的表单验证
			var isValid = $("#formxx").form("validate");
			if (!isValid) {
				$.messager.progress("close");
			}
			
			return isValid;
		},
	    success: function(data){
			if (data.code > 0) {
				$.messager.alert("提示", "保存成功");
			} else {
				$.messager.alert("提示", "保存失败");
			}
		}
	});
	
}

 

 

 

  总之:感觉被easyui的表单提交方法给坑了,说是异步的,根本不是;比如easyui官网说是另外有一种ajax的表单提交方法:

$('#ff').form({
    url:...,
    onSubmit: function(){
		// do some check
		// return false to prevent submit;
    },
    success:function(data){
		alert(data)
    }
});
// submit the form
$('#ff').submit();

 但是我通过chrome查看Request Header,里面根本没有X-Requested-With:XMLHttpRequest标识,所以这里有点不不解。

 

 

  • 大小: 17.7 KB
分享到:
评论

相关推荐

    EasyUI登录页面.zip

    这个名为"EasyUI登录页面.zip"的压缩包文件包含了使用EasyUI框架构建的一个登录页面的相关资源。EasyUI框架主要基于jQuery,它提供了一系列预先设计的CSS样式和JavaScript组件,使得开发者能够快速构建出美观且功能...

    shiro+spring+hibernate+easyUI

    1,shiro+hibernate4+spring3+easyui+fusioncharts部分bootstrap样式全注解零配置简单权限管理web项目 2,简单shiro权限管控 细度到按钮 3,安装方法按config.properties参数配置你的数据库 4,运行db.sql 5,把项目导入...

    基于EasyUI的登录页面

    理解这些文件的结构和内容,对于理解和定制这个EasyUI登录页面至关重要。 总的来说,"基于EasyUI的登录页面"是一个展示如何使用EasyUI快速构建专业且功能齐全的登录界面的实例。它涉及到前端开发中的HTML布局、CSS...

    SSH+shiro+easyUI实战项目案例

    3. **会话管理(Session Management)**:处理用户的会话,如登录、登出、会话超时等。 4. **缓存支持**:提升性能,将用户权限信息存储在内存中,减少数据库交互。 **EasyUI**: 1. **轻量级前端框架**:基于...

    SpringMVC+MyBatis+EasyUI+Shiro资源整合框架

    新搭建的SSM框架(参考文章比较多大部分代码都是从网上学习搭建的),并且在新学的基础上整合了EasyUI 跟 Shiro安全登陆(目前只实现接口+配置文件《没有提供登陆成功后的处理跟权限认证,感兴趣的自己学习下吧!...

    easyui的登录页面

    在本资源中,我们关注的是一个使用 EasyUI 实现的登录页面示例。这个登录页面是许多 web 应用程序的基础部分,它允许用户输入凭据并访问受保护的内容。 首先,EasyUI 登录页面通常包含以下几个核心元素: 1. **...

    springmvc+mybatis+shiro+easyui

    在SpringMVC+MyBatis的Web应用中,Shiro可以提供用户登录验证、角色和权限的管理,以及对敏感资源的保护。例如,它可以拦截无权限的HTTP请求,防止非法访问。Shiro的API设计简洁,易于集成,使得安全控制变得直观而...

    ssm+shiro+easyui权限管理系统

    SSM+Shiro+EasyUI权限管理系统是一款基于Spring、SpringMVC、MyBatis三大主流框架,结合Apache Shiro安全框架以及EasyUI前端组件库构建的企业级权限管理解决方案。这个系统设计的目标是实现用户角色权限的精细化控制...

    完美的登录页面easyUI

    在网页开发中,一个吸引用户且功能完善的登录页面是至关重要的。EasyUI是一个基于jQuery的UI框架,它提供了一系列简洁、美观的组件,帮助开发者快速构建用户界面。本篇文章将深入探讨如何利用EasyUI创建一个完美的...

    erp完整源码-ssm+easyUI+mysql+maven+shiro

    添加了shiro session过期的登录跳转 - jQuery EasyUI开发前端页面,利用jQuery文件上传插件实现拖拽上传的效果并对文件类型、大小、数量进行控制;利用search-box实现查找功能 - [Druid(数据源配置 sql防注入 sql...

    简单的easyui页面

    EasyUI是一种基于JavaScript和CSS的前端框架,专为构建用户界面而设计,尤其适用于后台管理系统。这个名为"简单的easyui页面"的项目提供了一个简化版的EasyUI页面,非常适合用作前台UI界面,以实现简洁、高效的用户...

    easyUI+ssh+shiro技术实现的开源权限管理系统

    easyUI+ssh+shiro技术实现的开源权限管理系统sshpermissions,另外还有SpringMVC Spring3 Hibernate3 MyBatis重构的另外一个版本sshpermissions

    ssm+maven+shiro+easyui权限管理系统

    SSM + Maven + Shiro + EasyUI 权限管理系统是一个基于Java技术栈的企业级应用,旨在提供高效、安全且用户友好的权限管理解决方案。这个系统采用Spring、Spring MVC和MyBatis(统称为SSM)作为核心框架,利用Maven...

    Spring MVC+mybatis+easyui+ueditor+shiro权限框架管理系统

    《构建基于Spring MVC+MyBatis+EasyUI+UEditor+Shiro的权限管理框架系统》 在现代企业级Web应用开发中,高效、安全、易维护的框架选择至关重要。本项目采用Spring MVC、MyBatis、EasyUI、UEditor以及Shiro这五大...

    SpringMVC +easyui+百度富文本编辑器+easyui三级弹窗+shiro权限框架

    此外,Shiro还提供了会话管理功能,能够跨服务器保持用户状态,对于分布式系统的登录状态管理非常实用。 综上所述,本项目通过整合SpringMVC、EasyUI、UEditor和Shiro,构建了一个集成了内容编辑、用户交互和权限...

    erp源码-ssm+easyUI+mysql+maven+shiro

    添加了shiro session过期的登录跳转 - jQuery EasyUI开发前端页面,利用jQuery文件上传插件实现拖拽上传的效果并对文件类型、大小、数量进行控制;利用search-box实现查找功能 - [Druid(数据源配置 sql防注入 sql...

    springMVC+mybatis+shiro+easyui

    SpringMVC、MyBatis、Shiro 和 EasyUI 是四个在Web开发中广泛使用的开源框架。这个项目结合了它们的功能,构建了一个强大的后端服务和前端界面系统。 **SpringMVC** 是Spring框架的一部分,是一个模型-视图-控制器...

    基于easyui和shiro框架的admin管理系统设计源码

    本项目为基于easyui和shiro框架构建的admin管理系统设计源码,包含2846个文件,涵盖743个JavaScript文件、586个PNG图片、420个文本文件、402个CSS文件、164个Java文件、91个GIF文件、85个HTML/HTM文件、48个JSP文件...

    采用SpringBoot+Shiro+MyBatis+EasyUI实现的一个进销存管理系统,适合web全栈学习,毕业设计,课设

    采用SpringBoot+Shiro+MyBatis+EasyUI实现的一个进销存管理系统,适合web全栈学习,毕业设计,课设 项目经过严格测试,确保可以运行! # 企业级进销存管理系统 进销存管理系统,采用SpringBoot+Shiro+MyBatis+...

    五套easyUI模板

    同时,理解EasyUI的事件机制、CSS样式定制以及与后端框架(如Spring Boot、Django等)的集成方法也至关重要。通过灵活运用这些模板,可以显著提高开发效率,降低项目成本,为用户提供一致且高效的交互体验。

Global site tag (gtag.js) - Google Analytics