jetty服务器的使用

 

1.jetty服务器的下载:

http://www.eclipse.org/jetty/previousversions.html

jetty对于jdk1.8支持到9.4版本,更高需要java11

左侧是win环境解压缩版,右侧是Linux解压缩版本。

2.下载后解压:

  目录介绍:

            -- bin                    存放Windows和linux等系统中使用的Jetty启动脚本和相关文件

            -- contexts            存放应用程序发布描述文件,里面有Jetty自带的示例文件

            -- distribution         关于发行构建的代码,正式环境可删除

            -- etc                    Jetty配置文件,后续章节会详细介绍

            -- examples            Jetty示例程序源代码,正式环境可删除

            -- extras                Jetty相关程序源代码,正式环境可删除

            -- javadoc              Jetty 核心代码的API文档,正式环境可删除

            -- jxr                     Jetty 其他相关程序API文档,正式环境可删除

            -- LICENSES            发行协议说明

            -- logs                   日志目录

            -- modules              Jetty相关模块程序源代码,正式环境可删除

            -- patches              jdk5的补丁文件描述,正式环境可删除

            -- project-website    maven产生的项目站点文档目录

            -- resources            如果存在该目录,jetty启动时会将该目录加入类路径,默认存放log4j配置文件

            -- webapps             存放web应用程序,默认情况下该目录下面的文件夹或者war文件将在jetty启动的时候被运行

            -- start.jar              启动Jetty引导java程序,可以在各个操作系统中使用它启动jetty服务

3.启动jetty(start.jar是启动的jar包)

根目录下,java -jar start.jar

4.修改端口:

./etc/jetty.xml中修改下面

然后在浏览器访问localhost即可。

2 在Maven中获取Jetty

Jetty的POM坐标如下

<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-project</artifactId>
  <version>${project.version}</version>
</dependency>

2.1 基础应用例子

  标准的Jetty应用,有一个demo-base的文件夹,可以不在$JETTY_HOME下运行Jetty,在demo-base文件夹下执行以下命令:

> cd $JETTY_HOME/demo-base/
> java -jar $JETTY_HOME/start.jar

现在可以通过浏览器访问 http://localhost:8080,  此时可以看到一个Jetty的欢迎页面,页面上包含几个简单的例子,欢迎页面如下

 

 你可以通过以下命令查看示例应用的配置信息 

> cd $JETTY_HOME/demo-base/
> java -jar $JETTY_HOME/start.jar --list-modules
...
 
> java -jar %JETTY_HOME/start.jar --list-config
...

--list-modules:此命令将返回当前服务所有可用的模块,同时也会显示本地的模块,信息包括模块实现的顺序,依赖模块以及相应的jar信息

--list-config:显示运行环境和配置文件等信息 

2.2 创建一个新的Jetty基目录

  demo-base目录是jetty.base的一个基目录,在Jetty9.1版本中新增加的。一个Jetty基目录允许配置和web应用分开部署,可以方便升级系统。Jetty默认的配置基于两个属性:

jetty.home:这个属性定义了Jetty的路径,jar包,默认模块和默认xml配置(典型有 start.jar,lib等)

jetty.base:这个属性表示一个特殊Jetty服务应用的路径,包括它的日志,配置和web应用(典型有 start.ini,start.d,logs和webapps)

  以下命令用于创建一个新的根路径,同时激活HTTP connector和web 应用部署模块,并且拷贝一个web应用例子来部署。

 

> JETTY_BASE=/tmp/mybase
> mkdir $JETTY_BASE
> cd $JETTY_BASE
> java -jar $JETTY_HOME/start.jar
 
WARNING: Nothing to start, exiting ...
 
Usage: java -jar start.jar [options] [properties] [configs]
java -jar start.jar --help # for more information
 
> java -jar $JETTY_HOME/start.jar --add-to-startd=http,deploy
 
INFO: server initialised (transitively) in ${jetty.base}/start.d/server.ini
INFO: http initialised in ${jetty.base}/start.d/http.ini
INFO: security initialised (transitively) in ${jetty.base}/start.d/security.ini
INFO: servlet initialised (transitively) in ${jetty.base}/start.d/servlet.ini
INFO: webapp initialised (transitively) in ${jetty.base}/start.d/webapp.ini
INFO: deploy initialised in ${jetty.base}/start.d/deploy.ini
MKDIR: ${jetty.base}/webapps
INFO: Base directory was modified
 
> cp $JETTY_HOME/demo-base/webapps/async-rest.war webapps/ROOT.war
> java -jar $JETTY_HOME/start.jar
 
2015-06-04 11:10:16.286:INFO::main: Logging initialized @274ms
2015-06-04 11:10:16.440:INFO:oejs.Server:main: jetty-9.3.0.v20150601
2015-06-04 11:10:16.460:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:///tmp/mybase/webapps/] at interval 1
2015-06-04 11:10:16.581:WARN::main: async-rest webapp is deployed. DO NOT USE IN PRODUCTION!
2015-06-04 11:10:16.589:INFO:oejw.StandardDescriptorProcessor:main: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
2015-06-04 11:10:16.628:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@1a407d53{/,[file:///tmp/jetty-0.0.0.0-8080-ROOT.war-_-any-4510228025526425427.dir/webapp/, jar:file:///tmp/jetty-0.0.0.0-8080-ROOT.war-_-any-4510228025526425427.dir/webapp/WEB-INF/lib/example-async-rest-jar-9.3.0.v20150601.jar!/META-INF/resources],AVAILABLE}{/ROOT.war}
2015-06-04 11:10:16.645:INFO:oejs.ServerConnector:main: Started ServerConnector@3abbfa04{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
2015-06-04 11:10:16.646:INFO:oejs.Server:main: Started @634ms

  以上命令是Linux下的命令,简单解释:创建一个JETTY_BASE环境变量,并创建指定的文件夹,在此文件夹下运行start.jar时提示没有可以启动的东西,系统退出。

       此时输入java -jar $JETTY_HOME/start.jar --add-to-startd=http,deploy命令为当前基目录添加标准文件及文件夹,然后java -jar $JETTY_HOME/start.jar运行即可运行成功。

 

在Windows下操作如下:

(1)可以手动创建一个空的文件夹,本例使用D:\temp\jetty

(2)在CMD中定位到当前目录下,输入java -jar D:\data\frame\jetty-distribution-9.3.11.v20160721\start.jar (注:D:\data\frame\jetty-distribution-9.3.11.v20160721目录为我的电脑Jetty目录,请输入本机Jetty目录)输出信息如下:

(3)输出结果同Linux,再次输入java -jar D:\data\frame\jetty-distribution-9.3.11.v20160721\start.jar --add-to-startd=http,deploy,输出信息如下:

 

(4)提示信息中说明创建了哪些文件,已经基目录被修改等信息,此时到新建的基目录下可以看到如下新增的东西:

jetty

    |-start.d

        |-deploy.ini

        |-http.ini

        |-server.ini

    |-webapps

(5)启动后,会同样看到404页面,也可同上面的方法,拷贝ROOT项目到当前基目录的webapps下

2.3 改变Jetty的端口

  通过在启动命令中设置jetty.http.port属性的值,可以让Jetty运行在修改后的端口上。

> cd $JETTY_BASE
> java -jar $JETTY_HOME/start.jar jetty.http.port=8081
...

  另外,可以将要设置的端口属性添加到start.ini或者start.d/http.ini文件中。默认情况,在start.d/http.ini文件中定义的jetty.http.port属性可以被修改成另一个值。

2.2.4 为HTTPS & HTTP2增加SSL

  可通过如下命令,添加并激活HTTPS和HTTP2模块

> java -jar $JETTY_HOME/start.jar --add-to-startd=https,http2

> java -jar $JETTY_HOME/start.jar

2015-06-04 13:52:01.933:INFO:oejs.ServerConnector:main: Started ServerConnector@6f1fba17{SSL,[ssl, alpn, h2, http/1.1]}{0.0.0.0:8443}

 

 --add-to-startd:此命令在ini文件中设置有效的配置信息,使HTTPS和HTTP2支持SSL连接

  输入java -jar $JETTY_HOME/start.jar --add-to-startd=https,http2命令后会提示下载一些jar包,输入y按回车,最终提示信息如下,说明操作成功:

 

2.2.5 修改Jetty的HTTPS端口

  你可以通过增加jetty.ssl.port启动参数来修改HTTPS的端口信息

> cd $JETTY_BASE
> java -jar $JETTY_HOME/start.jar jetty.ssl.port=8444

  除了在命令行增加参数的方法外,还可以在start.ini和start.d/*.ini文件中进行配置,所以如果用户使用--add-to-startd命令来使HTTPS生效,同样也可以在start.d/https.ini文件中进行修改。

2.2.6 更多的start.jar操作选项

  start.jar的工作是用来翻译命令行内容的,start.ini和start.d目录(包含其中的*.ini文件)生成一个classpath环境,各种属性和配置可以使用Jetty相应的xml进行配置,更多的使用方法可以通过使用命令来获得帮助。

> java -jar $JETTY_HOME/start.jar --help

2.3 部署Web应用

  Jetty支持热部署,可以自动部署webapps目录下的项目。标准的war文件和Jetty配置文件放置在webapps目录下,通过以下规则进行热部署

  • 例如一个包含 WEB-INF/ 子文件夹的example/文件夹做为一个标准的web应用进行部署,否则就按静态资源部署,context路径为/example(访问路径: http://localhost:8080/example/);若文件夹名字为ROOT,则访问路径为/;若文件夹名字末尾为.d则此文件夹被忽略(除非被特殊的配置文件引用)
  • 若一个文件example.war被部署在webapps下,则context路径为example/,如果名字为ROOT则访问路径为/,如果example.war文件和example/文件夹同时存在,只有war文件会被部署(这个文件会被当做一个没有被解压的目录来使用)
  • 一个像example.xml的配置文件,若文件中是标准的配置信息,也会被部署,文件中必须包含context path,如果context path和example.xml同时存在,只有example.xml会被部署。

  如果你有一个标准的web应用,可以直接将其拷贝到webapps文件夹下进行热部署。

2.3.1 Jetty示例Web Application

  demo-base/webapps文件下的项目包含如下部署和附加的的文件:

 

ROOT/:这个文件夹包含各种静态资源。包含Jetty欢迎页面,默认访问路径为/

test.d:一个包含附加配置文件的文件夹,被test.xml使用用来为test.war增加额外的配置

test.xml:一个context配置文件,用来配置和部署test.war,包含上下文环境和test.d里面的配置附加的配置信息

test.war:在test.xml里面配置的示例web程序

async-rest.war:一个异步示例的web应用程序

test-jaas.war:一个使用JAAS身份验证的web应用程序。

test-jaas.xml:用来配置test-jaas.war的配置文件

test-jndi.war:一个使用JNDI的示例应用

test-jndi.xml:用来配置test-jndi.war的配置文件

test-spec.war:一个使用注解,ServletContainerInitializers 和Servlet 3.0/3.1规范的示例应用

test-spec.xml:用来配置test-spec.war的配置文件

xref-proxy.war:使用代理的一个示例应用

example-moved.xml:一个演示MovedContextHandler重定向使用的示例应用

 

三、Jetty配置信息介绍

3.1如何配置jetty

3.1.1 Jetty POJO 配置

  Jetty的核心组件是POJO(Plain Old Java Objects),配置Jetty的过程就是实例化一个Jetty POJOs并对其进行配置的过程,可以通过如下实现:

  • 编写Java代码来直接实例化并配置Jetty对象,这称为嵌入式Jetty。
  • 使用Jetty的xml配置文件,这是一个控制反转框架模式,从xml文件中实例化Jetty对象。 etc/jetty.xml配置文件是Jetty的主要配置文件,但是也有很多etc/jetty-__feature__.xml类型的文件被Jetty使用
  • 使用第三方IOC框架,如Spring来实例化Jetty对象做为一个Spring Beans

  因为配置Jetty的主要方法是IoC,所以这个文档主要介绍此种方法。

3.1.2 Jetty启动配置文件

  Jetty使用如下配置文件来实例和启动一个服务,通过start.jar处理

ini files:

Jetty启动原理使用命令行,使用$JETTY_BASE/start.ini和$JETTY_BASE/start.d/*.ini文件来创建一个有效的命令参数参数如下:

  • 激活的模块  --module=name
  • 通过name=value的来为Jetty的IOC配置属性
  • XML files in Jetty IoC (or Spring) XML format
  • 一个标准的Java属性文件包含额外的启动属性
  • 其他start.jar选项(see java -jar start.jar --help)
  • 一些JVM参数组合通过--exec,例如-Xbootclasspath.

mod files:

$JETTY_HOME/modules/*.mod文件包含各个模块的定义,可以被--module=name命令激活,每个mod文件定义:

  • 模块依赖如何排序以及激活
  • 被模块需要并且要就在到classpath的jar包
  • 被模块需要并且内容会被执行的xml文件
  • 被激活模块需要的文件
  • 一个示例的ini文件,当被-add-to-start=name选项激活时使用

XML files:  

xml文件一般用与IoC以及spring使用,用在命令行或者模块定义中。xml文件里面的配置将被注入到描述服务的一个对象里。通常改变属性的方法是改变对应的ini文件。xml文件通常放在$JETTY_HOME/etc/下,但是新增的或者被编辑的xml应该被放在 $JETTY_BASE/etc/下,如果xml配置文件有修改的必要,最好的做法是在修改前将xml文件从$JETTY_HOME/etc拷贝到$JETTY_BASE/etc/ 。

下图是各种配置文件(ini, mod 和 XML)的关系

 

3.1.3 其它配置文件

  除了上面描述的配置文件以外,服务的配置信息可以使用如下的文件:

Context XML files:

  所有在/webapps目录下用来被IoC使用的xml文件,用来部署相应的模块,注入信息到HttpContext ,最终创建一个容器。这些可能是标准的web应用程序或定制上下文创建的特殊目的的处理器。

web.xml:

  web.xml用来定义和配置过滤器,servlet或者资源。Jetty WebAppContext组件使用这个XML文件用来:

  • 设置一个web项目的默认的根路径
  • 通过WEB-INF/web.xml进行特殊的配置
  • Interpret descriptor fragments included in the META-INF directory of Jar files within WEB-INF/lib.

Property Files:

  标准的Java配置文件,同样适用于Jetty配置:

  • 可以为Jetty IoC增加参数
  • 配置默认日志信息(StdErrLog),其他日志框架也可以通过配置被使用(例如,log4j)
  • 数据库的登录配置信息等 

3.1.4 Jetty IoC XML使用

  为了理解Jetty IOC XML使用方法,如下面的示例Java中,嵌入式Jetty服务器实例并配置

//
//  ========================================================================
//  Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
//  ------------------------------------------------------------------------
//  All rights reserved. This program and the accompanying materials
//  are made available under the terms of the Eclipse Public License v1.0
//  and Apache License v2.0 which accompanies this distribution.
//
//      The Eclipse Public License is available at
//      http://www.eclipse.org/legal/epl-v10.html
//
//      The Apache License v2.0 is available at
//      http://www.opensource.org/licenses/apache2.0.php
//
//  You may elect to redistribute this code under either of these licenses.
//  ========================================================================
//
package org.eclipse.jetty.embedded;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.servlet.ServletContextHandler;
public class ExampleServer
{
    public static void main( String[] args ) throws Exception
    {
        Server server = new Server();
        ServerConnector connector = new ServerConnector(server);
        connector.setPort(8080);
        server.setConnectors(new Connector[] { connector });
        ServletContextHandler context = new ServletContextHandler();
        context.setContextPath("/");
        context.addServlet(HelloServlet.class, "/hello");
        context.addServlet(AsyncEchoServlet.class, "/echo/*");
        HandlerCollection handlers = new HandlerCollection();
        handlers.setHandlers(new Handler[] { context, new DefaultHandler() });
        server.setHandler(handlers);
        server.start();
        server.join();
    }
}

 

注意事项:

  • 注意Jetty的最低使用的jdk版本,最新版本使用jdk1.8
  • HelloServlet是一个继承了HttpServlet的servlet
  • 运行成功后程序会被挂起,等待用户连接,在浏览器中输入http://localhost:8080/hello即可访问

  Jetty IoC XML format也允许用户通过XML来实例化应用服务而不用写任何代码(下面配置文件的具体使用方法以后会讲到)

 

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="ExampleServer" class="org.eclipse.jetty.server.Server">
  <Set name="connectors">
    <Array type="org.eclipse.jetty.server.Connector">
      <Item>
        <New class="org.eclipse.jetty.server.ServerConnector">
          <Arg><Ref refid="ExampleServer"/></Arg>
          <Set name="port">8080</Set>
        </New>
      </Item>
    </Array>
  </Set>
  <New id="context" class="org.eclipse.jetty.servlet.ServletContextHandler">
    <Set name="contextPath">/hello</Set>
    <Call name="addServlet">
      <Arg>org.eclipse.jetty.embedded.HelloServlet</Arg>
      <Arg>/</Arg>
    </Call>
  </New>
  <Set name="handler">
    <New class="org.eclipse.jetty.server.handler.HandlerCollection">
      <Set name="handlers">
        <Array type="org.eclipse.jetty.server.Handler">
          <Item>
            <Ref refid="context" />
          </Item>
          <Item>
            <New class="org.eclipse.jetty.server.handler.DefaultHandler" />
          </Item>
        </Array>
      </Set>
    </New>
  </Set>
</Configure>

 

 

3.2 可以在Jetty中配置什么

  这一节将介绍Jetty常用的配置。

3.2.1 配置服务

  Server实例是Jetty服务的重要组成部分,它为其它Jetty组件提供服务和生命周期管理。在标准的Jetty应用中,核心的配置信息在etc/jetty.xml文件中 ,但是你也可以在配置文件中添加其它配置 ,包括:

ThreadPool:

  服务器实例提供了一个默认ThreadPool实例,用来供其它组件调用。配置线程池的主要参数有最大和最小数量的设置,设置在start.ini文件或者start.d/server.ini文件中。

Handlers:

  一个Jetty服务器可以只有一个处理程序实例来处理传入的HTTP请求。然而一个处理程序可能是一个容器或包装其他处理程序形成一个树的处理程序。在etc/jetty.xml文件中配置的默认的处理程序包含处理程序集合和一个默认的处理程序,根据路径找到相应的处理程序,默认的处理器处理404错误。其他配置信息可以增加到处理树中(例如,jetty-rewrite.xml, jetty-requestlog.xml), 或者配置一个组件用于热部署处理(例如,jetty-deploy.xml) 。

Server Attributes:

  服务器可以通过字符串来映射到一个对象上,如果一个对象实现了LifeCycle接口,那么这个对象可以监听这个Jetty服务的启停。通常服务器的属性保存在服务器生命周期内。

Server fields:

  服务器也有一些特殊的的配置属性,配置在start.ini或者start.d/server.ini文件中,除了控制属性外还有发送时间和http响应的版本。

Connectors:

  服务器拥有一个连接的集合,用来接收http请求,和其它Jetty支持的协议请求,下一章节将要介绍配置连接。对于服务器可以设置所有的连接也可以增加或者删除个别连接。

Services:

  服务器能容纳额外的服务对象,有时作为属性,但经常做为有生命周期的bean。

3.2.2配置连接

  Jetty服务器连接器是一个网络端点接受连接一个或多个协议产生Jetty服务器的请求或消息。在标准Jetty服务器中,可以通过额外的文件增加Jetty服务器支持的协议,例如http.ini,https.ini 和jetty-http2.xml,连接的配置一般都是典型的,如下:

Port:

  监听TCP/IP连接请求的端口,使用jetty.http.port(或者jetty.ssl.port)属性进行配置,如果没有配置默认8080(TLS默认8443)。

Host:

  您可以配置一个主机的主机名或IP地址来识别一个特定的网络接口的监听。如果没有设置,或者设置为0.0.0.0,连接器将监听所有主机。可以通过xml文件中jetty.host的这个属性进行设置。

Idle Timeout:

  时间以毫秒为单位,一个连接的超时时间。

HTTP Configuration:

  通过HttpConfiguration 实例来配置HTTP连接(包含HTTP, HTTPS 和HTTP2),可以独立于特定的网络协议,标准的Jetty服务通过jetty.xml来配置一个单例的HttpConfiguration对象。

SSL Context Factory:

  通过本地的密钥来保证ssl连接的安全性。

3.2.3配置上下文环境

一个Jetty环境包含一组处理器处理指定路径的请求。一个Jetty环境可以包含默认处理器和用户自定义处理器。

Note

servlet规范定一个web应用。在Jetty规范中一个标准的web项目必须有一个标准的WEB-INF/web.xml文件,用来配置classpath,资源,session处理,登录,以及servlet,jsp,以及静态资源。标准的web应用需要很少的额外的配置文件。

常见的上下文配置:

contextPath:

  contextPath 是URL的前缀。例如一个contextPath 是/foo,它将处理 /foo, /foo/index.html, /foo/bar/,and /foo/bar/image.png等请求,但是它不会处理像/,/other/,or /favicon.ico这样的请求,若contextPath是/,则为根contextPath。contextpath可以被默认设置(默认为部署的文件名),也可以在xml里面或者代码里面进行设置,或者在WEB-INF/jetty-web.xml文件中设置。

virtualHost:

  配置监听主机ip或名称,没有配置的将不会被监听到。

classPath:

  配置类路径,标准的类路径为 WEB-INF/lib和WEB-INF/classes ,也可以增加额外的路径到classpath下。

attributes:

  配置属性,可以传递到实体类中,比如javax.servlet.context.tempdir属性用来配置临时目录。

resourceBase:

  配置资源,这个配置是一个目录,包含各种静态资源信息,可以是图片或者HTML页面。

3.2.3.1 通过API配置上下文

在嵌入式的server,用户可以通过ContextHandler API来配置上下文,示例如下:

//
//  ========================================================================
//  Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
//  ------------------------------------------------------------------------
//  All rights reserved. This program and the accompanying materials
//  are made available under the terms of the Eclipse Public License v1.0
//  and Apache License v2.0 which accompanies this distribution.
//
//      The Eclipse Public License is available at
//      http://www.eclipse.org/legal/epl-v10.html
//
//      The Apache License v2.0 is available at
//      http://www.opensource.org/licenses/apache2.0.php
//
//  You may elect to redistribute this code under either of these licenses.
//  ========================================================================
//
package org.eclipse.jetty.embedded;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
public class OneContext
{
    public static void main( String[] args ) throws Exception
    {
        Server server = new Server( 8080 );
        // Add a single handler on context "/hello"
        ContextHandler context = new ContextHandler();
        context.setContextPath( "/hello" );
        context.setHandler( new HelloHandler() );
        // Can be accessed using http://localhost:8080/hello
        server.setHandler( context );
        // Start the server
        server.start();
        server.join();
    }
}

 

3.2.3.2 通过Ioc XML配置上下文

  用户可以创建一个IoC的XML(或使用spring的Jetty插件)

<?xml version="1.0"  encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC
    "-//Mort Bay Consulting//DTD Configure//EN"
    "http://www.eclipse.org/jetty/configure_9_0.dtd">
<!--
  Configure a custom context for serving javadoc as static resources
-->
<Configure class="org.eclipse.jetty.server.handler.ContextHandler">
  <Set name="contextPath">/javadoc</Set>
  <Set name="resourceBase"><SystemProperty name="jetty.home" default="."/>/javadoc/</Set>
  <Set name="handler">
    <New class="org.eclipse.jetty.server.handler.ResourceHandler">
      <Set name="welcomeFiles">
        <Array type="String">
          <Item>index.html</Item>
        </Array>
      </Set>
      <Set name="cacheControl">max-age=3600,public</Set>
    </New>
  </Set>
</Configure>

 

3.2.4 配置web应用

servlet规范定义了一个web应用程序,当调用打包为一个WAR文件(web应用程序存档),Jetty通过如下进行配置:

  • 初始化classpath,在WEB-INF/lib和WEB-INF/classes下。
  • 根据标准的WEB-INF/web.xml进行解析初始化参数,过滤器,监听器,欢迎页面等信息。
  • WEB-INF/jetty-web.xml文件可能包含Jetty IoC的配置。

3.2.4.1 配置contextpath

  可以增加一个WEB-INF/jetty-web.xml文件用来配置classpath

<?xml version="1.0"  encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC
    "-//Mort Bay Consulting//DTD Configure//EN"
    "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/contextpath</Set>
</Configure>

 

   还有一种做法是,不用增加配置文件,在war文件同目录,建一个同名的xml文件,内容如下:

 

<?xml version="1.0"  encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC
    "-//Mort Bay Consulting//DTD Configure//EN"
    "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/test.war</Set>
  <Set name="contextPath">/test</Set>
</Configure>

 

   配置例子可以参照$JETTY_HOME/webapps/test.xml

3.2.4.2 Web应用部署

Jetty能够部署各种Web应用程序的格式。这是通过 扫描${jetty.base}/webapps 文件夹下

一个Context可以有如下

  • 一个标准的war文件(必须以war结尾)
  • 一个标准的web应用(必须有{dir}/WEB-INF/web.xml 文件)
  • 一个包含静态资源的文件夹
  • 一个Jetty描述XML,引用一个web应用

新WebAppProvider将试图避免双重部署,以及其他需要注意的方面,如下:

  • 隐藏文件将被忽略(以.开头的文件)
  • 以.d开头的文件夹将被忽略
  • 如果一个文件夹和war名字一样,则只有war会部署
  • 如果一个文件夹和同名xml配置,则xml配置的会被部署
  • 如果一个war文件和xml文件同名,则xml配置的会被部署

3.2.4.3 设置身份验证区域

  身份验证方法和域名校验可以在web.xml里面进行描述:

...
<login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>Test Realm</realm-name>
</login-config>
...

   这个例子使用名为Test Realm.的验证,但是没有说明其是怎么实现的,在Jetty中有几种实现方式,其中一种是HashLoginService可以读取登录用户,并在配置文件中查找,为了配置HashLoginService用来匹配Test Realm,可以配置$JETTY_BASE/etc/test-realm.xml文件,并且该文件必须在start.ini或者start.d/server.ini中设置。

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
    <!-- =========================================================== -->
    <!-- Configure Authentication Login Service                      -->
    <!-- Realms may be configured for the entire server here, or     -->
    <!-- they can be configured for a specific web app in a context  -->
    <!-- configuration (see $(jetty.home)/webapps/test.xml for an    -->
    <!-- example).                                                   -->
    <!-- =========================================================== -->
    <Call name="addBean">
      <Arg>
        <New class="org.eclipse.jetty.security.HashLoginService">
          <Set name="name">Test Realm</Set>
          <Set name="config"><Property name="jetty.demo.realm" default="etc/realm.properties"/></Set>
          <Set name="refreshInterval">0</Set>
        </New>
      </Arg>
    </Call>
    <Get class="org.eclipse.jetty.util.log.Log" name="rootLogger">
      <Call name="warn"><Arg>demo test-realm is deployed. DO NOT USE IN PRODUCTION!</Arg></Call>
    </Get>
</Configure>

   通过创建和配置LoginService到web应用中,当部署应用时,会通过名字去寻找匹配的登录Service。 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jetty 是一个流行的 Java Web 服务器和 Servlet 容器,它也提供了对 WebSocket 的支持。下面是一个简单的示例,展示了如何在 Jetty使用 WebSocket: 1. 首先,确保你已经在项目中添加了 Jetty 的依赖。可以通过 Maven 或者其他构建工具来添加依赖。这里以 Maven 为例,在 pom.xml 文件中添加以下代码: ```xml <dependencies> <dependency> <groupId>org.eclipse.jetty.websocket</groupId> <artifactId>websocket-server</artifactId> <version>xxx</version> </dependency> </dependencies> ``` 请将 `xxx` 替换为你所需的 Jetty 版本号。 2. 创建一个 WebSocketHandler 类来处理 WebSocket 请求。这个类需要继承自 Jetty 的 `WebSocketHandler` 类,并实现 `onWebSocketConnect`、`onWebSocketText` 和 `onWebSocketClose` 方法。例如: ```java import org.eclipse.jetty.websocket.api.*; import org.eclipse.jetty.websocket.api.annotations.*; import org.eclipse.jetty.websocket.server.*; @WebSocket public class MyWebSocketHandler extends WebSocketHandler { @Override public void configure(WebSocketServletFactory factory) { factory.register(MyWebSocketHandler.class); } @OnWebSocketConnect public void onConnect(Session session) { // 连接建立时触发 } @OnWebSocketText public void onText(Session session, String message) { // 接收到文本消息时触发 } @OnWebSocketClose public void onClose(Session session, int statusCode, String reason) { // 连接关闭时触发 } } ``` 3. 创建一个 Jetty 服务器并配置 WebSocketHandler。例如: ```java import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.HandlerList; public class WebSocketServer { public static void main(String[] args) throws Exception { Server server = new Server(8080); WebSocketHandler webSocketHandler = new MyWebSocketHandler(); HandlerList handlers = new HandlerList(); handlers.addHandler(webSocketHandler); server.setHandler(handlers); server.start(); server.join(); } } ``` 4. 启动服务器,你的 WebSocket 服务就可以在 `ws://localhost:8080/` 上监听连接请求并处理消息了。 这只是一个简单的示例,你还可以根据自己的需求进行更复杂的定制和扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值