Чистые куки с RestTemplate перед тем, как сделать HTTP-звонокJAVA

Программисты JAVA общаются здесь
Anonymous
Чистые куки с RestTemplate перед тем, как сделать HTTP-звонок

Сообщение Anonymous »

Я использую Spring-boot 2.0.2 Resttemplate < /code> для составления следующего сценария: < /p>

I'm Rest-consumer (клиент), который: < /p>


Сначала нужно войти в систему Spring-security-check < /li>
. /> < /ol>

Во-первых, я подумал, чтобы сделать звонок и вручную прочитать печенье jsessionid из Set-cookie и установить его на второй вызов в заголовке. Здесь моя первая попытка: < /p>

RestClient: < /p>

@Service
public class RestClient {
private static final String ENDPOINT_DATA = "/data";
private static final String ENDPOINT_SECURITY_CHECK = "/j_spring_security_check";

private static final String HTTP_HEADER_KEY_SET_COOKIE = "Set-Cookie";
private static final String HTTP_HEADER_KEY_COOKIE = "Cookie";

private static final String PROPERTY_SPRING_SECURITY_USER = "j_username";
private static final String PROPERTY_SPRING_SECURITY_PASS = "j_password";

private final RestTemplate restTemplate;
private final RestConfig restConfig;

@Autowired
public RestClient(RestTemplateBuilder restTemplateBuilder, final RestConfig restConfig) {

notNull(restTemplateBuilder, "restTemplateBuilder must not be null!");
this.restTemplate = restTemplateBuilder
.additionalCustomizers(new NoRedirectionHandlingRestTemplateCostumizer())
.build();

notNull(restConfig, "openIdConfig must not be null!");
this.restConfig = restConfig;
}

public String getData() {
final String jSessionCockie = jSpringSecurityLogin();
return getAuthorizeCode(jSessionCockie);
}

private String jSpringSecurityLogin() {
// read config
final String fullLoginUri = restConfig.getUrl() + ENDPOINT_SECURITY_CHECK;
final String user = restConfig.getUser();
final String password = restConfig.getPassword();

// Build entity that is send
final HttpHeaders headers = new HttpHeaders();
final String body = PROPERTY_SPRING_SECURITY_USER + "=" + user + "&" + PROPERTY_SPRING_SECURITY_PASS + "=" + password;
final HttpEntity toSend = new HttpEntity(body, headers);

final String jSessionIdCockie;

final ResponseEntity response = restTemplate.postForEntity(fullLoginUri, toSend, String.class);

// Get String "JSESSIONID=XXXX". If there are other Cookies, propably will fail.
if (HttpStatus.FOUND.equals(response.getStatusCode()) && response.getHeaders().containsKey(HTTP_HEADER_KEY_SET_COOKIE)) {
jSessionIdCockie = response.getHeaders().get(HTTP_HEADER_KEY_SET_COOKIE).get(0);
} else {
throw new Error();
}

return jSessionIdCockie;
}

private String getAuthorizeCode(final String jSessionCockie) {
// read config
final String fullDataUri = restConfig.getUrl() + ENDPOINT_DATA;

// Build entity that is send
final HttpHeaders headers = new HttpHeaders();
headers.add(HTTP_HEADER_KEY_COOKIE, jSessionCockie);
final HttpEntity toSend = new HttpEntity(headers);

final ResponseEntity response = restTemplate.exchange(fullDataUri, HttpMethod.GET, toSend, String.class);

if (HttpStatus.OK.equals(response.getStatusCode()) && response.hasBody()) {
return response.getBody();
} else {
return "";
}
}
}
< /code>

Чтобы быть завершенным, здесь костюмийзер, используемый в конструкторе: < /p>

class NoRedirectionHandlingRestTemplateCostumizer implements RestTemplateCustomizer {
@Override
public void customize(RestTemplate restTemplate) {
final HttpClient httpClient = HttpClientBuilder.create()
.disableRedirectHandling()
.build();
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
}
}
< /code>

Теперь, когда я делаю некоторые тестирование функций с помощью Wiremock, я вижу фологу в истории Wiremock-reqeust для передачи данных: < /p>

{
...
"headers":
{
"Cookie": [
"JSESSIONID=axcvueiornxniuwherwuieoiun,asdpfoiu",
"JSESSIONID=axcvueiornxniuwherwuieoiun,asdpfoiu"
],
...
},
"cookies":
{
"JSESSIONID": [
"axcvueiornxniuwherwuieoiun,asdpfoiu",
"axcvueiornxniuwherwuieoiun,asdpfoiu"
]
}
...
}
< /code>

ждать - jsessionId установлен 2 раза. Крутой отдых обрабатывает это для меня! < /p>

Вторая попытка: я могу удалить руку cookie. И это работает. < /P>

Но сначала и вторая попытка поставить по проблеме: после первого вызова restclient.getData () < /code> Все следующие вызовы в логин-эндоунт также имеют набор jsessionId. Я не знаю, как продюсер для отдыха может справиться с этим (сеанса-времени E.C.T.).

Теперь моя проблема/вопрос:

Я хотел бы заставить Resttemplate забыть/очистить все файлы cookie, прежде чем сделать вызов для входа в систему (причина описания ранее). Есть возможность? Я не нашел ничего, что работало. Отключение поваренного матча может быть сделано по сравнению с ResttemplateCustomizer < /code>: < /p>

class NoRedirectionHandlingRestTemplateCostumizer implements RestTemplateCustomizer {
@Override
public void customize(RestTemplate restTemplate) {
final HttpClient httpClient = HttpClientBuilder.create()
.disableRedirectHandling()
.disableCookieManagement()
.build();
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
}
}


Подробнее здесь: https://stackoverflow.com/questions/506 ... -http-call

Вернуться в «JAVA»