CharResponseWrapper 捕获的内容为空
CharResponseWrapper captured content is empty
我尝试了以下示例来替换我的 servlet 响应中的一些内容。
Programming Customized Requests and Responses
test.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"></meta>
<link th:href="@{/css/test.css}" rel="stylesheet"></link>
<title>Test</title>
</head>
<body>
<p class="forbiddenClass">Test!</p>
</body>
</html>
test.css:
.forbiddenClass {
color: red;
}
CharResponseWrapper.java
public class CharResponseWrapper extends HttpServletResponseWrapper {
private final CharArrayWriter output;
public CharResponseWrapper(final HttpServletResponse response) {
super(response);
output = new CharArrayWriter();
}
public String toString() {
return output.toString();
}
public PrintWriter getWriter() {
return new PrintWriter(output);
}
}
ClassReplacementFilter.java
@Component
public class ClassReplacementFilter extends GenericFilterBean {
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
throws IOException, ServletException {
final CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, wrapper);
String content = wrapper.toString();
if (StringUtils.isEmpty(content)) {
System.out.println("content is empty for content type: " + response.getContentType());
} else {
content = content.replaceAll("forbiddenClass", "correctClass");
response.setContentLength(content.getBytes().length);
response.getOutputStream().write(content.getBytes());
}
}
}
如您所见,我想将字符串 forbiddenClass
替换为 correctClass
,但它仅适用于 html 文件。 test.css的内容不变,打印出filter的如下信息。
content is empty for content type: text/css;charset=UTF-8
为什么test.css的内容是空的?
Why is the content empty for test.css?
因为您只捕获了写入 response.getWriter()
的内容,而不捕获写入 response.getOutputStream()
的内容。
您需要 HttpServletResponseWrapper
实现,如相关问题答案底部所示:Catch-all servlet filter that should capture ALL HTML input content for manipulation, works only intermittently。
我尝试了以下示例来替换我的 servlet 响应中的一些内容。
Programming Customized Requests and Responses
test.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"></meta>
<link th:href="@{/css/test.css}" rel="stylesheet"></link>
<title>Test</title>
</head>
<body>
<p class="forbiddenClass">Test!</p>
</body>
</html>
test.css:
.forbiddenClass {
color: red;
}
CharResponseWrapper.java
public class CharResponseWrapper extends HttpServletResponseWrapper {
private final CharArrayWriter output;
public CharResponseWrapper(final HttpServletResponse response) {
super(response);
output = new CharArrayWriter();
}
public String toString() {
return output.toString();
}
public PrintWriter getWriter() {
return new PrintWriter(output);
}
}
ClassReplacementFilter.java
@Component
public class ClassReplacementFilter extends GenericFilterBean {
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
throws IOException, ServletException {
final CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, wrapper);
String content = wrapper.toString();
if (StringUtils.isEmpty(content)) {
System.out.println("content is empty for content type: " + response.getContentType());
} else {
content = content.replaceAll("forbiddenClass", "correctClass");
response.setContentLength(content.getBytes().length);
response.getOutputStream().write(content.getBytes());
}
}
}
如您所见,我想将字符串 forbiddenClass
替换为 correctClass
,但它仅适用于 html 文件。 test.css的内容不变,打印出filter的如下信息。
content is empty for content type: text/css;charset=UTF-8
为什么test.css的内容是空的?
Why is the content empty for test.css?
因为您只捕获了写入 response.getWriter()
的内容,而不捕获写入 response.getOutputStream()
的内容。
您需要 HttpServletResponseWrapper
实现,如相关问题答案底部所示:Catch-all servlet filter that should capture ALL HTML input content for manipulation, works only intermittently。