我有一个应用程序,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个用户同时登录时可能会出现问题。
实施"重定向"。
的正确方法是什么答案 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是一个只读服务,不应该引发竞争条件问题。