我希望在servlet生成的所有JSON响应中添加一个
问题在于,当我引入响应包装器时,
")]}',\n"
前缀,以防止JSON漏洞,如AngularJS建议。 我找到了一种修改响应内容的方法。 使用Spring的OncePerRequestFilter
基类,我最终得到了以下代码:public class JsonArrayVulnerabilityPreventorFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
PrintWriter responseOut = response.getWriter();
CharResponseWrapper responseWrapper = new CharResponseWrapper(response);
filterChain.doFilter(request, responseWrapper);
if (StringUtils.contains(responseWrapper.getHeader("Content-Type"), "application/json")) {
responseOut.write(")]}',\n");
}
String originalServletResponse = responseWrapper.toString();
responseOut.write(originalServletResponse);
}
}
问题在于,当我引入响应包装器时,
Content-Type
头(以及其他一些头)从响应中消失了。我已经确认,没有包装器时,response.getHeaderNames()
调用返回14个不同的头(包括内容类型),而使用包装器只有9个。它还会破坏字符编码,因为使用包装器时,Content-Type
头不会告诉浏览器内容是UTF-8编码的。为什么?
CharResponseWrapper
的来源和想法在这里和在这里。
public class CharResponseWrapper extends HttpServletResponseWrapper {
private CharArrayWriter output;
public String toString() {
return output.toString();
}
public CharResponseWrapper(HttpServletResponse response) {
super(response);
output = new CharArrayWriter();
}
public PrintWriter getWriter() {
return new PrintWriter(output);
}
}