Spring - 设置倍数网址的最佳方法 - setDefaultTarget

时间:2017-03-03 12:47:26

标签: java spring spring-boot

我有一个应用程序,setDefaultTargetUrl('...')中有SuccessfulLoginHandler

现在我必须实现一个用户可以登录查看不同视图的情况。到目前为止,我所做的是:

@Service
public class SuccessfulLoginHandler extends SimpleUrlAuthenticationSuccessHandler{

    UserService userService;

    @Autowired
    public SuccessfulLoginHandler(UserService userService){
        this.userService = userService;
        setDefaultTargetUrl("/app");
    }

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication authentication) throws IOException, ServletException {
        User user = AccessService.getUser(authentication);
        if(this.userService.isFirstLogin(user)){
            setDefaultTargetUrl("/firstlogin");
        }else{
            setDefaultTargetUrl("/app");
        }
        super.onAuthenticationSuccess(request, response, authentication);
    }

}

我不确定这是不是最好的方法。它工作正常但在2个用户同时登录时可能会出现问题。

实施"重定向"。

的正确方法是什么

1 个答案:

答案 0 :(得分:-1)

成功登录后,您可以尝试将用户重定向到默认网址。

如果您使用的是Spring Security,则只需设置成功网址或失败网址即可。

http
    .authorizeRequests()
        .anyRequest().authenticated()
        .and()
    .formLogin()
        .loginPage("/login")
        .failureUrl("/login?login_error=t")
        .defaultSuccessUrl("/app")
        .permitAll()

如果您想在成功登录后设置一些自定义逻辑,您可以执行以下操作

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

    String queryString = request.getQueryString();
    if(queryString == null) {
        response.setStatus(200);
    } else if(!queryString.contains("redirectUrl=")) {
        response.sendRedirect("/");
    } else {
        queryString = URLDecoder.decode(queryString.replace("url=", ""), "utf-8");            
        response.sendRedirect(queryString);            
    }
}

P.s。对于重定向,如果您更喜欢服务器端重定向,则可以使用request.getRequestDispathcer而不是response.sendRedirect。

编辑:并发登录不应该导致任何问题,因为userService是一个只读服务,不应该引发竞争条件问题。