shiro 登录成功后,跳转到登录前的页面 .

但当我们用配置/xxx.html=authc这种方式,限制用户访问/xxx.html连接时必须是认证过的用户,否则shiro的filter将会重定向到登录页面,上面的方法应当好处理了。不过shiro在跳转前有记录跳转前的页面。前没有认证的用户请求需要认证的链接时,shiro在跳转前会把跳转过来的页面链接保存到session的attribute中,key的值叫shiroSavedRequest,我们可以能过WebUtils类拿到。

 

当用户登录成功后,可能通过String url = WebUtils.getSavedRequest(request).getRequestUrl();,拿到跳转到登录页面前的url,然后redirect到这个url。其实我们可以看看这个方法的源码:

public static SavedRequest getSavedRequest(ServletRequest request) {  
    SavedRequest savedRequest = null;  
    Subject subject = SecurityUtils.getSubject();  
    Session session = subject.getSession(false);  
    if (session != null) {  
        savedRequest = (SavedRequest) session.getAttribute(SAVED_REQUEST_KEY);  
    }  
    return savedRequest;  
}  

 从session中拿到SaveRequest。不过值得注意的是,这个SaveRequest是在用户通过上面方式跳转登录时shiro才会保存,并且不会改变,除非下一次跳转再次发生。并不是每一个请求,shiro都会把上一个请求保存到session中。所以,不能通过WebUtils.getSavedRequest(request)在任何地方调用来拿到上一个页面的请求。这个方法的调用,更应该是在用户登录成功后,重定向到页面时使用。

 

 重写FormAuthenticationFilter类 我是这么做的。

protected boolean onLoginSuccess(AuthenticationToken token,
Subject subject, ServletRequest request, ServletResponse response)
throws Exception {
WebUtils.issueRedirect(request, response, getSuccessUrl());
return false;
}
 
 

登录超时提醒

这里不是使用监听 思路都一样,简单说下: 
如果你使用的是FormAuthenticationFilter,那么继承FormAuthenticationFilter覆盖onAccessDenied方法,方法实现: 

Java代码   收藏代码
  1. if (isLoginRequest(request, response)) {  
  2.             if (isLoginSubmission(request, response)) {  
  3.                 return executeLogin(request, response);  
  4.             } else {  
  5.                 return true;  
  6.             }  
  7.         } else {  
  8.             if(AjaxUtils.isAjaxRequest(WebUtils.toHttp(request))){  
  9.                 HttpServletResponse res = WebUtils.toHttp(response);  
  10.                 res.sendError(HttpServletResponse.SC_UNAUTHORIZED);  
  11.                   
  12.             }else{  
  13.                 redirectToLogin(request, response);  
  14.             }  
  15. /               saveRequestAndRedirectToLogin(request, response);  
  16.             return false;  
  17.         }  

然后前台设置ajax全局状态码处理 捕获401,给出提示或做进一步处理 
资源权限和角色权限同样可以使用这种方式!我想我说的够清楚了! 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值