spring security登录成功后跳转回登录前的页面

确保实现“spring security登录成功后跳转回登录前的页面”的功能,需要进行以下步骤:

  1. 配置页面跳转
    在spring的配置文件中,需要将页面跳转的路径配置到spring security中。可以使用默认的登录页,也可以自定义一个登录页。

使用默认的登录页:

<http>
    <form-login login-page="/login" default-target-url="/home" authentication-failure-url="/login-error"/>
</http>

这里的login-page用于指定登录页,default-target-url用于指定登录成功后跳转的页面,authentication-failure-url是指定认证失败后跳转的页面。

自定义登录页:

<http>
    <form-login login-processing-url="/login.do"
            username-parameter="username" password-parameter="password"
            authentication-failure-url="/login?error"
            authentication-success-handler-ref="myAuthenticationSuccessHandler"
            login-page="/login.jsp"/>
</http>

这里的login-processing-url用于指定处理登录请求的URL,username-parameterpassword-parameter用于指定用户名和密码参数名称,authentication-failure-urllogin-page与默认登录页一样。需要注意的是,myAuthenticationSuccessHandler是一个自定义的登录成功后处理器,会在后面进行详细讲解。

  1. 配置登录后的处理器
    在上述的自定义登录页面配置文件中,需要在form-login标签中添加一个authentication-success-handler-ref属性,用于指定一个登录成功后的处理器。
<bean id="myAuthenticationSuccessHandler" class="com.example.MyAuthenticationSuccessHandler"/>

这里的myAuthenticationSuccessHandler就是一个自定义的登录成功后的处理器。下面是一个示例:

public class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {

    private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
            Authentication authentication) throws IOException, ServletException {

        HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(request) {

            @Override
            public String getServletPath() {
                String servletPath = super.getServletPath();
                HttpSession session = super.getSession();
                // 从session中获取之前被拦截的请求路径,并将其放入请求参数中。
                if (servletPath == null || "/".equals(servletPath)) {
                    return String.valueOf(session.getAttribute("requestUri"));
                }
                return servletPath;
            }
        };

        SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response);
        if (savedRequest != null && savedRequest.getRedirectUrl() != null) {
            // 将被拦截的请求路径放入session中,以便在登录成功后获取。
            HttpSession session = request.getSession();
            session.setAttribute("requestUri", savedRequest.getRedirectUrl());
        }

        String targetUrl = determineTargetUrl(requestWrapper, response);
        redirectStrategy.sendRedirect(requestWrapper, response, targetUrl);
    }

    protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) {
        // 获取登录成功后要跳转的页面
        // 如果之前有被拦截的请求,则跳转回被拦截的请求路径。
        HttpSession session = request.getSession(false);
        String targetUrl = null;
        if (session != null) {
            String redirectUrl = (String) session.getAttribute("requestUri");
            if (redirectUrl != null) {
                targetUrl = redirectUrl;
                session.removeAttribute("requestUri");
            }
        } 
        if (targetUrl == null) {
            // 如果没有被拦截的请求,则跳转到指定的页面。
            targetUrl = "/home";
        }
        return targetUrl;
    }

}

在这个处理器中,需要重写onAuthenticationSuccess方法。在该方法中,首先需要通过request.getSession()获取之前记住的请求路径。

如果该路径不为空,则需要将请求路径设置到HttpServletRequestWrapper对象中。通过继承HttpServletRequestWrapper,可以重新定义请求路径,使得请求路径变成之前被拦截的路径。

如果没有被拦截的请求,则通过determineTargetUrl方法获取登录成功后要跳转的页面。

到这里,完整的攻略已经介绍完毕。下面是两个使用示例:

  1. 使用默认登录页,使用XML配置页面跳转
<http>
    <form-login login-page="/login" default-target-url="/home" authentication-failure-url="/login-error"/>
</http>

在这个示例中,我们使用了默认的登录页,只需要添加一个default-target-url属性就可以了。

  1. 使用自定义登录页,使用Java配置页面跳转
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyAuthenticationSuccessHandler myAuthenticationSuccessHandler;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .loginProcessingUrl("/login.do")
                .usernameParameter("username")
                .passwordParameter("password")
                .successHandler(myAuthenticationSuccessHandler)
                .failureUrl("/login?error")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password("{noop}password").roles("USER");
    }
}

在这个示例中,我们自定义了登录页,使用Java配置了页面跳转。其中myAuthenticationSuccessHandler就是我们自定义的处理器。在formLogin标签中添加了successHandler属性,将我们自定义的处理器注入到formLogin中。

以上两个示例只是提供了大概的思路,具体代码实现还需要根据自己的业务需求进行修改。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring security登录成功后跳转回登录前的页面 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 基于Properties实现配置数据库驱动

    下面是“基于Properties实现配置数据库驱动”的完整攻略。 什么是Properties文件 Properties文件是Java中一种用于存储配置信息的文件格式。它是一种简单的文本文件,每一行是以“键-值对”的形式来存储数据的,其中“键”和“值”都是字符串类型的。Properties文件通常用于Java项目中的配置和国际化。 配置数据库驱动 通常,我们需…

    Java 2023年6月16日
    00
  • Java的Struts框架报错“StrutsException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“StrutsException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会出现此错误。在这种情况下,需要检查文件以解决此问题。 代码错误:如果代码中存在错误,则可能会出现此错误。在这种情况下,需要检查代码以解决此问题。 以下是两个实例: 例 1 如果配置文件中没有正确配…

    Java 2023年5月5日
    00
  • SpringCloud Open feign 使用okhttp 优化详解

    下面我将为你详细讲解“SpringCloud Open feign 使用okhttp 优化详解”的完整攻略。 什么是Spring Cloud Open Feign Spring Cloud Open Feign 是一个让编写 Java HTTP 客户端变得更加容易的工具。简单来说,Feign 可以帮助我们减少样板式的代码,例如参数验证、请求构建、错误处理等等…

    Java 2023年6月2日
    00
  • jsp实现登录验证的过滤器

    下面是关于“jsp实现登录验证的过滤器”的完整攻略: 一、过滤器的介绍 过滤器是Servlet 2.3版本之后新增的一种组件。其作用是在客户端发送请求到Servlet之前或者在Servlet响应客户端请求之后,对请求和响应进行拦截和处理。过滤器可以拦截多个Servlet,因此可以将与特定任务相关的处理放在一个过滤器中进行处理,提高程序的可维护性和可重用性。 …

    Java 2023年6月15日
    00
  • 2019年Android高级面试题与相关知识点总结

    2019年Android高级面试题与相关知识点总结 作为一名Android开发者,想要在面试中脱颖而出,需要具备一定的技能和经验。本文将总结2019年Android高级面试题和相关知识点,帮助你在面试中更加得心应手。 Java基础 面向对象的三大特征是什么? 答:封装、继承、多态。 String、StringBuilder、StringBuffer 有什么区…

    Java 2023年5月26日
    00
  • Android应用开发之将SQLite和APK一起打包的方法

    Android应用开发中采用SQLite存储数据是非常常见的做法,而将SQLite数据库文件和APK文件打包在一起发布则可以方便用户下载和安装。下面将详细介绍将SQLite和APK打包在一起的方法。 准备工作 首先,需要将SQLite数据库文件放在app/src/main/assets文件夹下。如果该文件夹不存在,则手动创建该文件夹。 在代码中访问SQLit…

    Java 2023年5月20日
    00
  • Java操作mongodb增删改查的基本操作实战指南

    Java操作mongodb增删改查的基本操作实战指南 简介 在Java应用中,使用MongoDB进行数据存储已成为一种常见的方案,MongoDB是一个非关系型的数据库,以文档的形式存储数据。本篇文档将通过示例介绍Java操作MongoDB常见的增、删、改、查基本操作。 准备工作 在开始之前,需要先安装MongoDB和Java驱动包。MongoDB的安装教程可…

    Java 2023年6月1日
    00
  • jsp实现登录界面

    那么我们首先了解一下jsp实现登录界面的步骤: 创建一个jsp文件用于展示登录界面,包含用户名和密码输入框、登录按钮等组件。 编写一个servlet用于处理用户提交的登录表单数据,校验用户名和密码是否正确。 如果验证通过,将用户信息保存到会话中,然后跳转到登录成功的页面。 如果验证不通过,返回登录界面,并在界面上展示错误提示信息。 下面是一个示例: 创建一个…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部