java如何在设置登录和cookie后刷新GWTP应用程序?杜松子酒注射剂
我有一个使用GWTP的应用程序,它严重依赖于Gin&;桂丝。我的应用程序身份验证使用CurrentUserDto
来表示当前登录的用户,该用户绑定到Provider
并在需要时注入
我的应用允许用户登录,方法是对照数据存储检查用户的电子邮件和密码,如果存在匹配项,则在用户的cookie中设置一个令牌,表示已登录。到目前为止,基本的东西
CurrentUserDtoProvider
检查客户端上的cookie,如果它存在并且仍然有效,则返回带有正确详细信息的CurrentUserDto
我的LoginPresenter
public class LoginPresenter extends Presenter<LoginPresenter.MyView, LoginPresenter.MyProxy> implements LoginUiHandlers
{
private CurrentUserDto currentUserDto;
public interface MyView extends View, HasUiHandlers<LoginUiHandlers>
{
}
@Title("Login")
@NoGatekeeper
@ProxyStandard
@NameToken(NameTokens.login)
public interface MyProxy extends ProxyPlace<LoginPresenter>
{
}
private DispatchAsync dispatchAsync;
private PlaceManager placeManager;
@Inject
public LoginPresenter(EventBus eventBus, MyView view, MyProxy proxy,
DispatchAsync dispatchAsync, PlaceManager placeManager,
CurrentUserDto currentUserDto)
{
super(eventBus, view, proxy, RevealType.Root);
this.dispatchAsync = dispatchAsync;
this.placeManager = placeManager;
this.currentUserDto = currentUserDto;
getView().setUiHandlers(this);
}
@Override
protected void onReveal()
{
if(currentUserDto.isLoggedIn())
{
System.out.println("User IS logged in - redirecting to main page");
PlaceRequest request = new PlaceRequest.Builder().nameToken(NameTokens.home).build();
placeManager.revealPlace(request, true);
}
else
{
System.out.println("User IS NOT logged in - showing login page");
// do nothing, we are already on the login page
}
}
@Override
public void onLoginClick(final String email, String password)
{
Window.alert("Client logging in as " + email + " with password " + password);
ClientLogin action = new ClientLogin(email, password);
dispatchAsync.execute(action, new AsyncCallbackImpl<ClientLoginResult>()
{
@Override
public void onReturn(ClientLoginResult result)
{
// set the cookie
Cookies.setCookie("usavtoken", result.getToken());
// here I would like to do this:
//placeManager.revealDefaultPlace()
// but instead I have to do this:
// browser refresh workaround, reloads whole app
String newURL = Window.Location.getHref();
Window.Location.assign(newURL);
}
});
}
}
当我的ClientLogin
操作返回验证令牌时,就会出现问题。参见上面的onReturn()
方法。在这里,我只想再次运行onReveal()
中的代码,但是CurrentUserDto
仍然表示用户未登录,因此登录页面留在屏幕上
刷新整个GWT应用程序是我能够设法刷新CurrentUserDto
实体中的详细信息的唯一方法,该实体在用户登录之前被注入登录页面。最好的方法是什么
还有其他方法可以获取CurrentUserDto的新副本吗
是否有另一种方法可以重新加载同一个页面,从而导致Gin再次@Inject
我的构造函数
如果不清楚,请道歉。我对杜松子酒不太有经验
# 1 楼答案
您应该
bind(CurrentUserDto.class).in(Singleton.class)
,并在onReturn
方法中设置currentUserDto.setLoggedIn(true)
# 2 楼答案
把
CurrentUserDto
作为一个单子绑定怎么样?你应该在每个currentUserDtoProvider.get()
上获得一个新的实例你需要将
CurrentUserDtoProvider
注入演示者,因为它们是单例的,并且不在CurrentUserDto
上保留引用,但在需要检查登录用户时总是调用currentUserDtoProvider.get()
顺便说一下,查看提供者代码也会很有帮助
# 3 楼答案
您正在设置cookies并转发到不同的URL。这在GWT或GWTP中不是必需的。不需要经典的回发心态
使用页面上的@LoggedInGatekeeper控制登录/退出状态的访问。应在服务器请求验证时设置cookie,并在注销请求时清除cookie@如果需要,Gin连接的LoggedInGatekeeper实现应该跟踪当前登录用户的用户对象
以下是我在应用程序中使用的步骤
在(应用程序)页面加载上
LoggedInGatekeepr现在会帮你做剩下的事。如果他们请求一个内部页面,并且他们已经注销,它会将他们转发到指定的默认位置,通常是登录屏幕
登录时
注销时
因此,再次强调,甚至不需要触摸客户端的cookies。不要把你的客户和饼干结合在一起。Cookie会增加每个请求的开销,并将客户端和服务器代码耦合起来。服务器知道如何处理会话,所以让它来处理它们