1

我有一个案例需要:

  • 如果博客尚未修改,则返回 304 未修改状态
  • 或者如果它在 If-Modified-Since 请求标头后被修改,则返回博客视图

问题是当我想返回 304 状态时,我如何告诉 spring mvc 不要从 null 返回假定另一个视图,并立即开始发送带有状态的响应?

@RequestMapping(value={"/blogs/{blogId}"}, method=RequestMethod.GET)
public String hello(final HttpServletRequest req, final HttpServletResponse resp, final Model model,
        @PathVariable("blogId") final String blogId) {
    if (isModified(req, blogId)) {
        resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
        return null; // this doesnt stop spring mvc to assume a view name
    }

    populate(model, grabBlog(blogId));
    return "blog";
}
4

2 回答 2

2

从 HTTP 的角度来看,返回一个视图根本没有意义。Spring 文档涵盖了该用例:

@RequestMapping
public String myHandleMethod(WebRequest webRequest, Model model) {

    long lastModified = // 1. application-specific calculation

    if (request.checkNotModified(lastModified)) {
        // 2. shortcut exit - no further processing necessary
        return null;
    }

    // 3. or otherwise further request processing, actually preparing content
    model.addAttribute(...);
    return "myViewName";
}

有两个关键要素需要注意:调用request.checkNotModified(lastModified)和返回null。前者在返回 true 之前将响应状态设置为 304。后者与前者相结合,导致 Spring MVC 不再对请求进行进一步处理。

于 2014-01-12T12:18:51.650 回答
-2

您可以使用适当的注释创建异常,然后将其抛出。然后 Spring 将为该错误代码生成一个页面。

来自:http ://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No such Order")  // 404
public class OrderNotFoundException extends RuntimeException {
    // ...
}
于 2014-01-12T12:12:13.077 回答