登录后重定向到自定义网址

时间:2019-12-16 10:51:09

标签: java angular spring spring-mvc spring-security

我在我的应用程序中使用Spring security + Angular。 并在spring-security.xml下面的表单中指定登录

<security:form-login
               always-use-default-target="true"
               login-page="/login"
               default-target-url="/login"
               login-processing-url="/perform_login"
               authentication-failure-url="/login?error"
               username-parameter="username"
               password-parameter="password"
               />

这会将用户重定向到登录页面,该页面按预期工作正常。

但是现在我想增强它,以记住登录前和成功登录后重定向到该页面的URL

预期的情况

  1. 应用程序已注销
  2. 用户键入网址:http://WEB-SITE/ReportModule/#/report
  3. 用户被重定向到登录页面
  4. 用户成功登录后,它将重定向到http://WEB-SITE/ReportModule/#/report

尝试过的解决方案

试图将URL保存到会话中,并在登录后重定向用户。 此解决方案中的问题是,输入到浏览器应用程序的http://WEB-SITE/ReportModule/#/report被重定向到http://WEB-SITE/login/#/report时,URL的一部分(ReportModule /#/ report)丢失了。

有没有办法实现这一目标

答案:

使用AuthenticationSuccessHandler和useReferer找到了解决方案

<bean id="AuthenticationSuccessHandler"
          class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
        <property name="useReferer" value="true"/>
    </bean>
<security:form-login
                always-use-default-target="true"
                login-page="/login"
                default-target-url="/login"
                login-processing-url="/perform_login"
                authentication-failure-url="/login?error"
                username-parameter="username"
                password-parameter="password"
                authentication-success-handler-ref="AuthenticationSuccessHandler"
                />

1 个答案:

答案 0 :(得分:0)

您好,我不确定您用于保护url的前端解决方案。我认为您在使用防护措施来重定向用户。 从“ @ angular / core”导入{可注射}; 从'@ angular / router'导入{Router,CanActivate,ActivatedRouteSnapshot,RouterStateSnapshot};

@Injectable() 导出类AuthGuard实现CanActivate {

constructor(private router: Router) { }

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    if (localStorage.getItem('currentUser')) {
        // logged in so return true
        return true;
    }

    // not logged in so redirect to login page with the return url and return false
    this.router.navigate(['login'], { queryParams: { returnUrl: state.url }});
    return false;
}

}

this.router.navigate(['login'],{queryParams:{returnUrl:state.url}});这就是您要寻找的。