将ServletResponse标头传递给ResponseEntity

时间:2016-05-27 21:39:43

标签: java spring spring-mvc

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

0 个答案:

没有答案