标签: embedded-jetty

检测嵌入式Jetty服务器何时完全初始化

我在一个java应用程序中嵌入了Jetty,并在Jetty服务器对象的实例上调用了start()方法(在设置了描述静态和动态Web内容位置的处理程序列表之后).start()调用是否阻塞,直到初始化完成?如果没有,我如何确定服务器何时完全启动并准备好接收请求?

jetty embedded-jetty

11
推荐指数
2
解决办法
2484
查看次数

嵌入式Jetty:内部和外部可见端点的不同端口?

我有一个使用嵌入式Jetty作为服务器的REST应用程序.大多数端点需要公开可见(并且内置适当的身份验证),但有一些仅供内部使用.我想避免对这些进行身份验证的开销,而是使用防火墙来限制访问:

外部可见端点在端口10000上提供,外部防火墙保持打开状态.内部可见端点在端口20000上提供,外部防火墙阻止这些端点.

但是,我无法弄清楚如何使用嵌入式Jetty来实现这一点.我已经尝试实例化两个Server对象,一个在端口10000上,注册了相应的servlet处理程序,另一个在端口20000上注册了相应的servlet处理程序.但是,只有第二个启动的服务器实例才能工作; 对由一个主机托管的端点的请求首先导致404响应.

Jetty文档讨论了如何使用*.xml配置执行此操作,但不适用于嵌入式实例.

有什么想法或想法吗?或者是否有更好的方法来实现我之后的内部/外部端点隔离?硬性要求是内部和外部端点都需要在同一个JVM中"运行".


编辑

事实证明,问题与使用Guice和Guice-servlets扩展(问题618635)有关.运行两个嵌入式Jetty实例的工作正常,如James Kingsbery在下面的回答中所述.

Guice使用在服务器上下文中注册的过滤器(GuiceFilter)来获取需要请求范围的依赖注入(DI)的请求以及构建需要DI的servlet和过滤器.不幸的是,它使用静态对象来管理与之关联的servlet和过滤器列表.

在一个典型的设置中,guice-servlet.jar包含GuiceFilter在每个应用程序中,因此由每个应用程序的不同类加载器加载---一切正常.嵌入式Jetty不是这样,基本上所有内容都由默认的系统类加载器加载.

解决Guice问题

Guice的最新master(commit fbbb52dcc92e)包含一个更新的GuiceFilterFilterPipeline对象的动态引用(导致问题的静态对象)的支持.不幸的是,注入FilterPipeline实例的构造函数是package-private.因此,要使用它,您需要在com.google.inject.servlet包中公开该构造函数创建一个包装类:

package com.google.inject.servlet;

import com.google.inject.Inject;

public class NonStaticGuiceFilter extends GuiceFilter {

    /**
     * Do not use. Must inject a {@link FilterPipeline} via the constructor.
     */
    @SuppressWarnings("unused")
    private NonStaticGuiceFilter() {
        throw new IllegalStateException();
    }

    @Inject
    public NonStaticGuiceFilter(FilterPipeline filterPipeline) {
        super(filterPipeline);
    }

}
Run Code Online (Sandbox Code Playgroud)

要使用此类,请使用ServletModule已安装的注入器创建实例,并将其注册到Jetty Context:

// …
Run Code Online (Sandbox Code Playgroud)

java jetty embedded-jetty

11
推荐指数
1
解决办法
2771
查看次数

如何为Jetty的web.xml中的静态资源配置缓存?

我正在读这篇文章:http: //docs.codehaus.org/display/JETTY/LastModifiedCacheControl

它说

Jetty默认servlet允许使用cacheControl init参数为静态内容设置缓存控制头:

<init-param>
    <param-name>cacheControl</param-name>
    <param-value>max-age=3600,public</param-value>
</init-param>
Run Code Online (Sandbox Code Playgroud)

但是,我不确定我是否使用默认的servlet.至少这样的配置不在web.xml中:

<web-app>
    <display-name>Wicket QuickStart</display-name>
    <context-param>
        <param-name>configuration</param-name>
        <param-value>development</param-value>
    </context-param>
    <servlet>
        <servlet-name>quickstart</servlet-name>
        <servlet-class>org.apache.wicket.protocol.http.WicketServlet</servlet-class>
        <init-param>
            <param-name>applicationClassName</param-name>
            <param-value>wicket.quickstart.WicketApplication</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>quickstart</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)

我想为静态资源配置缓存,例如:

/src/webapp/*,即:/src/webapp/images, /src/webapp/css, /src/webapp/js

我应该加入什么web.xml

configuration caching jetty cache-control embedded-jetty

10
推荐指数
1
解决办法
2万
查看次数

如何为jetty服务器设置连接/请求超时?

我正在我的应用程序中运行嵌入式jetty服务器(jetty 6.1.24),如下所示:

    Handler handler=new AbstractHandler()
    {
        @Override
        public void handle(String target, HttpServletRequest request,
                HttpServletResponse response, int dispatch)
                throws IOException, ServletException {
              //this can take a long time
              doSomething();  
        }
    };


    Server server = new Server(8080);
    Connector connector = new org.mortbay.jetty.nio.SelectChannelConnector();      
    server.addConnector(connector);

    server.setHandler(handler);
    server.start();
Run Code Online (Sandbox Code Playgroud)

我想设置一个超时值(2秒),这样如果handler.handle()方法需要超过2秒,则jetty服务器将超时并使用408 http代码(请求超时)响应客户端.

这是为了保证我的应用程序不会长时间保持客户端请求并始终在2秒内响应.

我做了一些研究并用"connector.setMaxIdleTime(2000);"测试了它.但它不起作用.

jetty embedded-jetty connection-timeout

10
推荐指数
1
解决办法
2万
查看次数

嵌入式Jetty重写无法正常工作

我试图在Jetty文档示例之后在嵌入式Jetty服务器中实现一个简单的重写规则.

我想要请求/admin/重写到/admin.html.目前,如果我要求/admin/我得到404错误,/admin.html但未找到.但如果我/admin.html直接要求,它的确有效!

stackoverflow上有2个其他类似的帖子,但没有问题的答案!

这是代码:

WebAppContext _ctx = new WebAppContext();
_ctx.setContextPath("/");
_ctx.setDefaultsDescriptor(JETTY_DEFAULTS_DESCRIPTOR);
_ctx.setParentLoaderPriority(true);       
_ctx.setWar(getShadedWarUrl());
_ctx.setResourceBase(getShadedWarUrl());

RewriteHandler rewriter = new RewriteHandler();
rewriter.setRewritePathInfo(true);
rewriter.setRewriteRequestURI(true);
rewriter.setOriginalPathAttribute("requestedPath");

RewritePatternRule admin = new RewritePatternRule();
admin.setPattern("/admin/");
admin.setReplacement("/admin.html");
admin.setTerminating(true); // this will stop Jetty from chaining the rewrites
rewriter.addRule(admin);

_ctx.setHandler(rewriter);

HandlerCollection _handlerCollection = new HandlerCollection();
_handlerCollection.setHandlers(new Handler[] {_ctx});
server.setHandlers(_result);
Run Code Online (Sandbox Code Playgroud)

rewrite jetty embedded-jetty

10
推荐指数
1
解决办法
2010
查看次数

当我点击Chrome中的"允许"时,为什么getUserMedia会抛出[对象NavigatorUserMediaError]?

最近,我在尝试通过我的网站访问客户端的麦克风时开始出错.当Chrome询问是否允许该网站访问用户的麦克风时,[object NavigatorUserMediaError]会产生是否单击"允许"或"拒绝".无论麦克风是否实际插入计算机(运行Ubuntu 12.04),都会发生这种情况.

通过Firefox进行的进一步测试显示,这不是针对Chrome的.问题才在我完成实时输入演示然后退出计算机后才开始.我尝试制作一个访问麦克风的裸机演示,但遇到了同样的问题.

var getVideo = false, getAudio = true;

navigator.getUserMedia || (navigator.getUserMedia = navigator.mozGetUserMedia ||
        navigator.webkitGetUserMedia || navigator.msGetUserMedia);

function init() {
    if(navigator.getUserMedia) {
        navigator.getUserMedia({video:getVideo, audio:getAudio}, onSuccess, onError);
    } else {
        alert('getUserMedia failed.');
    }
}

function onSuccess() {
    console.log("Yay");
}

function onError(err) {
    console.log("Noo " + err);
}
Run Code Online (Sandbox Code Playgroud)

这是相当令人费解的,因为它已经完美地工作,直到我退出然后重新登录并尝试再次测试它.

我通过Jetty和Eclipse在本地托管Web代码.我通过localhost:8080/my-program在Web浏览器中输入来访问它.

编辑:错误发生后,相机的图标显示在Chrome地址栏中,表示Chrome正在访问我的麦克风并列出两个可能的麦克风,"默认"和"内置音频模拟立体声".

编辑2:尝试通过webrtc访问我的麦克风的其他网站上也出现此错误.传统的Flash实现仍然有效.

Chrome似乎在打开时会定期抛出错误消息.

[361:362:0725/095320:ERROR:audio_output_device.cc(186)] 
Not implemented reached in virtual void
media::AudioOutputDevice::OnStateChanged(media::AudioOutputIPCDelegate::State)
Run Code Online (Sandbox Code Playgroud)

编辑3:我能够更多地澄清错误信息

NavigatorUserMediaError {code: 1, PERMISSION_DENIED: 1}
Run Code Online (Sandbox Code Playgroud)

javascript audio jetty embedded-jetty webrtc

10
推荐指数
2
解决办法
2万
查看次数

无法发布包含许多(超过256个)值的表单

我正在使用Thymeleaf的Spring Boot 1.2.2.我的问题是我尝试在表单中发布一长串项目(一些标签,一个复选框),这些列表不能执行我的列表中的这么多项目.(我测试了小清单并且它有效.)

首先我使用了码头,但收到了错误,其中说:

java.lang.IllegalStateException: Form too many keys
at org.eclipse.jetty.util.UrlEncoded.decodeUtf8To(UrlEncoded.java:526)
Run Code Online (Sandbox Code Playgroud)

我搜索并看到了这篇文章.结果我补充说

applicationDefaultJvmArgs = ["-Dorg.eclipse.jetty.server.Request.maxFormKeys=8000"]
Run Code Online (Sandbox Code Playgroud)

到我的gradle.build,但它没有成功.结果我切换到Tomcat,它再次失败.错误消息是:

java.lang.IndexOutOfBoundsException: Index: 256, Size: 256
at java.util.ArrayList.rangeCheck(ArrayList.java:635)
Run Code Online (Sandbox Code Playgroud)

看起来它只能执行256个条目.我有大约500个条目.所以我认为增加maxhttpheadersize会有所帮助,并将此行添加到我的application.properties:

server.tomcat.max-http-header-size=-1
Run Code Online (Sandbox Code Playgroud)

(-1为无限制)我在我的Thymeleaf表格中设置method ="post".任何其他方式增加256限制?我不想分页我的结果.谢谢你的帮助.

embedded-jetty thymeleaf spring-boot embedded-tomcat-8

10
推荐指数
1
解决办法
3250
查看次数

消除或理解Jetty 9的"IllegalStateException:HttpChannelOverHttp关闭后数据过多"

设置

我使用jaxws-maven-pluginv2.1生成Web服务类.我还包括以下Jetty依赖项:

  • org.eclipse.jetty.jetty-server
  • org.eclipse.jetty.jetty-sevlet
  • org.eclipse.jetty.jetty-http-spi

(有问题的版本是9.2.10.v20150310,但除了知道它的Jetty 9之外,这个问题超越了Jetty的特定次要版本号).

使用以下代码,我可以成功发布服务:

System.setProperty("com.sun.net.httpserver.HttpServerProvider",
                   "org.eclipse.jetty.http.spi.JettyHttpServerProvider");

final String url = "http://localhost/SlipperySoap";
final SlipperySoap service = new SlipperySoapImpl();
final Endpoint endpoint = Endpoint.publish(url, service);
Run Code Online (Sandbox Code Playgroud)

问题

不时,但在相当规律的基础上,我收到Jetty的警告:

badMessage:java.lang.IllegalStateException:HttpChannelOverHttp @ 38f120bc关闭后数据太多{r = 1,a = IDLE,uri = - }

这些警告通常分批进行,如以下时间戳显示:

08:33:43.510 [pool-1-thread-4641] WARN : HttpParser: badMessage: ...
08:33:47.778 [pool-1-thread-4556] WARN : HttpParser: badMessage: ...
08:33:48.340 [pool-1-thread-4612] WARN : HttpParser: badMessage: ...
08:33:49.037 [pool-1-thread-4567] WARN : HttpParser: badMessage: ...
08:33:49.112 [pool-1-thread-4721] WARN : HttpParser: badMessage: ...
08:33:49.242 [pool-1-thread-4579] WARN …
Run Code Online (Sandbox Code Playgroud)

java jetty jax-ws embedded-jetty

10
推荐指数
1
解决办法
5522
查看次数

在一个简单的Jetty/Maven Hello World webapp中找不到404错误

我按照提示创建一个"标准Web应用程序与码头和Maven" 正是作为Eclipse的维基描述:http://wiki.eclipse.org/Jetty/Tutorial/Jetty_and_Maven_HelloWorld#Developing_a_Standard_WebApp_with_Jetty_and_Maven

但是,当我运行webapp(mvn jetty:run)并转到localhost:8080/hello-world/hello时,我最终会遇到"HTTP ERROR 404问题访问/ hello-world/hello.原因:未找到".我已阅读文档,查看了wiki页面的历史记录,探讨了其他论坛和stackoverflow线程,但无法找到这个看似简单的问题的答案.我将发布我的源代码,但它与教程完全相同.

任何帮助,将不胜感激.我真的很想开始玩这种技术,但它仍然沮丧地继续抨击同样的死胡同.

(请注意:创建"JettyMavenHelloWorld"教程的第一部分工作正常.我的问题是第二部分,"JettyMavenHelloWarApp".这一部分标题为"使用Jetty和Maven开发标准WebApp")

JettyMavenHelloWarApp/pom.xml的

<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>hello-world</artifactId>
  <version>0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>Jetty HelloWorld</name>

  <properties>
    <jettyVersion>7.2.0.v20101020</jettyVersion>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-server</artifactId>
      <version>${jettyVersion}</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <!-- This plugin is needed for the servlet example -->
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>${jettyVersion}</version>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.1</version>
        <executions>
          <execution><goals><goal>java</goal></goals></execution>
        </executions>
        <configuration>
          <mainClass>org.example.HelloWorld</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
Run Code Online (Sandbox Code Playgroud)

JettyMavenHelloWarApp/SRC /主/ JAVA /组织/示例/ HelloServlet.java

package org.example;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; …
Run Code Online (Sandbox Code Playgroud)

maven-2 jetty embedded-jetty maven

9
推荐指数
1
解决办法
7万
查看次数

将jetty ResourceHandler映射到URL

是否可以使用嵌入式Jetty从目录X提供静态文件但映射到URL Y?我有静态文件存储在目录"web"下,但我希望URL类似于http://host/myapp.

我已经成功运行了ResourceHandler以下列方式配置的服务器:

ResourceHandler ctx = new ResourceHandler();
ctx.setResourceBase("path-to-web");
HandlerList list = new HandlerList();
list.addHandler(ctx);
...
server.setHandler(list);
Run Code Online (Sandbox Code Playgroud)

但结果是提供/web所需URL映射下的文件,而不是它们.

jetty embedded-jetty

9
推荐指数
1
解决办法
6707
查看次数