客户端的Netty HTTP认证 [英] Netty HTTP Authetication for Client

查看:148
本文介绍了客户端的Netty HTTP认证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

看看我在下面编写的测试代码. 我使用纯Java设置了Authenticator,并进行URI调用以获取一些xml数据并将其转换为对象.

Look at the test code I have written below. Using pure java I set an Authenticator and make a URI call to get some xml data and convert it to an object.

我编写了以下代码来测试 hotpotato (净值)与纯Java(无流水线)的性能

I wrote the code below to test performance of hotpotato (netty) vs. pure java (no pipelining).

问题是,我无法弄清楚如何使用hotpotato或netty对请求进行身份验证,其中任何一个的代码都是可以接受的,我只想测试性能差异(即查看在5秒钟内将执行多少个请求)

The trouble is, I can't figure out how to Authenticate my request with hotpotato or netty, code for either is acceptable, I just want to test the performance diff (i.e. see how many requests will be performed in 5 seconds).

    public static void main(String[] args) throws Exception {
        Authenticator.setDefault(new MyAuthenticator("DummyUser", "DummyPassword"));

        int timeToTestFor = 5000; //5 seconds;
        int count = 0;
        System.out.println("Start time");
        long starttime = System.currentTimeMillis();
        do {
            URL url = new URL(
                    "http://example.com/rest/GetData.ashx?what=pizza&where=new%20york&visitorId=12345&sessionId=123456");

            SearchResultsDocument doc = SearchResultsDocument.Factory.parse(url);
            count++;
        } while (System.currentTimeMillis() - starttime < timeToTestFor);
        System.out.println("DONE Total count=" + count);

        System.out.println("Netty/Hotpotatoe Start time");
        count = 0;
        starttime = System.currentTimeMillis();
        do {
            // Create & initialise the client
            HttpClient client = new DefaultHttpClient();
            client.init();


            // Setup the request
            HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_0,
                    HttpMethod.GET, "/rest/GetData.ashx?what=pizza&where=new%20york&visitorId=12345&sessionId=123456");

            // Execute the request, turning the result into a String
            HttpRequestFuture future = client.execute("example.com", 80, request,
                    new BodyAsStringProcessor());
            future.awaitUninterruptibly();
            // Print some details about the request
            System.out.println("A >> " + future);

            // If response was >= 200 and <= 299, print the body
            if (future.isSuccessfulResponse()) {
                System.out.println("B >> "+future.getProcessedResult());
            }

            // Cleanup
            client.terminate();
            count++;
        } while (System.currentTimeMillis() - starttime < timeToTestFor);
        System.out.println("DONE Total count=" + count);
    }

推荐答案

这里是仅对Netty使用基本身份验证的有效示例.已在Jetty上测试为服务器,需要基本身份验证.

Here is working example of using basic authentication with Netty only. Tested with Jetty as a server requiring basic authentication.

import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
import org.jboss.netty.handler.codec.base64.Base64;
import org.jboss.netty.handler.codec.http.DefaultHttpRequest;
import org.jboss.netty.handler.codec.http.HttpChunkAggregator;
import org.jboss.netty.handler.codec.http.HttpClientCodec;
import org.jboss.netty.handler.codec.http.HttpHeaders;
import org.jboss.netty.handler.codec.http.HttpMethod;
import org.jboss.netty.handler.codec.http.HttpResponse;
import org.jboss.netty.handler.codec.http.HttpVersion;
import org.jboss.netty.util.CharsetUtil;

public class BasicAuthTest {
private static final int PORT = 80;
private static final String USERNAME = "";
private static final String PASSWORD = "";
private static final String URI = "";
private static final String HOST = "";

public static void main(String[] args) {

    ClientBootstrap client = new ClientBootstrap(
            new NioClientSocketChannelFactory(
                    Executors.newCachedThreadPool(),
                    Executors.newCachedThreadPool()));

    client.setPipelineFactory(new ChannelPipelineFactory() {

        @Override
        public ChannelPipeline getPipeline() throws Exception {
            ChannelPipeline pipeline = Channels.pipeline();
            pipeline.addLast("codec", new HttpClientCodec());
            pipeline.addLast("aggregator", new HttpChunkAggregator(5242880));
            pipeline.addLast("authHandler", new ClientMessageHandler());
            return pipeline;
        }
    });

    DefaultHttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, URI);

    request.addHeader(HttpHeaders.Names.HOST, HOST);

    String authString = USERNAME + ":" + PASSWORD;
    ChannelBuffer authChannelBuffer = ChannelBuffers.copiedBuffer(authString, CharsetUtil.UTF_8);
    ChannelBuffer encodedAuthChannelBuffer = Base64.encode(authChannelBuffer);
    request.addHeader(HttpHeaders.Names.AUTHORIZATION, encodedAuthChannelBuffer.toString(CharsetUtil.UTF_8));

    client.connect(new InetSocketAddress(HOST, PORT)).awaitUninterruptibly().getChannel()
            .write(request).awaitUninterruptibly();

}

public static class ClientMessageHandler extends SimpleChannelHandler {
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
        e.getCause().printStackTrace();
    }

    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
        HttpResponse httpResponse = (HttpResponse) e.getMessage();
        String json = httpResponse.getContent().toString(CharsetUtil.UTF_8);
        System.out.println(json);
    }
}

}

这篇关于客户端的Netty HTTP认证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆