Почему моя сессия пропала при использовании RestTemplate для доступа к Spring MVC? - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь получить доступ к приложению Spring MVC.Это использует токен CSRF.Я делаю начальный GET, чтобы получить токен.Затем добавьте его в мой пост с моим JSESSIONID.Однако во время отладки серверное приложение не находит мой JSESSIONID.И, следовательно, не аутентифицирует мой токен, и дает мне 403 .

Я не могу сказать, но похоже, что мой GET JSESSIONID не сохраняется в репозитории HTTP Session сервера,Есть ли способ, чтобы проверить:

  • Сессия в контексте сервера?
  • Отправляю ли я правильные данные заголовка?

Вот мойкод:

public String testLogin() {
    ResponseEntity<String> response = 
    restTemplate.getForEntity(LOGIN_RESOURCE_URL, String.class);

    List<String> cookies = new ArrayList<String>();
    cookies = response.getHeaders().get("Set-Cookie");
    String[] firstString = cookies.get(0).split("=|;");
    String jsessionPart = firstString[1];
    String[] secondString = cookies.get(1).split("=|;");

    String tokenPart = secondString[1];

    BasicCookieStore cookieStore = new BasicCookieStore();
    BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", 
    jsessionPart);
    cookie.setDomain(".mydomain.com");
    cookie.setPath("/");
    cookieStore.addCookie(cookie);

    BasicClientCookie cookie2 = new BasicClientCookie("X-XSRF-TOKEN", 
    tokenPart);
    cookie2.setDomain(".mydomain.com");
    cookie2.setPath("/");
    cookieStore.addCookie(cookie2);
    HttpClient client = HttpClientBuilder
            .create()
            .setDefaultCookieStore(cookieStore)
            .disableRedirectHandling()
            .build();

    HttpComponentsClientHttpRequestFactory factory = new 
    HttpComponentsClientHttpRequestFactory();

    factory.setHttpClient(client);
    RestTemplate postTemplate = new RestTemplate(factory);
    HttpEntity<?> requestEntity = new HttpEntity<Object>(body, headers);

    ResponseEntity<String> response = postTemplate.exchange(loginUserUrl, 
          HttpMethod.POST, requestEntity,String.class);

К вашему примеру кода я добавил имя пользователя и пароль, а также изменил тип контента.403 по-прежнему происходит независимо от того, отправил я тип контента или нет:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

// if you need to pass form parameters in request with headers.
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
try {
    map.add( URLEncoder.encode("username", "UTF-8"), 
    URLEncoder.encode("userdev", "UTF-8") );

    map.add(URLEncoder.encode("password", "UTF-8"), 
    URLEncoder.encode("devpwd","UTF-8") );
} catch (UnsupportedEncodingException e) {

        e.printStackTrace();
}
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<> 
(map, headers);

ResponseEntity<String> response = 
this.restTemplate(builder).exchange(RESOURCE_URL, HttpMethod.POST, 
requestEntity, String.class);

1 Ответ

0 голосов
/ 12 февраля 2019

Вместо того, чтобы возиться с cookie-файлами самостоятельно, давайте сделаем это с помощью Apache HttpClient.Настройте RestTemplate для работы с правильно настроенным HttpClient.

Что-то вроде этого должно сработать

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder.requestFactory(this::requestFactory)
            .build();
}

@Bean
public HttpComponentsClientHttpRequestFactory requestFactory() {

    RequestConfig defaultRequestConfig = RequestConfig.custom()
            .setCookieSpec(CookieSpecs.DEFAULT)
            .setExpectContinueEnabled(true)
            .build();

    CloseableHttpClient httpClient = HttpClientBuilder.create()
            .setDefaultCookieStore(new BasicCookieStore())
            .setDefaultRequestConfig(defaultRequestConfig).build();

    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
    requestFactory.setHttpClient(httpClient);
    return requestFactory;
}

Это настроит RestTemplate на использование HttpClient, который хранит куки в CookieStore между запросами.Повторно используйте настроенный RestTemplate и не создавайте новый, потому что он может вам понадобиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...