回到顶部
您的当前位置: 编程语言> JAVA> JAVA项目> Shiro
shiro 登录成功后,跳转到登录前的页面
2014-10-31 15:41:28
标签: 转载 shiro 登录成功 跳转 登录前
问题描述

2014年10月31日,ipwin网站有自己的tools页面,是发布在前端的,如清理更新服务端的类别缓存等,需要登录用户角色为admin才可以进行操作,所以直接登入www.song-z.com/tools若未登录或权限不正确的话会跳转到用户登录界面,登录成功后会跳转到主页。现在想更改为从tools页面过来的登录请求,登录成功后应该重新返回tools页面。

需求简单描述即为登录成功后,跳转到登录前的页面。

解决方案

网上找了好久,都没有找到好的解决方案,有说放入cookie的,放入session的,麻烦不实用,而且问题也一堆。最后在csdn找到一个博主的shiro使用系统文章,相当不错,解决了我的问题。

系列文章地址:http://blog.csdn.net/lhacker/article/category/1537401

解决问题文章:http://blog.csdn.net/lhacker/article/details/20450855

现摘录部分如下:

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)在任何地方调用来拿到上一个页面的请求。这个方法的调用,更应该是在用户登录成功后,重定向到页面时使用。

以下代码是我使用springmvc在登录成功后的部分处理

/** 用户登录页面 */
@RequestMapping(value = "/user/login", method = RequestMethod.POST)
public String loginpost(ModelMap model, @ModelAttribute("user") ExtUserBean userBean, HttpServletRequest request) {
    if (userService.loginpost(model, userBean)) {
        SavedRequest savedRequest = WebUtils.getSavedRequest(request);
        // 获取保存的URL
        if (savedRequest == null || savedRequest.getRequestUrl() == null) {
            return "redirect:/index";
        }
        return "redirect:" + savedRequest.getRequestUrl();
    } else {
        return "/user/login";
    }
}

重点在于WebUtils.getSavedRequest(request)的使用!