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

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

【问题讨论】:

    标签: spring-boot filter browser-cache response-headers no-cache


    【解决方案1】:

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

    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); }
      1. 或者您可以将 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); } }
      1. 我发现的最后一种方法是使用扩展 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 >> ");
        }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 2019-01-14
      • 2017-05-26
      • 2019-12-15
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多