使用jetty contextHandler传递参数

时间:2015-10-27 22:54:21

标签: jetty

我想制作一些指向我的码头设置中另一个端点的自定义端点。例如,我已经拥有像http://myserver.com/app这样的端点来提供帮助页面。此外,如果我传递某些参数,我会得到不同的页面。例如,http://myserver.com/app?app_id=56可能会投放一个应用,http://myserver.com/app?app_id=48可能会提供一个记录功能的静态html页面。

为了某些用户,我想为一些常用的应用设置简单的端点。因此,如果用户转到http://myserver.com/docs,他们应该看到与http://myserver.com/app?app_id=48相同的内容。

我一直在尝试使用.xml配置文件来完成此操作。到目前为止,我已经开始工作了。

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.eclipse.org/configure.dtd">

<Configure class="org.eclipse.jetty.server.handler.ContextHandler">
  <Set name="contextPath">/docs</Set>
  <Set name="resourceBase">http://localhost:8080</Set>
  <Set name="handler">
    <New class="org.eclipse.jetty.server.handler.ResourceHandler">
      <Set name="welcomeFiles">
        <Array type="String">
          <Item>app</Item>
        </Array>
      </Set>
      <Set name="cacheControl">max-age=3600,public</Set>
    </New>
  </Set>
</Configure>

使用这个配置文件转到/ docs服务上面提到的帮助页面,我通常会加载http://myserver.com/app,我的挂断是我无法弄清楚如何传递相应的app_id。

我想我最终可能会创建某种自定义处理程序,但我并不完全确定如何实现它。

只是为了使问题复杂化,我还希望能够将一些任意参数传递给我的端点并将其传递给它。因此http://myserver.com/docs?foo=bar会显示http://myserver.com/app?app_id=48&foo=bar

我应该采用另一种方式,还是可以通过config xml文件完成?

1 个答案:

答案 0 :(得分:0)

如果使用Jetty 9.2+,您可以使用内置的静态资源服务(deploy模块提供的魔法)

例如:

$ cd /path/to/my.base
$ ls -l webapps
total 4
lrwxrwxrwx. 1 joakim joakim 84 Oct 27 17:24 docs -> /opt/my/docs
$ java -jar /path/to/jetty-dist/start.jar

但是如果你真的想用XML处理静态资源......

  • 不要使用ContextHandlerResourceHandler它们仅用于最简单和天真的文件服务方案。
  • 使用匿名WebAppContext
  • resourceBase设置为文档所在的目录

以下是如何设置提供XML的静态文件(完成右侧)

$ cd /path/to/my.base
$ cat webapps/docs.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/docs</Set>
  <Set name="resourceBase">/opt/my/docs</Set>
  <Set name="defaultsDescriptor"><Property name="jetty.base" default="."/>/etc/docs-web.xml</Set>
</Configure>

$ cat etc/docs-web.xml 
<?xml version="1.0" encoding="UTF-8"?>
<web-app 
   xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
   metadata-complete="false"
   version="3.1">

  <servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
    <init-param>
      <param-name>aliases</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>acceptRanges</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>dirAllowed</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>welcomeServlets</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>redirectWelcome</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>maxCacheSize</param-name>
      <param-value>256000000</param-value>
    </init-param>
    <init-param>
      <param-name>maxCachedFileSize</param-name>
      <param-value>200000000</param-value>
    </init-param>
    <init-param>
      <param-name>maxCachedFiles</param-name>
      <param-value>2048</param-value>
    </init-param>
    <init-param>
      <param-name>gzip</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>etags</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>useFileMappedBuffer</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>cacheControl</param-name>
      <param-value>max-age=3600,public</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
  </welcome-file-list>
</web-app>
$ java -jar /path/to/jetty-dist/start.jar