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,并且应该是线程安全的)应该不会有问题。我认为您是对的,但是我已经将逻辑移到了我的控制器上,只是为了确保这一点,我在那里执行重定向。