嵌入式jetty --- 转载
2019独角兽企业重金招聘Python工程师标准>>>
嵌入式jetty
本文主要讲述如何使用嵌入式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 --- 转载相关推荐
- 嵌入式jetty的HTTP实现
http://www.cnblogs.com/zzt-lovelinlin/p/5275168.html 2.1 简单HTTP实现 2.1.1 HTTP SERVER端实现 2.1.1.1 HTTP ...
- Jetty实战之 嵌入式Jetty运行web app
Jetty实战之 嵌入式Jetty运行web app 博客分类: 应用服务器 jettywar 转载地址:http://blog.csdn.net/kongxx/article/details/72 ...
- 在嵌入式Jetty(Embedded Jetty)中部署FastCGI Servlet载入PHP程序
这段时间由于服务器架构,需要研究在Java基础上的Jetty中部署PHP程序(Wordpress,Discuz) 在网上查了很多资料,都是用httpd或者nginx当前段Web Server,Jett ...
- jetty嵌入式容器_嵌入式Jetty和Apache CXF:借助Spring Security来保护REST服务
jetty嵌入式容器 最近,我遇到了一个非常有趣的问题,我认为这只需要几分钟就可以解决:在Linux中使用Spring Security (当前稳定版本3.2.5 )保护Apache CXF (当前版 ...
- 嵌入式Jetty和Apache CXF:借助Spring Security来保护REST服务
最近,我遇到了一个非常有趣的问题,我认为这只花了我几分钟就解决了:在Windows Server 2003中使用Spring Security (当前稳定版本3.2.5 )保护Apache CXF ( ...
- 嵌入式心得 (转载)
学习有捷径吗?俺认为是有的,正确的道路就是捷径. 就好象是爬山,如果有导游图,那就能找到一条最正确的路线:如果没有导游图,自己瞎琢磨,东问西问,也未必能找到最佳的路线. 有时候回首前尘 ...
- rome rss_RSS阅读器使用:ROME,Spring MVC,嵌入式Jetty
rome rss 在这篇文章中,我将展示一些创建Spring Web应用程序的指南,这些应用程序使用Jetty并使用名为ROME的外部库运行RSS来运行它. 一般 我最近创建了一个示例Web应用程序, ...
- RSS阅读器使用:ROME,Spring MVC,嵌入式Jetty
在这篇文章中,我将展示一些创建Spring Web应用程序的准则,使用Jetty以及使用名为ROME的外部库运行RSS来运行它. 一般 我最近创建了一个示例Web应用程序,充当RSS阅读器. 我想检查 ...
- jetty 配置jndi_使用Jetty设置JNDI(嵌入式)
jetty 配置jndi 我在开发工作区上运行嵌入式Jetty,从而节省了一些恶性的编译和部署周期. 我与Jetty的合作不多,易用性使我着迷于它. 我需要设置JNDI才能检索与数据库相关的活动的连接 ...
最新文章
- 设计模式之单例模式学习笔记
- 如何估算大型项目的工作量
- 12个python编程代码_Python大牛私藏的20个python代码,短小精悍,用处无穷
- Linux x64 下 Matlab R2013a 300 kb 脚本文件调试的 CPU 占用过高问题的解决办法
- GNU C中x++是原子操作吗?
- gRPC in ASP.NET Core 3.x - gRPC 消息定义
- prove, verify, bear out, demonstrate, confirm, validate, testify, certify 的区别
- 取得程序运行的目录[360度]
- 吃奶酪(洛谷-P1433)
- java 线程的销毁_Java如何检查线程组是否已被销毁?
- 目前人工智能的主要研究方向是哪些?
- centos7 安装openocd
- Linux虚拟机远程连接工具
- COLMAP简明教程 重建 转化深度图 导出相机参数 导入相机参数 命令行
- NPOI导出真正的电子表格,支持 自定义多行表头(表头风格设置),支持多个sheet页面导出
- 计算机大赛的英语怎么说,最全英语奖项 比赛名称翻译.doc
- 2023编程语言趋势
- 王爽汇编语言 实验15
- 草根堂家教中介系统源码
- 女生挖别人家男朋友大攻略