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)的使用!