我试图在过滤器中将压缩文件的内容类型设置为正确的mime类型,而不是application / gzip。这是我的一些代码:
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
{
final HttpServletRequest request = (HttpServletRequest) servletRequest;
final HttpServletResponse response = (HttpServletResponse) servletResponse;
String reqUrl = request.getRequestURI();
if (reqUrl.endsWith(gzExt))
{
response.setHeader("Content-Encoding", "gzip");
response.setContentType("text/javascript");
System.out.println("Set header " +reqUrl +", " + response.getContentType() );
filterChain.doFilter(request, response);
System.out.println("Header now: " + reqUrl + ", " + response.getContentType() );
return;
}
}
输出:
Set header /test.js.gz, text/javascript
Header now: /test.js.gz, application/x-gzip
在浏览器中,我看到content-encoding
正确设置为gzip
,但content- type
仍为application/x-gzip
。似乎filterChain.doFilter()
正在重置内容类型。
知道如何永久重置内容类型吗?
我没有其他过滤器。
我借助以下答案解决了它:
private class ForcableContentTypeWrapper extends HttpServletResponseWrapper
{
public ForcableContentTypeWrapper(HttpServletResponse response)
{
super(response);
}
@Override
public void setContentType(String type)
{
}
public void forceContentType(String type)
{
super.setContentType(type);
}
}
然后将我上面的代码更改为:
if (reqUrl.endsWith(gzExt))
{
ForcableContentTypeWrapper newResponse = new ForcableContentTypeWrapper(response);
newResponse.setHeader("Content-Encoding", "gzip");
newResponse.forceContentType("text/javascript");
filterChain.doFilter(request, newResponse);
return;
}
它不是一个很好的解决方法,但它可以工作。
问题内容: 我的应用程序中有2个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点? 我做了一些谷歌搜索,但没有成功。我希望请求继续执行而不执行第二个过滤器。那可能吗? 任何帮助将不胜感激。 问题答案: 您可以在请求中设置一个属性,然后在第二个过滤器中对其进行检查。 您可以像这样简化上面的代码: 这样,您只需检查属性“ executeSecondFilter”的存在
问题内容: 我正在尝试找到一种方法,可将请求从过滤器重定向到登录页面,但我不知道如何从servlet重定向。我搜索了,但发现的是方法。我在过滤器的响应对象上找不到此方法。是什么原因 我该如何解决? 问题答案: 在Filter中,响应是而不是。因此将强制转换为。 如果使用上下文路径: 也不要忘记在最后打电话。
我所拥有的 预期产出 实际产量 这只是一个例子。在我的真实代码中,我正在对我的全局状态(useContext, useReduer)执行删除操作。 是一个ID数组。
您好,我如何在Java8(我知道它已经在Java11)中做相反的不过滤这一点 我可以这样写 但很难读懂
我有这个密码 但是,我有这样的错误消息: 怎么解决这个?
问题内容: Servlet和Filter有什么区别?您建议使用什么来授权页面? 问题答案: 当你要根据特定条件过滤和/或修改请求时,请使用。使用时要控制,预处理和/或后处理请求。 在Java EE的教程中提到有关筛选如下: 筛选器是可以转换请求或响应的标头和内容(或两者)的对象。过滤器与Web组件的不同之处在于,过滤器本身通常不会创建响应。相反,过滤器提供的功能可以“附加”到任何类型的Web资源。