Sah*_*rma 7 servlets jetty servlet-filters
我试图修改过滤器中的http响应,并得到以下异常
java.lang.IllegalStateException:位于org.eclipse.jetty.servlets的javax.servlet.ServletResponseWrapper.getOutputStream(ServletResponseWrapper.java:142)的org.eclipse.jetty.server.Response.getOutputStream(Response.java:657)处的WRITER. ProxyServlet.service(ProxyServlet.java:414)atg.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:643)org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1331)在com.cisco.vsx.node.proxy.http.RegexFilter.doFilter(RegexFilter.java:36)
我正在使用SelectChannelSelector和ProxyServlet.Transparent代理.
以下是测试类的片段
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
ProxyServlet.Transparent p1 = new ProxyServlet.Transparent("/proxy",
"www.cisco.com", 80);
ServletHolder servletHolder = new ServletHolder(p1);
context.addServlet(servletHolder, "/proxy/*");
context.addFilter(new FilterHolder(RegexFilter.class), "/*", null);
server.setHandler(context);
server.start();
server.join();
Run Code Online (Sandbox Code Playgroud)
这是过滤器类的代码
PrintWriter out = response.getWriter();
CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, wrapper);
String html = wrapper.toString();
if (regex != null && response.getContentType() != null
&& response.getContentType().startsWith("text/html")) {
Matcher matcher = regex.matcher(html);
Map<Integer, Integer> matches = new LinkedHashMap<Integer, Integer>();
while (matcher.find()) {
int start = matcher.start(1);
System.out.println("START" + start);
int end = matcher.end(1);
System.out.println("END" + end);
matches.put(start, end - start);
}
StringBuffer sb = new StringBuffer();
int start = 0;
for (int startIndex : matches.keySet()) {
String str = html.substring(start, startIndex) + "/proxy/";
sb.append(str);
start = startIndex + matches.get(startIndex);
}
html = sb.toString();
}
response.setContentLength(html.getBytes().length);
out.write(html);
Run Code Online (Sandbox Code Playgroud)
不确定哪里出了问题.
Nic*_*tar 13
您的Jetty响应可以是两种(技术上为三种)不同的模式.一种是写入模式,另一种是流模式(第三种基本上是未定模式).
如果你打电话getWriter()给"未定"的回复,你就会把它置于写入模式,这是无法逆转的.如果稍后某些事情尝试在流模式下使用此响应(通过调用getOutputStream()),则会抛出您看到的异常.
要解决此问题,请不要在编写器模式下使用此响应,而是在OutputStream上"执行操作".如果您稍后访问编写器(在doChain之后),则会得到反向异常
java.lang.IllegalStateException:STREAM
代替.
| 归档时间: |
|
| 查看次数: |
5524 次 |
| 最近记录: |