0

我们有一个 gwt 应用程序,它使用 jcifs 从我们的 NT 域中提取用户名。这是我们的 web.xml 的剪辑:

<filter>
    <filter-name>NtlmHttpFilter</filter-name>
    <filter-class>com.xxx.gwt.server.MyNTLMFilter</filter-class>

    <init-param>
        <param-name>jcifs.netbios.wins</param-name>
        <param-value>192.168.109.20</param-value>
    </init-param>
    <init-param>
        <param-name>jcifs.smb.client.domain</param-name>
        <param-value>its</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>NtlmHttpFilter</filter-name>
    <url-pattern>/trunkui/greet</url-pattern>
</filter-mapping>

<!-- Servlets -->
<servlet>
    <servlet-name>greetServlet</servlet-name>
    <servlet-class>com.xxx.gwt.server.GreetingServiceImpl</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>greetServlet</servlet-name>
    <url-pattern>/trunkui/greet</url-pattern>
</servlet-mapping>

因此,目前当用户访问我们的站点时,他们会收到大约 2 或 3 个重复提示,要求他们登录域,即使他们已经登录(您必须在域上才能访问我们的应用程序)。我想至少减少提示只发生一次。因此,我打算从“/trunkui/dummy”中创建一个虚拟 servlet,并且仅在我询问名称时才调用它。远程 servlet 有这个我们异步调用的方法:

public String getUser() {
    String userAgent = "";
    try {
        userAgent = getThreadLocalRequest().getUserPrincipal().getName();

        int slashIdx = -1;
        if ((slashIdx = userAgent.indexOf('\\')) >= 0)
            userAgent = userAgent.substring(slashIdx + 1);
    } catch (Exception npe) {
        npe.printStackTrace();
    }
    return userAgent;
}

因此,我想对虚拟 servlet 进行某种调用以进行域提示,但我不确定如何从 gwt 远程服务执行此操作。或者如果有更好的方法来做到这一点?

4

1 回答 1

0

我想到了。我构建了虚拟 servlet,然后在客户端使用 RequestBuilder 来获取该 servlet。然后该 servlet 获取 userprincipal。这是客户端:

    RequestBuilder getNameRB = new RequestBuilder(RequestBuilder.GET,  "naming");
    getNameRB.setCallback( new RequestCallback() {

        @Override
        public void onResponseReceived(Request request, Response response) {
            loadUserName(response.getText());
        }

        @Override
        public void onError(Request request, Throwable exception) {
            Window.alert("Unable to authenticate user\n"+exception.getMessage());
            Window.Location.replace("http://ccc");
        }
    });
    try {
        getNameRB.send();
    } catch (RequestException e) {
        Window.alert(e.getMessage());
    }
于 2010-05-26T15:31:12.347 回答