在dwz界面操作会话超时时,有两种处理方法。一种是跳到登录页面,另一种是弹出登录对话框。
如果使用了shiro框架,由于会记录最后访问记录,重新登录后会跳转到最后访问页面。
对于第一种处理方法,在登录界面登录后会重定向到最后访问页面,这样就会脱离了dwz的navtab控制。
所以只能采取第二种方法,即弹出登录对话框。 重新登录后同样面临重定向问题。因为这时对话框要求返回dwz特有的响应数据。没办法,只好自己hack一下了。
ok,随便扫一眼shiro的源码,找到了一个切入点。不难发现,shiro处理登录的是FormAuthenticationFilter这个filter,就从这个地方动手术。要看懂下面手术内容,需要明白dwz界面内发出的请求都是一个ajax请求。
public class DWZLoginFilter extends FormAuthenticationFilter { @Override protected void issueSuccessRedirect(ServletRequest request, ServletResponse response) throws Exception { if(isAjaxRequest(request)){ PrintWriter writer = getWriterFromResponse(response); DWZJsonReply reply = new DWZJsonReply(); reply.setMessage("Login successful!"); reply.setForwardUrl(getForwardUrl(request)); writer.print(JsonService.getJsonMapper().toJson(reply)); } else WebUtils.redirectToSavedRequest(request, response, getSuccessUrl()); } public String getForwardUrl(ServletRequest request){ SavedRequest savedRequest = WebUtils.getAndClearSavedRequest(request); if(savedRequest != null && savedRequest.getMethod().equalsIgnoreCase(AccessControlFilter.GET_METHOD)){ return savedRequest.getRequestUrl(); } return getSuccessUrl(); } @Override protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) { setFailureAttribute(request, e); if(isAjaxRequest(request)){ PrintWriter writer = getWriterFromResponse(response); DWZJsonReply reply = new DWZJsonReply(); reply.setStatusCode(DWZJsonReply.ERROR); reply.setMessage("Login fail.Invalid username or password."); writer.print(JsonService.getJsonMapper().toJson(reply)); return false; } // login failed, let request continue back to the login page: return true; } public PrintWriter getWriterFromResponse(ServletResponse res){ HttpServletResponse response = (HttpServletResponse)res; response.setHeader("Content-type", "text/html;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); try { return response.getWriter(); } catch (IOException e) { e.printStackTrace(); throw Exceptions.unchecked(e); } } public boolean isAjaxRequest(ServletRequest request) { return ((HttpServletRequest) request).getHeader("x-requested-with") != null; } }
大功告成。
相关推荐
基于shiro+dwz权限系统代码实现
整合spring mvc+mybatis+Shiro+dwz实现的通用后台系统。完成了权限管理,角色管理,员工管理,部门管理等常用功能。无论私单公单都可快速上手。数据库使用mysql,根据实体类建库即可。
spring mvc、 mybatis、 Shiro、 dwz实现的通用后台系统
spring mvc+mybatis+Shiro+dwz实现的通用后台系统
struts2和shiro整合的解决方案很少,别的资源你别下载了,我试过了都是不好用的,这个是绝对好用的。带登陆和退出,还有角色的配置和使用。
Shiro + dwz + spring mvc + mybatis 实现的通用后台系统;有任何不懂的问题都可以联系我
通用后台系统,基于spring mvc,mybatis,Shiro,dwz 实现的
整合spring mvc+mybatis+Shiro+dwz实现的通用后台系统。完成了权限管理,角色管理,员工管理,部门管理等常用功能。无论私单公单都可快速上手。数据库使用mysql,根据实体类建库即可。
shiro整合ssm的全部jar包,包含ehcache-core,quartz-1.6.1以及shiro的1.4版本jar包,共11个
spring mvc、mybatis、Shiro、dwz实现的通用后台系统
SpringBoot整合Shiro后实现免密登录 1,说明一下步骤,需要在原来基础新增三个文件 2,新增CustomToken,重写UsernamePasswordToken免密登录调用方法和密码登录调用方法都在里面。 3,新增...
一个简单仓库管理系统,使用开源技术JFinal+Shiro+DWZ,数据库采用MySQL,本项目处于开发期可作为学习JFinal/DWZ和Shiro的参考。 Apache2.0开源协议,友好商业开源
【SSM】spring mvc+mybatis+Shiro+dwz实现的通用后台系统.zip
本文使用Shiro整合Mybatis,利用Druid数据库连接池,实现用户认证和授权。 ———————————————— 版权声明:本文为CSDN博主「全村第二帅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处...
shiro整合cas的实例,shiro整合cas的实例,shiro整合cas的实例。
SpringBoot与Shiro整合-权限管理实战-课堂笔记-超详细-SpringBoot与Shiro整合-权限管理实战-课堂笔记-超详细
shiro整合spring项目实例,shiro整合spring项目实例,shiro整合spring项目实例
spring整合shirospring-data-redis和spring-session-data-redis通过shiro实现单点登录
基于Maven的ssm与shiro整合项目,内有注释,方便大家理解。并且包含数据库。保证一定能运行,默认密码是123
shiro整合cas3.5的正确方式,提供一个思路