2016-05-29 148 views
1

Spring MVC控制器需要將應用程序的控制流重定向到同一應用程序內的不同URL終結點。但是,當前代碼正在返回一個空白頁以及responseheaders,其中包括預期的目標網址作爲forward標頭。當forward標題的內容被粘貼到Web瀏覽器中時,成功調用預期的端點。 爲了使POST控制器成功地將控制流重定向到預定的目標端點而不是返回空白頁,需要對下面的代碼進行哪些特定更改?ResponseEntity與HTTP位置標題不會導致重定向

下面是控制方法的代碼:

@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); 
} 

在瀏覽器的開發者工具requestheaders是:

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 

responseheaders爲同一POST是:

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 

春季啓動調試日誌對於相同POST包括三個部分,其中已經被分開來提高可讀性如下:

調試日誌的部分,其示出了控制器內的SYSO:

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

節調試日誌後,控制器的(最重要的):

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 

回答

1

代替返回201 Created狀態碼,你應該返回一個3xx狀態代碼來詢問用戶代理LOA d不同的網頁。否則,位置標題沒有「特殊」含義。

因此,例如,你可以寫:

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

3XX是的,但它確實應該是在這種情況下303。 –