如何为使用 Spring Boot 进行的应用程序中的每个调用设置响应标头?我想尝试使用过滤器来拦截所有调用并能够设置响应标头。我按照指南禁用浏览器缓存 HTML5,但只设置请求标头,并非总是如此。
问问题
16766 次
2 回答
20
有三种方法可以做到这一点:
在 Controller 类中设置特定控制器的响应:
@控制器 @RequestMapping(值 = DEFAULT_ADMIN_URL + "/xxx/") 公共类 XxxController …… @ModelAttribute 公共无效 setResponseHeader(HttpServletResponse 响应) { response.setHeader("缓存控制", "无缓存"); …… }
或者
@RequestMapping(value = "/find/employer/{employerId}", 方法 = RequestMethod.GET) public List getEmployees(@PathVariable("employerId") 长的employerId,最终的HttpServletResponse 响应) { response.setHeader("缓存控制", "无缓存"); return employeeService.findEmployeesForEmployer(employerId); }
- 或者您可以将每个调用的响应头放在应用程序中(这是基于 Spring 注释的,否则请参阅自动将头添加到每个响应):
@零件 公共类过滤器扩展了OncePerRequestFilter { …… @覆盖 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, 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 { @覆盖 公共布尔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 方法并添加新的拦截器:
@覆盖 公共无效添加拦截器(拦截器注册表){ …… registry.addInterceptor(new HeaderInterceptor()); }
我希望我有帮助!
于 2018-03-22T14:49:11.757 回答
0
实现Filter并通过@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 >> ");
}
}
于 2018-03-22T14:26:19.707 回答