Spring MVC控制器需要有条件地:
1。)将用户转发到一个非常不同的URI,或者 2.)返回上一个视图,以便用户可以以相同的形式重新输入数据
我的研究表明重定向应该通过给控制器方法返回ResponseEntity
类型来完成。 如何将HttpHeaders
从传递给控制器方法的HttpServletResponse
转换为在控制器中创建的新ResponseEntity
?
没有HttpServletResponse.getHeaders()
方法,并且必须有一个比(在伪代码中)更优雅的方法:
HttpHeaders responseHeaders = new HttpHeaders();
for(String headerName : HttpServletResponse.getHeaderNames()) {
responseHeaders.add(httpServletResponse.getHeader(headerName));
or
responseHeaders.add(httpServletResponse.getHeaders(headerName));.
}
add responseHeaders to new ResponseEntity;
如果用户没有在前面的FreeMarker视图的表单中提供正确的信息,那么控制器应该能够返回用户称之为控制器的先前FreeMarker视图的附加要求使这有点混乱。
这是我做过的代码。需要对其进行哪些具体更改?
@RequestMapping("/handle")
public ResponseEntity<?> handle( HttpServletRequest req, HttpServletResponse resp) {
HttpHeaders responseHeaders = resp.getHeaders();//THIS IS NOT IN THE API
responseHeaders.set("MyResponseHeader", "MyValue");
boolean locationRedirect = true;
// Add some logic to determine whether to 1.) forward the user or 2.) return the previous view so they can re-enter information
if(locationRedirect){
try {
URI location = new URI("some_uri_to_send_user_to_if_they_entered_correct_value_in_form");
responseHeaders.setLocation(location);
} catch (URISyntaxException e) {e.printStackTrace();}
return new ResponseEntity<Void>(responseHeaders, HttpStatus.CREATED);
} else{// send the user back to the freeMarker view that would otherwise be at 'return "viewName";'
return new ResponseEntity<String>("viewName", responseHeaders, HttpStatus.CREATED);
}
}