我需要在每个响应中添加标题。我正打算在下面做
public class MyFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
filterChain.doFilter(request, response);
response.addHeader("Access-Control-Allow-Origin", "*");
}
}
我想在filterChain.doFilter(请求,响应)
之后这样做,以便一旦控制器处理它,我只是在返回客户端之前添加标头。是正确的吗?
但如何编写响应过滤器?
在链之后。doFilter
已返回,对响应执行任何操作都为时已晚。此时,整个响应已经发送到客户端,您的代码无法访问它。
我觉得上面的说法不对。我不能在过滤链之后添加标题。doFilter(请求、响应)?如果不是,为什么?
我使用的是spring mvc。
来自JavaEE教程
修改响应的筛选器通常必须在将响应返回到客户端之前捕获该响应。要做到这一点,您需要将一个备用流传递给生成响应的servlet。代理流防止servlet在完成时关闭原始响应流,并允许过滤器修改servlet的响应。
要将此备用流传递给servlet,过滤器会创建一个响应包装器,该包装器覆盖getWriter或getOutputStream方法以返回此备用流。包装器被传递到筛选器链的doFilter方法。包装器方法默认调用包装的请求或响应对象。这种方法遵循设计模式中描述的众所周知的包装器或装饰器模式,
我在Spring 3.0的项目中使用了这个。x:
public class MyFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException
{
response.addHeader("headerName", "headerValue");
filterChain.doFilter(request, response);
}
}
很好。
在过滤器链之后。doFilter
被称为对响应执行任何操作都为时已晚。此时,整个响应已经发送到客户端。
您需要将wrap响应构建到自己的类中,将这些包装传递到doFilter
方法中,并处理包装中的任何处理。
已经有一个响应包装器:HttpServletResponseWrapper
,您可以扩展它。例如:
public class MyResponseRequestWrapper extends HttpServletResponseWrapper{
public MyResponseRequestWrapper(HttpServletResponse response) {
super(response);
}
}
您的过滤器:
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
HttpServletResponse myResponse = (HttpServletResponse) response;
MyResponseRequestWrapper responseWrapper = new MyResponseRequestWrapper(myResponse);
responseWrapper.addHeader("Access-Control-Allow-Origin", "*");
filterChain.doFilter(request, myResponse);
}
问题内容: 我想让ETag支持。为此,需要做所有工作。我如何在不声明的情况下添加它(实际上不存在,因为到目前为止我已经不知何故了)? PS我使用Spring Boot 1.1.4 PPS这是一个完整的解决方案 问题答案: When using Spring Boot 如参考文档中所述,唯一的步骤是在配置类中将该过滤器声明为Bean,就这样! When using Spring MVC 你可能已经扩
我想要ETag支持。为此,有一个来完成所有工作。我如何添加它而不在我的中声明它(它实际上并不存在,因为我到目前为止不知怎的没有它)?
问题内容: 我刚开始接触Angular,但过去几周一直在使用它,并且设法解决了我遇到的大多数问题。然而,这让我感到难过。 我有一个应用程序,该应用程序从Twitter提取推文,然后使用角度过滤器提取所有URL,并将其设置为链接样式。该部分工作正常,但客户认为来自Twitter的链接不安全,因此他们希望在每次单击链接时触发免责声明。足够简单- 我劫持了链接并将换成一个。这是发生问题的地方- 不起作用
我有下面的servlet过滤器。
问题内容: 我想向项目资源管理器添加一个新的过滤器,以向用户隐藏在Eclipse RCP应用程序中自动创建的一些项目。 到目前为止,我发现了两个扩展点: org.eclipse.ui.ide.resourceFilters 让我过滤导航 org.eclipse.jdt.ui.javaElementFilters 让我筛选Java查看器 我希望Project Explorer有一个类似的扩展点,但是
问题内容: 我想知道,中的类(对于Web应用程序)是否有任何注释?也许@Filter吧? 我想在项目中添加自定义过滤器。 《 Spring Boot参考指南 》提到了关于 ,但是我不确定如何使用它。 问题答案: 如果您要设置第三方过滤器,则可以使用FilterRegistrationBean。例如相当于web.xml 这些将是@Configuration文件中的两个bean 上面已经用spring