【问题标题】:Grizzly 2.2.19 FilterChain vs HttpHandlerGrizzly 2.2.19 FilterChain 与 HttpHandler
【发布时间】:2014-01-07 04:33:17
【问题描述】:

我正在尝试实现一个简单的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的响应。

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

提前谢谢你!

【问题讨论】:

  • 你能解释一下为什么你觉得你需要自定义过滤链吗?在继续之前,我想更好地了解您要完成的工作。
  • 我需要过滤器链来添加分块编码支持

标签: java servlets soapui grizzly


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    所以,简而言之,你的 HttpHandler 没有被调用的原因是你破坏了默认安装的提供 HttpHandler 支持的 FilterChain。

    就分块编码支持而言,已经为您提供了。如果在提交响应时尚未设置内容长度,则响应将使用分块传输编码。

    【讨论】:

    • 我希望是这样,每当我提交 1.1 请求时,我都会不断收到分块编码错误。这就是我尝试添加 ChunkedInputFilter 的原因。
    • 我建议记录一个问题java.net/jira/browse/GRIZZLY。如果您可以通过 Dropbox 或其他共享服务(禁用 JIRA 附件)链接测试用例,我们可以帮助您。
    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 2011-03-31
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2011-01-22
    相关资源
    最近更新 更多