【问题标题】:Adding headers to Spring controllers将标头添加到 Spring 控制器
【发布时间】:2012-05-23 09:03:46
【问题描述】:

我知道这个问题与this 的问题非常相似,但我觉得它的不同和具体足以保证在这里提出自己的问题。

我刚刚从一个没有留下任何文档的唯一开发人员那里继承了一个 Java Web 应用程序项目。它是一个 Spring MVC 应用,基本包结构如下:

com.ourOrg.app.controllers
    ImageController
    ProgramController
    UserController
com.ourOrg.app.otherPackages

每个Controller 类只是一个带有@Controller 和@RequestMapping("/blah") 注释的POJO。例如:

@Controller
@RequestMapping("/images")
public class ImageController() {
    @RequestMapping(value="/saveImage", method = RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<String> saveImage(@RequestParam(value="imageData", required=true) String imageXML, HttpServletRequest request){
        // This method gets executed whenever the:
        // http://ourSite.com/images/saveImage
        // URL is hit
    }
}

我被要求将以下 HTTP 标头添加到 Spring 配置中,以便我们禁用浏览器缓存:

编译指示:无缓存

缓存控制:无缓存

过期:-1

我上面链接的文章听起来我们的控制器应该扩展这个WebContentGenerator 类。不幸的是,有数十个控制器具有大量方法,因此重构每个控制器以扩展或继承某些基本类型并不是一个真正可行的选择(除非它是 only 选项!)。

我还看过一些文章,听起来您必须配置 Spring 以使用修改响应标头的 AOP 拦截器,但现在我真的进入了陌生的领域。

鉴于我们对 Spring MVC 的设置和实现,我将这三个简单的标头添加到服务器发回的每个响应中最简单的方法是什么(无论执行哪个控制器或方法)?

提前致谢!

【问题讨论】:

  • 也许我弄错了,但你不能在退出控制器之前在 HttpServletResponse 对象中设置这些吗?您的控制器应该有权访问该对象。
  • 怎么样?只有注释使它们成为控制器,但它们仅扩展 Object...

标签: caching spring-mvc http-headers


【解决方案1】:

希望您使用的是 Spring 3,您可以查看一个拦截器,然后您就不必修改所有控制器(因为您说您有很多)。看起来他们可能已经实现了一个你可以使用的。查看 Bozho 对这个问题的回答 how to set header no cache in spring mvc 3 by annotation

【讨论】:

  • 我认为如果您可以为此添加一个示例,那么您的答案是您和我之间更好的答案。拦截器的好主意。 +1
  • 我不愿举一个例子来说明这一点,因为这实际上只是 Bozho 的答案,所以我宁愿人们去回答这个问题并支持他的答案,因为他赢得了它。
  • @digitaljoel - 所以我只需将此 XML 添加到我的 Spring 配置中,Spring 就会知道拦截所有 HTTP 响应并使用这些缓存标头注入它们?我需要做任何“AOP 的东西”(定义切入点等)吗?
  • 你不需要配置任何 AOP 的东西。它就像一个过滤器,但在春天处理。本文可能会帮助您了解拦截器的作用java.dzone.com/articles/using-spring-interceptors-your Bozho 的答案中的 xml 只是配置现有的拦截器,而不是您必须创建自己的拦截器。
  • 谢谢 - 最后一个问题 - 此代码会覆盖或附加到当前返回的标题吗?换句话说,它会“炸毁”当前从服务器返回的 HTTP 响应标头吗?
【解决方案2】:

我意识到这是一篇旧帖子,但也许这会对某人有所帮助。我在这个例子中使用了 Spring。

主要是对参数使用注解:

@Controller
public class HelloController {
 
    @RequestMapping(value = "/hello.htm")
    public String hello(@RequestHeader(value="User-Agent") String userAgent)
 
        //..
    }
}

【讨论】:

    猜你喜欢
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多