GWT, jcifs и множество подкани за влизане

Имаме 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" и да го оставя да се извиква само когато поискам името. Отдалеченият сървлет има този метод, който извикваме асинхронно:

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;
}

Така че исках да направя някакъв вид повикване към фиктивния сървлет, за да направя подканата за домейна, но не съм сигурен как да направя това от отдалечената услуга на gwt. Или ако има по-добър начин да направите това?


person arinte    schedule 26.05.2010    source източник


Отговори (1)


Разбрах го. Създадох фиктивния сървлет и след това използвах RequestBuilder от страната на клиента, за да направя достъп до този сървлет. След това този сървлет получава потребителския принципал. Ето клиентската страна:

    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());
    }
person arinte    schedule 26.05.2010