2016-05-29 4 views
1

Spring MVCコントローラは、アプリケーションの制御フローを同じアプリケーション内の別のURLエンドポイントにリダイレクトする必要があります。しかし、現在のコードでは、responseheadersと一緒に空白のページが返され、宛先URLはforwardヘッダーになります。 forwardヘッダーの内容がWebブラウザーに貼り付けられると、目的のエンドポイントが正常に呼び出されます。 POSTコントローラが空のページを返すのではなく、目的の宛先エンドポイントに制御フローを正常にリダイレクトするためには、以下のコードにどのような変更を加える必要がありますか?ここでResponseEntity with HTTP Locationヘッダーがリダイレクトされない

コントローラメソッドのコードです:ブラウザの開発ツールで

@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は以下のとおりです。同じPOSTため

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は以下のとおりです。

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

スプリングブートデバッグログが分離された三つのセクションを含む:

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

セクション:コントローラ内部SYSOを示すデバッグログの

セクションデバッグログのコントローラ(最も重要な?)の後に:

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の作成されたステータスコードを返すあなたはLOAにユーザーエージェントを依頼するの3xxステータスコードを返す必要があります異なるウェブページ。それ以外の場合、Locationヘッダーには特別な意味はありません。

したがって、たとえば、あなたが書くことができます:はい

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

3xxのを、それは本当にこの場合、303であるべき。 –

関連する問題