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 на стороне клиента, чтобы получить доступ к этому сервлету. Затем этот сервлет получает 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());
    }
person arinte    schedule 26.05.2010