Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring-设置多个URL的最佳方式-setDefaultTarget_Java_Spring_Spring Boot - Fatal编程技术网

Java Spring-设置多个URL的最佳方式-setDefaultTarget

Java Spring-设置多个URL的最佳方式-setDefaultTarget,java,spring,spring-boot,Java,Spring,Spring Boot,我有一个应用程序,其中在SuccessfulLoginHandler中有setDefaultTargetUrl(“…”) 现在,我必须实现一种情况,用户可以登录一个浏览器,并看到不同的视图。到目前为止,我所做的是: @Service public class SuccessfulLoginHandler extends SimpleUrlAuthenticationSuccessHandler{ UserService userService; @Autowired

我有一个应用程序,其中在
SuccessfulLoginHandler
中有
setDefaultTargetUrl(“…”)

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

@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个用户同时登录的情况下可能会出现问题


实现“重定向”的正确方法是什么?

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

如果您使用的是Spring安全性,那么只需设置成功url或失败url即可

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.getrequestdispatcher而不是response.sendRedirect


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

解决方案对我来说很好。另外-如果两个用户同时登录(唯一的共享资源是userservice,并且应该是线程安全的)应该不会有问题。我认为您是对的,但是我已经将逻辑移到了我的控制器上,只是为了确保这一点,我在那里执行重定向。