问题描述: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标识,所以这里有点不不解。
相关推荐
1,shiro+hibernate4+spring3+easyui+fusioncharts部分bootstrap样式全注解零配置简单权限管理web项目 2,简单shiro权限管控 细度到按钮 3,安装方法按config.properties参数配置你的数据库 4,运行db.sql 5,把项目导入...
基于EasyUI前端框架,写了一个登录页面,用到了EasyUI的icon图标,结合html和css样式,整体效果还行,能达到需要。
新搭建的SSM框架(参考文章比较多大部分代码都是从网上学习搭建的),并且在新学的基础上整合了EasyUI 跟 Shiro安全登陆(目前只实现接口+配置文件《没有提供登陆成功后的处理跟权限认证,感兴趣的自己学习下吧!...
包含了基础的增删改查,easyUI应用和shiro的基本实现,含mysql数据库。解压导入数据库,修改jdbc.properties参数直接运行.
该登录页面是基于EasyUI前台框架,提供字段校验,覆盖正常的登录页面的内容项,可以再次基础上进行扩展。
springmvc+mybatis+shiro+easyui
添加了shiro session过期的登录跳转 - jQuery EasyUI开发前端页面,利用jQuery文件上传插件实现拖拽上传的效果并对文件类型、大小、数量进行控制;利用search-box实现查找功能 - [Druid(数据源配置 sql防注入 sql...
easyUI+ssh+shiro技术实现的开源权限管理系统sshpermissions,另外还有SpringMVC Spring3 Hibernate3 MyBatis重构的另外一个版本sshpermissions
springMVC3.2.5+mybatis3.2.5+shiro+easyui1.4.2+ehcache
添加了shiro session过期的登录跳转 - jQuery EasyUI开发前端页面,利用jQuery文件上传插件实现拖拽上传的效果并对文件类型、大小、数量进行控制;利用search-box实现查找功能 - [Druid(数据源配置 sql防注入 sql...
完美的登录页面easyUI 完美的登录页面easyUI
本页面是简化后的easyui页面 十分适合做前台ui界面
ssm+shiro+easyui权限管理系统
一个很不错的easyui后台的登录页面,有需要的人可以来借鉴一下,有问题也可以相互讨论
本系统是由ssm+maven+shiro+easyui开发的权限管理系统,界面美观,功能齐全,含数据库文件
采用easyui+shiro+springmvc+spring+mybatis+mysql easyui作视图层 shiro作权限控制 springmvc作控制层 spring作容器与事务管理 mybatis作数据访问层 mysql作数据存储
SpringMVC+mybatis+easyui+百度富文本编辑器+easyui三级弹窗+shiro权限框架
ssm+shiro+layui+easyui实现的后台权限管理系统 项目描述 基于SSM+Shiro+Layui+Easyui实现的后台权限管理系统 丰富的代码注释会很方便于你的理解,清晰的代码层次会让你更清楚的明白企业级架构!希望能在有限的...
easyUi弹出window窗口传值与调用父页面的方法,子页面给父页面赋值,详情链接:
《基于Spring Boot+Shiro+Easyui开发的电影网站》完整代码,可运行。 本系统采用企业级开发标准,使用SpringBoot架构,数据访问层采用Spring Data Jpa,业务控制层采用SpringMvc,安全框架采用Shiro,实现了完整...