有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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我的构造函数

如果不清楚,请道歉。我对杜松子酒不太有经验


共 (3) 个答案

  1. # 1 楼答案

    您应该bind(CurrentUserDto.class).in(Singleton.class),并在onReturn方法中设置currentUserDto.setLoggedIn(true)

  2. # 2 楼答案

    CurrentUserDto作为一个单子绑定怎么样?你应该在每个currentUserDtoProvider.get()上获得一个新的实例

    你需要将CurrentUserDtoProvider注入演示者,因为它们是单例的,并且不在CurrentUserDto上保留引用,但在需要检查登录用户时总是调用currentUserDtoProvider.get()

    顺便说一下,查看提供者代码也会很有帮助

  3. # 3 楼答案

    您正在设置cookies并转发到不同的URL。这在GWT或GWTP中不是必需的。不需要经典的回发心态

    使用页面上的@LoggedInGatekeeper控制登录/退出状态的访问。应在服务器请求验证时设置cookie,并在注销请求时清除cookie@如果需要,Gin连接的LoggedInGatekeeper实现应该跟踪当前登录用户的用户对象

    以下是我在应用程序中使用的步骤

    在(应用程序)页面加载上

    1. 向服务器发出请求,我是否已登录
    2. 如果已经登录,获取当前用户对象(可以在1中返回)
    3. 在LoggedInGatekeeper中设置用户对象,并将登录状态设置为true

    LoggedInGatekeepr现在会帮你做剩下的事。如果他们请求一个内部页面,并且他们已经注销,它会将他们转发到指定的默认位置,通常是登录屏幕

    登录时

    1. 向服务器发送凭据
    2. 如果有效,在服务器上创建有效的用户会话并返回用户对象(与上面的2相同)
    3. 在LoggedInGatekeeper中存储用户对象和登录状态
    4. 转发到您希望用户访问的下一个地方

    注销时

    1. 向服务器发送请求
    2. 服务器使会话无效并清除Cookie
    3. 清除LoggedInGatekeeper登录状态和用户对象
    4. 将用户转发到已注销的位置

    因此,再次强调,甚至不需要触摸客户端的cookies。不要把你的客户和饼干结合在一起。Cookie会增加每个请求的开销,并将客户端和服务器代码耦合起来。服务器知道如何处理会话,所以让它来处理它们