2019独角兽企业重金招聘Python工程师标准>>> hot3.png

嵌入式jetty

发表于 七月 3, 2012 forest

本文主要讲述如何使用嵌入式jetty,创建http/https服务器.

一.   相关jar包

Jetty-server
Jetty-servlet

二.创建方式

2.1)最简单的

1
2
3
Server server =newServer(8080);
server.start();
server.join();

创建一个jetty server,并启动,这样我们就创建了一个最简单的http服务器,检查8080端口为监听状态, 但是很明显,该服务器不会对客户端请求有任何响应.

2.2)HANDLER

1)实现

从实现上来看, jetty server本身就是一个HandlerWrapper, 可以通过为server设置handler,处理客户端的请求.

1
2
3
4
Server server =newServer(8080);
server.setHandler(newHelloHandler());
server.start();
server.join();

通过扩展AbstractHandler类, 实现handle方法, 定义用户自己的handler, 例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
publicclassHelloHandlerextendsAbstractHandler {
publicvoidhandle(String target, Request baseRequest,
HttpServletRequest request, HttpServletResponse response)
throwsIOException, ServletException {
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
response.getWriter().println("</pre>
<h1>Hello World</h1>
<pre>
");
}
}

2)测试

浏览器上输入:

http://localhost:8080

输出:

<h1>Hello World</h1>

2.3) SERVLET

直接为Server设置Handler,我们无法针对不同的URL Path,完成不同的处理逻辑, 例如,
当浏览器输入如下URL时,服务器区别处理:

http://localhost:8080/*http://localhost:8080/TYPE1/*http://localhost:8080/TYPE2/*

1)实现

Server添加ServletContextHandler,然后,针对不同的path, 设置对应的Servlet来处理.

1
2
3
4
5
6
7
8
9
10
11
12
Server server =newServer(8080);
ServletContextHandler context =newServletContextHandler(
ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);
context.addServlet(newServletHolder(newHelloServlet()),"/*");
context.addServlet(newServletHolder(newHelloServlet(
"TYPE1 Request")),"/TYPE1/*");
context.addServlet(newServletHolder(newHelloServlet(
"TYPE2 Request")),"/TYPE2/*");
server.start();
server.join();

通过扩展HttpServlet,覆盖doPost或者doGet方法,定义用户自己的Servlet,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
publicclassHelloServletextendsHttpServlet {
String greeting ="Hello";
publicHelloServlet() {
}
publicHelloServlet(String hi) {
greeting = hi;
}
@Override
protectedvoiddoGet(HttpServletRequest request,
HttpServletResponse response)throwsServletException, IOException {
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("</pre>
<h1>” + greeting + "</h1>
<pre>
");
}
@Override
protectedvoiddoPost(HttpServletRequest request,
HttpServletResponse response)throwsServletException, IOException {
doGet(request, response);
}
}

2)测试

浏览器上输入:

http://localhost:8080/*http://localhost:8080/TYPE1/*http://localhost:8080/TYPE2/*

分别输出:

<h1>Hello</h1><h1> TYPE1 Request</h1><h1> TYPE2 Request<h1>

2.3)Connector

http/https服务器也可以同时在多个端口上提供服务, 这就需要引入Connector

1)实现

如下代码就设置了两个Connector, 一个使用8080端口,另一个使用8888端口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Server server =newServer();
SelectChannelConnector connector0 =newSelectChannelConnector();
connector0.setPort(8080);
connector0.setMaxIdleTime(30000);
connector0.setRequestHeaderSize(8192);
SelectChannelConnector connector1 =newSelectChannelConnector();
connector1.setPort(8888);
connector1.setMaxIdleTime(30000);
connector1.setRequestHeaderSize(8192);
server.setConnectors(newConnector[] { connector0,
connector1 });
server.setHandler(newHelloHandler());
server.start();
server.join();

2)测试

浏览器上输入:

http://localhost:8080/*

或者

http://localhost:8888/*

三.https服务器

本节着重讲述如何创建https服务器.

3.1)KEYSTORE

使用keytool命令,创建keystore. 例如:

keytool -keystore zenithKS -alias zenith -genkey -keyalg RSA
Enter keystore password:
Re-enter new password:
What is your first and last name?[Unknown]:  zenithWhat is the name of your organizational unit?[Unknown]:  zenithWhat is the name of your organization?[Unknown]:  zenithWhat is the name of your City or Locality?[Unknown]:  bjWhat is the name of your State or Province?[Unknown]:  bjWhat is the two-letter country code for this unit?[Unknown]:  cnIs CN=zenith, OU=zenith, O=zenith, L=bj, ST=bj, C=cn correct? (type "yes" or "no")[no]:  yesEnter key password for <zenith>:(RETURN if same as keystore password):

需要用户输入keystore密码以及key密码,最后,会在当前目录下生成一个zenithKS文件,这就是keystore文件

3.2)SSL CONNECTOR

为jetty Server设置ssl Connector,需要指定keystore路径, keystore密码以及key密码.

1
2
3
4
5
6
7
8
9
10
Server server =newServer();
SslSelectChannelConnector ssl_connector =newSslSelectChannelConnector();
ssl_connector.setPort(8443);
SslContextFactory cf = ssl_connector.getSslContextFactory();
cf.setKeyStore("D:\\keystores\\zenithKS");
cf.setKeyStorePassword("password");
cf.setKeyManagerPassword("password");
server.addConnector(ssl_connector);
server.start();
server.join();

浏览器上输入:

https://localhost:8443/*

3.3)HTTPS客户端

HttpClient提供了对SSL的支持, 以下通过扩展HttpClient类实现自动接受证书.

因为这种方法自动接收所有证书,因此存在一定的安全问题,所以在使用这种方法前请仔细考虑您的系统的安全需求。具体的步骤如下:

1) 提供一个自定义的socket factory(test.MySecureProtocolSocketFactory)。这个自定义的类必须实现接口

org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory

在实现接口 的类中调用自定义的

X509TrustManager(test.MyX509TrustManager)

这两个类可以在随本文带的附件中得到

2) 创建一个org.apache.commons.httpclient.protocol.Protocol的实例,指定协议名称和默认的端口号

Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory (), 443);

3) 注册刚才创建的https协议对象

Protocol.registerProtocol("https ", myhttps);

4) 然后按照普通编程方式打开https的目标地址

代码下载:

source

具体请参考:

http://www.blogjava.net/happytian/archive/2007/01/18/94553.html

四.参考资料

http://download.eclipse.org/jetty/stable-7/xref/org/eclipse/jetty/embedded/package-summary.html
http://docs.codehaus.org/display/JETTY/How+to+configure+SSL

此条目是由  forest 发表在  J2EE、 Jetty、 编码技巧 分类目录的。将 固定链接加入收藏夹。

转载于:https://my.oschina.net/u/725800/blog/406684

嵌入式jetty --- 转载相关推荐

  1. 嵌入式jetty的HTTP实现

    http://www.cnblogs.com/zzt-lovelinlin/p/5275168.html 2.1 简单HTTP实现 2.1.1 HTTP SERVER端实现 2.1.1.1 HTTP ...

  2. Jetty实战之 嵌入式Jetty运行web app

    Jetty实战之 嵌入式Jetty运行web app 博客分类: 应用服务器 jettywar  转载地址:http://blog.csdn.net/kongxx/article/details/72 ...

  3. 在嵌入式Jetty(Embedded Jetty)中部署FastCGI Servlet载入PHP程序

    这段时间由于服务器架构,需要研究在Java基础上的Jetty中部署PHP程序(Wordpress,Discuz) 在网上查了很多资料,都是用httpd或者nginx当前段Web Server,Jett ...

  4. jetty嵌入式容器_嵌入式Jetty和Apache CXF:借助Spring Security来保护REST服务

    jetty嵌入式容器 最近,我遇到了一个非常有趣的问题,我认为这只需要几分钟就可以解决:在Linux中使用Spring Security (当前稳定版本3.2.5 )保护Apache CXF (当前版 ...

  5. 嵌入式Jetty和Apache CXF:借助Spring Security来保护REST服务

    最近,我遇到了一个非常有趣的问题,我认为这只花了我几分钟就解决了:在Windows Server 2003中使用Spring Security (当前稳定版本3.2.5 )保护Apache CXF ( ...

  6. 嵌入式心得 (转载)

    学习有捷径吗?俺认为是有的,正确的道路就是捷径.     就好象是爬山,如果有导游图,那就能找到一条最正确的路线:如果没有导游图,自己瞎琢磨,东问西问,也未必能找到最佳的路线.     有时候回首前尘 ...

  7. rome rss_RSS阅读器使用:ROME,Spring MVC,嵌入式Jetty

    rome rss 在这篇文章中,我将展示一些创建Spring Web应用程序的指南,这些应用程序使用Jetty并使用名为ROME的外部库运行RSS来运行它. 一般 我最近创建了一个示例Web应用程序, ...

  8. RSS阅读器使用:ROME,Spring MVC,嵌入式Jetty

    在这篇文章中,我将展示一些创建Spring Web应用程序的准则,使用Jetty以及使用名为ROME的外部库运行RSS来运行它. 一般 我最近创建了一个示例Web应用程序,充当RSS阅读器. 我想检查 ...

  9. jetty 配置jndi_使用Jetty设置JNDI(嵌入式)

    jetty 配置jndi 我在开发工作区上运行嵌入式Jetty,从而节省了一些恶性的编译和部署周期. 我与Jetty的合作不多,易用性使我着迷于它. 我需要设置JNDI才能检索与数据库相关的活动的连接 ...

最新文章

  1. 设计模式之单例模式学习笔记
  2. 如何估算大型项目的工作量
  3. 12个python编程代码_Python大牛私藏的20个python代码,短小精悍,用处无穷
  4. Linux x64 下 Matlab R2013a 300 kb 脚本文件调试的 CPU 占用过高问题的解决办法
  5. GNU C中x++是原子操作吗?
  6. gRPC in ASP.NET Core 3.x - gRPC 消息定义
  7. prove, verify, bear out, demonstrate, confirm, validate, testify, certify 的区别
  8. 取得程序运行的目录[360度]
  9. 吃奶酪(洛谷-P1433)
  10. java 线程的销毁_Java如何检查线程组是否已被销毁?
  11. 目前人工智能的主要研究方向是哪些?
  12. centos7 安装openocd
  13. Linux虚拟机远程连接工具
  14. COLMAP简明教程 重建 转化深度图 导出相机参数 导入相机参数 命令行
  15. NPOI导出真正的电子表格,支持 自定义多行表头(表头风格设置),支持多个sheet页面导出
  16. 计算机大赛的英语怎么说,最全英语奖项 比赛名称翻译.doc
  17. 2023编程语言趋势
  18. 王爽汇编语言 实验15
  19. 草根堂家教中介系统源码
  20. 女生挖别人家男朋友大攻略

热门文章

  1. spring secrity(二)
  2. 逸鹏说道:漫漫人生路
  3. python3 urllib
  4. 分布式TCP压力测试工具 tcpcopy
  5. maven引入本地jar包
  6. 并发基础(一):Executor
  7. 在symfony2项目中100%提升doctrine的性能
  8. PingingLab传世经典系列《CCNA完全配置宝典》-2.5 RIPv2基本配置
  9. 算法分析结课总结--回溯算法
  10. BinaryTree-学习二叉树的Python库