在Spring Boot中设置响应头

Gia*_*ggi 1 no-cache filter browser-cache response-headers spring-boot

如何在使用Spring Boot创建的应用程序中为每个调用设置响应头?我想尝试使用过滤器来拦截所有调用,并能够设置响应头.我按照指南禁用浏览器缓存HTML5,但只设置请求标头,而不是总是.

Gia*_*ggi 10

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

  1. 在Controller类中设置特定控制器的响应:

    @Controller
    @RequestMapping(value = DEFAULT_ADMIN_URL + "/xxx/")
    public class XxxController
    ....
        @ModelAttribute
        public void setResponseHeader(HttpServletResponse response) {
           response.setHeader("Cache-Control", "no-cache");
           ....
        }
    

    要么

    @RequestMapping(value = "/find/employer/{employerId}", method = RequestMethod.GET)
    public List getEmployees(@PathVariable("employerId") Long employerId, final HttpServletResponse response) {
        response.setHeader("Cache-Control", "no-cache");
        return employeeService.findEmployeesForEmployer(employerId);
    }
    
    1. 或者你可以在应用程序中为每个调用放置响应头(这是基于Spring注释的,否则看到自动为每个响应添加头):
    @Component
    public class Filter extends OncePerRequestFilter {
    ....
     @Override
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws 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("Expires", "0"); // Proxies.
        filterChain.doFilter(request, response);
     }
    }
    
    1. 我找到的最后一种方法是使用一个扩展HandlerInterceptorAdapter的Interceptor; 有关详细信息,请参阅https://www.concretepage.com/spring/spring-mvc/spring-handlerinterceptor-annotation-example-webmvcconfigureradapter

      • 创建扩展HandlerInterceptorAdapter的Interceptor:
    public class HeaderInterceptor extends HandlerInterceptorAdapter {
    
      @Override
      public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) {
        httpServletResponse.setHeader("Cache-Control", "no-store"); // HTTP 1.1.
        httpServletResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0.
        httpServletResponse.setHeader("Expires", "0"); // Proxies.
        return true;
      }
    }
    
    • 在你的MvcConfig中,它扩展了WebMvcConfigurerAdapter,你必须覆盖addInterceptors方法并添加新的Interceptor:
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        ....
        registry.addInterceptor(new HeaderInterceptor());
    }
    

我希望我能提供帮助!