问题描述: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标识,所以这里有点不不解。
相关推荐
这个名为"EasyUI登录页面.zip"的压缩包文件包含了使用EasyUI框架构建的一个登录页面的相关资源。EasyUI框架主要基于jQuery,它提供了一系列预先设计的CSS样式和JavaScript组件,使得开发者能够快速构建出美观且功能...
1,shiro+hibernate4+spring3+easyui+fusioncharts部分bootstrap样式全注解零配置简单权限管理web项目 2,简单shiro权限管控 细度到按钮 3,安装方法按config.properties参数配置你的数据库 4,运行db.sql 5,把项目导入...
理解这些文件的结构和内容,对于理解和定制这个EasyUI登录页面至关重要。 总的来说,"基于EasyUI的登录页面"是一个展示如何使用EasyUI快速构建专业且功能齐全的登录界面的实例。它涉及到前端开发中的HTML布局、CSS...
3. **会话管理(Session Management)**:处理用户的会话,如登录、登出、会话超时等。 4. **缓存支持**:提升性能,将用户权限信息存储在内存中,减少数据库交互。 **EasyUI**: 1. **轻量级前端框架**:基于...
新搭建的SSM框架(参考文章比较多大部分代码都是从网上学习搭建的),并且在新学的基础上整合了EasyUI 跟 Shiro安全登陆(目前只实现接口+配置文件《没有提供登陆成功后的处理跟权限认证,感兴趣的自己学习下吧!...
在本资源中,我们关注的是一个使用 EasyUI 实现的登录页面示例。这个登录页面是许多 web 应用程序的基础部分,它允许用户输入凭据并访问受保护的内容。 首先,EasyUI 登录页面通常包含以下几个核心元素: 1. **...
在SpringMVC+MyBatis的Web应用中,Shiro可以提供用户登录验证、角色和权限的管理,以及对敏感资源的保护。例如,它可以拦截无权限的HTTP请求,防止非法访问。Shiro的API设计简洁,易于集成,使得安全控制变得直观而...
SSM+Shiro+EasyUI权限管理系统是一款基于Spring、SpringMVC、MyBatis三大主流框架,结合Apache Shiro安全框架以及EasyUI前端组件库构建的企业级权限管理解决方案。这个系统设计的目标是实现用户角色权限的精细化控制...
在网页开发中,一个吸引用户且功能完善的登录页面是至关重要的。EasyUI是一个基于jQuery的UI框架,它提供了一系列简洁、美观的组件,帮助开发者快速构建用户界面。本篇文章将深入探讨如何利用EasyUI创建一个完美的...
添加了shiro session过期的登录跳转 - jQuery EasyUI开发前端页面,利用jQuery文件上传插件实现拖拽上传的效果并对文件类型、大小、数量进行控制;利用search-box实现查找功能 - [Druid(数据源配置 sql防注入 sql...
EasyUI是一种基于JavaScript和CSS的前端框架,专为构建用户界面而设计,尤其适用于后台管理系统。这个名为"简单的easyui页面"的项目提供了一个简化版的EasyUI页面,非常适合用作前台UI界面,以实现简洁、高效的用户...
easyUI+ssh+shiro技术实现的开源权限管理系统sshpermissions,另外还有SpringMVC Spring3 Hibernate3 MyBatis重构的另外一个版本sshpermissions
SSM + Maven + Shiro + EasyUI 权限管理系统是一个基于Java技术栈的企业级应用,旨在提供高效、安全且用户友好的权限管理解决方案。这个系统采用Spring、Spring MVC和MyBatis(统称为SSM)作为核心框架,利用Maven...
《构建基于Spring MVC+MyBatis+EasyUI+UEditor+Shiro的权限管理框架系统》 在现代企业级Web应用开发中,高效、安全、易维护的框架选择至关重要。本项目采用Spring MVC、MyBatis、EasyUI、UEditor以及Shiro这五大...
此外,Shiro还提供了会话管理功能,能够跨服务器保持用户状态,对于分布式系统的登录状态管理非常实用。 综上所述,本项目通过整合SpringMVC、EasyUI、UEditor和Shiro,构建了一个集成了内容编辑、用户交互和权限...
添加了shiro session过期的登录跳转 - jQuery EasyUI开发前端页面,利用jQuery文件上传插件实现拖拽上传的效果并对文件类型、大小、数量进行控制;利用search-box实现查找功能 - [Druid(数据源配置 sql防注入 sql...
SpringMVC、MyBatis、Shiro 和 EasyUI 是四个在Web开发中广泛使用的开源框架。这个项目结合了它们的功能,构建了一个强大的后端服务和前端界面系统。 **SpringMVC** 是Spring框架的一部分,是一个模型-视图-控制器...
本项目为基于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的事件机制、CSS样式定制以及与后端框架(如Spring Boot、Django等)的集成方法也至关重要。通过灵活运用这些模板,可以显著提高开发效率,降低项目成本,为用户提供一致且高效的交互体验。