我希望在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);
}
}发布于 2015-02-03 22:19:15
实际上,我通过以下配置解决了根本问题(将)]}',\n前缀添加到每个JSON响应中)。
@Configuration
@EnableWebMvc
public class WebappConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setJsonPrefix(")]}',\n");
converters.add(converter);
}
}发布于 2015-07-31 03:31:44
https://stackoverflow.com/questions/26384930
复制相似问题