Löschen Sie Cookies mit RastTemplate, bevor Sie HTTP-Call erstellenJava

Java-Forum
Anonymous
 Löschen Sie Cookies mit RastTemplate, bevor Sie HTTP-Call erstellen

Post by Anonymous »

Ich verwende Spring-Boot 2.0.2 rastTemplate < /code>, um das folgende Szenario zu erstellen: < /p>

Ich bin ein Rastkonsumer (Client), der: < /p>


Zuerst müssen ein Second-Call-Check-Check-Check-Check-Check-Check zuerst log. Daten. < /li>
< /ol>

Zuerst dachte ich, den Auth-Anruf zu tätigen und das JSESSIONID-Cookie von Set-Cookie manuell zu lesen und auf den zweiten Anruf im Kopf zu stellen. Hier mein erster Versuch: < /p>

Der RestClient: < /p>

Code: Select all

@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>

Um vollständig zu sein, hier der im Konstruktor verwendete Kostümierer: < /p>

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

Wenn ich jetzt einige Funktionstests mit Wiremock erstelle, sehe ich das Ergebnis in der Wiremock-Reqeust-Geschichte für den Datenaufruf: < /p>

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

Warten Sie - JSESSIONID wird 2 Mal eingestellt. Cool REST behandelt es für mich! < /p>

Zweiten Versuch: Ich kann die Keksleitfunktion entfernen. Und es funktioniert. Ich weiß nicht, wie der Rastproduzent damit umgehen kann (Session-Timeout E.C.T.). 

 Jetzt möchte mein Problem/die Frage: 

Ich möchte RastTemplate 
zum Vergessen/Löschen aller Cookies erzwingen, bevor ich den Anmeldebau erstellen (Grundbeschreibung zuvor). Gibt es eine Möglichkeit? Ich habe nichts gefunden, was funktioniert hat. Die Deaktivierung des Cookiemanagments kann über den ResttemplateCustomizer < /code>: < /p>

durchgeführt werden

Code: Select all

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post