在 Spring Boot 中设置响应头

Posted

技术标签:

【中文标题】在 Spring Boot 中设置响应头【英文标题】:Set response header in Spring Boot 【发布时间】:2018-09-01 00:29:18 【问题描述】:

如何为我的应用程序中使用 Spring Boot 进行的每个调用设置响应标头? 我想尝试使用过滤器来拦截所有调用并能够设置响应标头。 我遵循指南Disable browser caching html5,但只设置请求标头,并非总是如此。

【问题讨论】:

【参考方案1】:

有三种方法可以做到这一点:

    在 Controller 类中为特定控制器设置响应:

    @控制器 @RequestMapping(值 = DEFAULT_ADMIN_URL + "/xxx/") 公共类 XxxController …… @ModelAttribute 公共无效 setResponseHeader(HttpServletResponse 响应) response.setHeader("缓存控制", "无缓存"); ……

    @RequestMapping(value = "/find/employer/employerId", 方法 = RequestMethod.GET) 公共列表 getEmployees(@PathVariable("employerId") 长的employerId,最终的 HttpServletResponse 响应) response.setHeader("缓存控制", "无缓存"); return employeeService.findEmployeesForEmployer(employerId);
      或者您可以将 each 调用的响应头放在应用程序中(这是基于 Spring 注释的,否则请参阅automatically add header to every response):
    @零件 公共类过滤器扩展了OncePerRequestFilter …… @Override protected void doFilterInternal(HttpServletRequest 请求,HttpServletResponse 响应,FilterChain filterChain) 抛出 ServletException,IOException //response.addHeader("Access-Control-Allow-Origin", "*"); //response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1。 response.setHeader("Cache-Control", "no-store"); // HTTP 1.1。 response.setHeader("Pragma", "no-cache"); // HTTP 1.0。 response.setHeader("过期", "0"); // 代理。 filterChain.doFilter(request, response);

      我发现的最后一种方法是使用扩展 HandlerInterceptorAdapter 的拦截器;欲了解更多信息,请参阅https://www.concretepage.com/spring/spring-mvc/spring-handlerinterceptor-annotation-example-webmvcconfigureradapter

      创建扩展 HandlerInterceptorAdapter 的拦截器:
    公共类 HeaderInterceptor 扩展 HandlerInterceptorAdapter @Override 公共布尔preHandle(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,对象处理程序) httpServletResponse.setHeader("Cache-Control", "no-store"); // HTTP 1.1。 httpServletResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0。 httpServletResponse.setHeader("过期", "0"); // 代理。 返回真; 在扩展 WebMvcConfigurerAdapter 的 MvcConfig 中,您必须重写 addInterceptors 方法并添加新的拦截器: @Override 公共无效添加拦截器(拦截器注册表) …… registry.addInterceptor(new HeaderInterceptor());

希望对您有所帮助!

【讨论】:

选项 2 是最好的!谢谢。【参考方案2】:

实现过滤器并通过@Component注解注册。 @Order(Ordered.HIGHEST_PRECEDENCE) 用于建议执行优先级。

 @Component
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public class NoCacheWebFilter implements Filter 
       private static final Logger logger = LoggerFactory.getLogger(NoCacheWebFilter.class);


    @Override
    public void init(FilterConfig filterConfig) throws ServletException 
        logger.debug("Initiating WebFilter >> ");
    

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException 
        HttpServletRequest req = (HttpServletRequest) request;
HeaderMapRequestWrapper requestWrapper = new 
                    HeaderMapRequestWrapper(req);
            // implement you logic to add header
            //requestWrapper.addHeader("remote_addr", "");
        chain.doFilter(requestWrapper, response); 

    

    @Override
    public void destroy() 
        logger.debug("Destroying WebFilter >> ");
    
    

【讨论】:

以上是关于在 Spring Boot 中设置响应头的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中设置基于预认证头的认证?

097-为什么我们在SpirngBoot中设置了响应头的编码,浏览器解析出来依然回事乱码呢?

097-为什么我们在SpirngBoot中设置了响应头的编码,浏览器解析出来依然回事乱码呢?

spring boot使用http响应头传输:编码,但是tcp发送两个数据包即使响应很小

无法在 Spring Boot 应用程序提供的响应中设置“Access-Control-Allow-Origin”标头

如何在curl中设置自定义的HTTP头