You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动