gpt4 book ai didi

java - Grizzly 2.2.19 FilterChain 与 HttpHandler

转载 作者:太空宇宙 更新时间:2023-11-04 07:08:37 24 4
gpt4 key购买 nike

我正在尝试实现一个简单的 Grizzly Web 服务器在收到 HTTP 请求后将:

  • 处理指定的过滤器
  • 将请求回传给发送者

我正在从soapUI提交请求,并看到了我不期望的行为:

RunServer.java:

public class RunServer{
public static final String HOST = "localhost";
public static final int PORT = 5151;

public static void main(String[] args) {
final HttpServer server = HttpServer.createSimpleServer();

NetworkListener listener = new NetworkListener("echoCalls", "localhost", 5151);

FilterChainBuilder filterChainBuilder = FilterChainBuilder.stateless();

filterChainBuilder.add(new TransportFilter());

filterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));
//filterChainBuilder.add(new StringFilter(Charset.forName("ISO-8859-1")));
//filterChainBuilder.add(new StringFilter(Charset.forName("ASCII")));

filterChainBuilder.add(new MyEchoFilter());

listener.setFilterChain(filterChainBuilder.build());

server.addListener(listener);

server.getServerConfiguration().addHttpHandler(new MyEchoHandler(), "/echo");

try{
server.start();
System.out.println("Press any key to stop the server...");
System.in.read();
}catch(IOException ioe){
System.err.println(ioe.toString());
}finally{
server.stop();
}

}

}

MyEchoFilter.java:

public class MyEchoFilter extends BaseFilter{

public NextAction handleRead(FilterChainContext ctx)throws IOException{

System.err.println(">>>MyEchoFilter.handleRead()...");

//|why not working? no response, eventual time out. soapui just hangs up after return NextAction...

final Object peerAddress = ctx.getAddress();
final Object message = ctx.getMessage();
ctx.write(peerAddress, message, null);

return ctx.getStopAction();
}

public NextAction handleWrite(FilterChainContext ctx) throws IOException{
System.err.println(">>>MyEchoFilter.handleWrite()...");

return ctx.getStopAction();
}

public NextAction handleConnect(FilterChainContext ctx) throws IOException{
System.err.println(">>>MyEchoFilter.handleConnect()...");

return ctx.getStopAction();
}

public NextAction handleAccept(FilterChainContext ctx) throws IOException{
System.err.println(">>>MyEchoFilter.handleAccept()...");

return ctx.getStopAction();
}

public NextAction handleClose(FilterChainContext ctx) throws IOException{
System.err.println(">>>MyEchoFilter.handleClose()...");

return ctx.getStopAction();
}

}

MyEchoHandler:

public class MyEchoHandler extends HttpHandler{

public void service(Request req, Response res) throws Exception{

System.err.println(">>>handler service method...");

BufferedReader requestStream = new BufferedReader(new InputStreamReader(req.getInputStream()));

String reqStrLn;
StringBuffer callContent = new StringBuffer();
while((reqStrLn = requestStream.readLine()) != null) callContent.append(reqStrLn);

res.setContentLength(callContent.length());
res.getWriter().write(callContent.toString());
}
}

按照上面的代码,handleAccept() 方法会在启动soapUI 请求时被触发。奇怪的是,handleRead() 方法不会触发,除非我在 RunServer 中注释掉 UTF-8 字符串过滤器:

//filterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));

我不太明白,如果有人能解释一下,我将不胜感激。

但是,更重要的是,MyEchoHandler 中的 service() 方法也不会触发。

只有当我在 RunServer 中注释掉将 FilterChain 设置为 NetworkListener 的行时才会触发:

//listener.setFilterChain(filterChainBuilder.build());

当我确实避免使用FilterChain时,我实际上确实得到了soapUI的响应,但我确实需要FilterChain。

看起来我在这里遗漏了部分要点,即我应该避免使用处理程序,而支持使用过滤器,但在使用过滤器时我无法获得对soapUI的响应。

谁能帮我找出我的方法的错误吗?

提前谢谢您!

最佳答案

我也遇到了这个问题,我花了很长时间才弄清楚。

filterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));

StringFilter 将字符串解码/编码为字节,因此使用特殊的长度前缀。如果传入的消息无法解码,它将被跳过。因此,看起来“handleRead”方法没有触发。

关于java - Grizzly 2.2.19 FilterChain 与 HttpHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20963970/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com