使用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 查看本文章