shiro实现登录成功后跳转到之前的页面

使用Shiro实现不同用户登录成功后跳转到不同的主页

项目背景:

      在项目中使用sso统一认证中心实现登录模块,各个业务模块均不提供登录入口,如何在用户登录成功后跳转到之前访问路径呢?

由于项目中集成了shiro,里面就有这么个功能

shiro在跳转前有记录跳转前的页面,当前没有认证的用户请求需要认证的链接时,shiro在跳转前会把跳转过来的页面链接保存到session的attribute中,key的值为shiroSavedRequest,我们可以通过WebUtils类拿到。当用户登陆成功后,可以通过

String url=WebUtils.getSavedRequest(req).getRequestUrl();拿到跳转到登录页面前的URL,然后redirect到这个URL。

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

具体实现:

@Controller
public class LoginController {

	@RequestMapping("/login")
	public void login(Model model, HttpServletRequest req,HttpServletResponse resp) throws Exception{
		Subject subject = SecurityUtils.getSubject();
		Session se = subject.getSession(true);
		Employee attribute = (Employee) se.getAttribute("session_employee");
		
		System.out.println("客户端的登录方法------------------::"+attribute);
		if(null == attribute) {
			System.out.println("登录失败");
			req.setAttribute("msg","登录失败" );
		}else {
			SavedRequest savedRequest=WebUtils.getSavedRequest(req);
			System.err.println("savedRequest:"+savedRequest);
			if(null!=savedRequest){ 
//				String requestURI = savedRequest.getRequestURI(); 
//				String requestUrl = savedRequest.getRequestUrl(); 
//				String queryString = savedRequest.getQueryString(); 
				String method = savedRequest.getMethod();  //GET/POST
				String requestUrl = savedRequest.getRequestUrl();
			    System.out.println("注意登录之前的路径是"+requestUrl);
			    resp.sendRedirect(requestUrl);
			    return;
			}else {
			    resp.sendRedirect(PropertiesUtil.SERVER_URL_PREFIX+"/index");
			    return;
			}
		}
	    resp.getWriter().write("false");
	    return;
	}
	
}

希望对看到的小伙伴有所帮助,欢迎留言。。。 

扫描二维码关注公众号,回复: 10604887 查看本文章
发布了171 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/duan196_118/article/details/105179421