GWT, jcifs и несколько запросов на вход в систему - PullRequest
0 голосов
/ 26 мая 2010

У нас есть приложение 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. Или есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 26 мая 2010

Я понял это. Я построил фиктивный сервлет, а затем использовал 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());
    }
...