我在一个java应用程序中嵌入了Jetty,并在Jetty服务器对象的实例上调用了start()方法(在设置了描述静态和动态Web内容位置的处理程序列表之后).start()调用是否阻塞,直到初始化完成?如果没有,我如何确定服务器何时完全启动并准备好接收请求?
我有一个使用嵌入式Jetty作为服务器的REST应用程序.大多数端点需要公开可见(并且内置适当的身份验证),但有一些仅供内部使用.我想避免对这些进行身份验证的开销,而是使用防火墙来限制访问:
外部可见端点在端口10000上提供,外部防火墙保持打开状态.内部可见端点在端口20000上提供,外部防火墙阻止这些端点.
但是,我无法弄清楚如何使用嵌入式Jetty来实现这一点.我已经尝试实例化两个Server对象,一个在端口10000上,注册了相应的servlet处理程序,另一个在端口20000上注册了相应的servlet处理程序.但是,只有第二个启动的服务器实例才能工作; 对由一个主机托管的端点的请求首先导致404响应.
Jetty文档讨论了如何使用*.xml配置执行此操作,但不适用于嵌入式实例.
有什么想法或想法吗?或者是否有更好的方法来实现我之后的内部/外部端点隔离?硬性要求是内部和外部端点都需要在同一个JVM中"运行".
事实证明,问题与使用Guice和Guice-servlets扩展(问题618和635)有关.运行两个嵌入式Jetty实例的工作正常,如James Kingsbery在下面的回答中所述.
Guice使用在服务器上下文中注册的过滤器(GuiceFilter)来获取需要请求范围的依赖注入(DI)的请求以及构建需要DI的servlet和过滤器.不幸的是,它使用静态对象来管理与之关联的servlet和过滤器列表.
在一个典型的设置中,guice-servlet.jar包含GuiceFilter在每个应用程序中,因此由每个应用程序的不同类加载器加载---一切正常.嵌入式Jetty不是这样,基本上所有内容都由默认的系统类加载器加载.
Guice的最新master(commit fbbb52dcc92e)包含一个更新的GuiceFilter对FilterPipeline对象的动态引用(导致问题的静态对象)的支持.不幸的是,注入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) 我正在读这篇文章: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?
我正在我的应用程序中运行嵌入式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文档示例之后在嵌入式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) 最近,我在尝试通过我的网站访问客户端的麦克风时开始出错.当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) 我正在使用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限制?我不想分页我的结果.谢谢你的帮助.
我使用jaxws-maven-pluginv2.1生成Web服务类.我还包括以下Jetty依赖项:
org.eclipse.jetty.jetty-serverorg.eclipse.jetty.jetty-sevletorg.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) 我按照提示创建一个"标准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) 是否可以使用嵌入式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映射下的文件,而不是它们.
embedded-jetty ×10
jetty ×9
java ×2
audio ×1
caching ×1
javascript ×1
jax-ws ×1
maven ×1
maven-2 ×1
rewrite ×1
spring-boot ×1
thymeleaf ×1
webrtc ×1