Spring中利用onAuthenticationSuccess实现登录后重定向至原请求页面
解决方案:登录成功后跳转到原始请求页面
当然可行!Spring Security早就为这种场景做好了支持,你只需要把它自动保存的原始请求地址取出来就行,不用自己费劲去记录~下面给你两种实用的实现方式:
方式一:手动获取并跳转
你可以直接从请求的Session中取出Spring Security保存的原始请求信息,修改你的处理器代码如下:
import org.springframework.security.web.savedrequest.SavedRequest; // 其他必要的导入... @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { // 先执行你的自定义业务逻辑 Util.setUserdata(userBean, authentication, request); // 获取登录前用户试图访问的原始地址 SavedRequest savedRequest = (SavedRequest) request.getSession().getAttribute("SPRING_SECURITY_SAVED_REQUEST"); String redirectUrl = "/"; // 设置默认跳转地址(比如首页) if (savedRequest != null) { redirectUrl = savedRequest.getRedirectUrl(); // 用完后记得从Session移除,避免后续登录重复跳转该地址 request.getSession().removeAttribute("SPRING_SECURITY_SAVED_REQUEST"); } // 执行重定向 response.sendRedirect(redirectUrl); }
方式二:继承现成的处理器类(更简洁)
Spring Security提供了SavedRequestAwareAuthenticationSuccessHandler,它已经封装了“跳转到原始请求地址”的完整逻辑。你只需要继承这个类,在里面插入你的自定义业务代码即可:
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; // 其他必要的导入... public class CustomAuthSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { private UserBean userBean; // 通过构造方法注入你的userBean public CustomAuthSuccessHandler(UserBean userBean) { this.userBean = userBean; } @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { // 先执行你的自定义业务逻辑 Util.setUserdata(userBean, authentication, request); // 调用父类方法,自动处理跳转到原始请求地址(如果没有则跳默认页) super.onAuthenticationSuccess(request, response, authentication); } }
这种方式更推荐,因为它复用了Spring Security的原生实现,不用自己处理Session属性的读写,减少重复代码,也更符合框架的设计思路。
补充说明
Spring Security在用户被拦截并重定向到登录页时,会自动把原始请求的URL存储在Session的SPRING_SECURITY_SAVED_REQUEST属性中,上面两种方式都是基于这个机制实现的。如果用户是直接访问登录页的(没有被拦截跳转),则会使用你设置的默认跳转地址。
内容的提问来源于stack exchange,提问作者Gavrilo Adamovic




