2016-05-29 3 views
1

Ein Spring MVC-Controller muss den Steuerungsfluss einer App auf einen anderen URL-Endpunkt in derselben App umleiten. Aber der aktuelle Code gibt eine leere Seite zusammen mit headers zurück, die die beabsichtigte Ziel-URL als forward-Header enthalten. Wenn der Inhalt des Headers forward in den Webbrowser eingefügt wird, wird der beabsichtigte Endpunkt erfolgreich aufgerufen. Welche spezifischen Änderungen müssen an dem folgenden Code vorgenommen werden, damit der Controller POST den Steuerungsablauf erfolgreich an den beabsichtigten Zielendpunkt umleitet, anstatt eine leere Seite zurückzugeben? HierResponseEntity mit HTTP-Standort-Header, der keine Umleitung verursacht

ist der Code für den Controller-Methode:

@RequestMapping(method = RequestMethod.POST) 
@ResponseStatus(value = HttpStatus.OK) 
public ResponseEntity<?> auth(FormData formData, HttpServletRequest req, HttpServletResponse resp) { 
    System.out.println("11111111111111 inside POST"); 
    HttpHeaders responseHeaders = new HttpHeaders(); 
    boolean passedTheTest = true;//ACTUAL LOGIC IS OMITTED HERE FOR SIMPLICITY 
    if (passedTheTest) { 
     //SOME OFF TOPIC LOGIC HERE IS OMITTED 
     CsrfToken csrf = (CsrfToken) req.getAttribute(CsrfToken.class.getName()); 
     String updateCsrf = csrf.getToken(); 
     responseHeaders.set("XSRF-TOKEN", updateCsrf); 
     if(resp.getHeaders("Cache-Control")!=null){responseHeaders.put("Cache-Control" , new ArrayList<String>(resp.getHeaders("Cache-Control")));} 
     if(resp.getHeader("Content-Language")!=null){responseHeaders.set("Content-Language" , resp.getHeader("Content-Language"));} 
     if(resp.getHeader("Content-Length")!=null){responseHeaders.set("Content-Length" , resp.getHeader("Content-Length"));} 
     if(resp.getHeader("Date")!=null){responseHeaders.set("Date" , resp.getHeader("Date"));} 
     if(resp.getHeader("Expires")!=null){responseHeaders.set("Expires" , resp.getHeader("Expires"));} 
     if(resp.getHeader("Pragma")!=null){responseHeaders.set("Pragma" , resp.getHeader("Pragma"));} 
     if(resp.getHeader("Server")!=null){responseHeaders.set("Server" , resp.getHeader("Server"));} 
     if(resp.getHeader("X-Application-Context")!=null){responseHeaders.set("X-Application-Context" , resp.getHeader("X-Application-Context"));} 
     if(resp.getHeader("X-Frame-Options")!=null){responseHeaders.set("X-Frame-Options" , resp.getHeader("X-Frame-Options"));} 
     if(resp.getHeader("X-XSS-Protection")!=null){responseHeaders.set("X-XSS-Protection" , resp.getHeader("X-XSS-Protection"));} 
     if(resp.getHeader("x-content-type-options")!=null){responseHeaders.set("x-content-type-options" , resp.getHeader("x-content-type-options"));} 
     if(req.getSession().getAttribute("forwardTo")!=null){ 
      String redirectTo = getValidUriFromAnotherFunction(); 
      try { 
       URI location = new URI(redirectTo); 
       responseHeaders.setLocation(location); 
      } catch (URISyntaxException e) {e.printStackTrace();} 
      ResponseEntity<Void> forwardResponseEntity = new ResponseEntity<Void>(responseHeaders, HttpStatus.CREATED);     
      return forwardResponseEntity; 
     } 
    }; 
    return new ResponseEntity<String>("aDifferentViewTemplateName", responseHeaders, HttpStatus.CREATED); 
} 

The requestheaders in der Entwickler-Browser-Tools sind:

Host: localhost:7777 
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Referer: http://localhost:7777/path/to/controller_method 
Cookie: JSESSIONID=911B34457B69F7729091DD97A160AD79; JSESSIONID=95AA730306330CF15E3776C495807354; XSRF-TOKEN=04ae2a0c-3c58-4e85-88bd-3818bb10402a 
Connection: keep-alive 

Die responseheaders für die gleiche POST sind:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate, no-cache, no-store, max-age=0, must-revalidate 
Content-Length: 0 
Date: Sun, 29 May 2016 21:48:24 GMT 
Expires: 0, 0 
Location: http://localhost:7777/path/to/forward_destination?long_querystring 
Pragma: no-cache, no-cache 
Server: Apache-Coyote/1.1 
X-Application-Context: application:7777, application:7777 
X-Content-Type-Options: nosniff, nosniff 
X-Frame-Options: DENY, DENY 
X-XSS-Protection: 1; mode=block, 1; mode=block 
XSRF-TOKEN: 04ae2a0c-3c58-4e85-88bd-3818bb10402a 

The Spring-Boot-Debug-Protokoll für die gleichen POST umfasst drei Abschnitte, die für eine verbesserte Lesbarkeit wie folgt getrennt wurden:

Abschnitt von Debug-Protokoll, das die SJSO in der Steuerung zeigt:

11111111111111 inside POST 
redirectTo is: http://localhost:7777/path/to/forward_destination?long_querystring 

Abschnitt von Debug-Protokoll nach dem Controller (am wichtigsten?):

2016-05-29 14:48:24.489 DEBUG 5533 --- [io-7777-exec-10] o.s.s.w.a.ExceptionTranslationFilter  : Chain processed normally 
2016-05-29 14:48:24.489 DEBUG 5533 --- [io-7777-exec-10] w.c.HttpSessionSecurityContextRepository : SecurityContext '[email protected]259e42: Authentication: org.springframew[email protected]42259e42: Principal: [email protected]: Username: SomeUser; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_ONE,ROLE_TWO; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]fffe3f86: RemoteIpAddress: 127.0.0.1; SessionId: 02A95844E8A829868542290D471503F5; Granted Authorities: ROLE_ONE, ROLE_TWO, ROLE_THREE' stored to HttpSession: '[email protected] 
2016-05-29 14:48:24.489 DEBUG 5533 --- [io-7777-exec-10] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed 

Antwort

1

Statt den 201 Erstellt Statuscode der Rückkehr sollten Sie einen 3XX Statuscode zurückgeben den User-Agent zu loa fragen d eine andere Webseite. Ansonsten hat der Location-Header keine "spezielle" Bedeutung.

So zum Beispiel können Sie schreiben:

ResponseEntity<Void> forwardResponseEntity = new ResponseEntity<Void>(responseHeaders, HttpStatus.MOVED_PERMANENTLY); 
+1

3xx ja, aber es sollte wirklich ein 303 in diesem Fall sein. –

Verwandte Themen