我有一个主类配置和启动Jetty.(这是Wicket测试webapp的标准做法,但它确实不是特定于wicket的.)
final Server server = new Server();
//skipped socketconnector initialization
final WebAppContext bb = new WebAppContext();
bb.setServer(server);
bb.setContextPath("/");
bb.setWar("src/main/webapp");
server.addHandler(bb);
server.start();
Run Code Online (Sandbox Code Playgroud)
如您所见,src/main/webapp用作webapp root.但是,我有一些目标/类中的资源,稍后会复制到webapp.所以我想向jetty添加虚拟目录.
我想映射target/classes/js到/js和target/classes/css到/css
有人可以帮忙吗?
顺便说一句:这是码头6.1.4
如何以编程方式关闭嵌入式jetty服务器?
我像这样启动jetty服务器:
Server server = new Server(8090);
...
server.start();
server.join();
Run Code Online (Sandbox Code Playgroud)
现在,我想从请求中关闭它,例如http://127.0.0.1:8090/shutdown 如何干净利落地完成它?
通常提出的解决方案是创建一个线程并从该线程调用server.stop().但我可能需要调用Thread.sleep()以确保servlet已完成处理关闭请求.
我试图通过嵌入Jetty为我的应用程序设置一个简单的Web服务.我想提供两种不同的Web服务,一种简单的HTTP服务器,它只提供静态内容(最终将是一个GWT应用程序)和一个可以为应用程序吐出JSON状态消息的自定义servlet.
我的分发文件夹结构如下所示:
+ dist/
- MyApp.jar
+ lib/
+ html/
- index.html
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止配置嵌入式服务器的方法.我在访问时正确地从我的自定义servlet获取测试输出http://localhost/data/,但我似乎无法让DefaultServlet找到我的index.html文件.
public Webserver(int port) {
server = new Server(port);
ServletContextHandler context = new ServletContextHandler();
context.setResourceBase("./html/");
server.setHandler(context);
JsonDataApiServlet dataServlet = new JsonDataApiServlet();
DefaultServlet staticServlet = new DefaultServlet();
context.addServlet(new ServletHolder(dataServlet), "/data/*");
context.addServlet(new ServletHolder(staticServlet), "/*");
}
Run Code Online (Sandbox Code Playgroud)
对于将Jetty嵌入到东西中的人来说,这似乎是一项普遍的任务.我是否在正确的轨道上?
编辑
原来这个问题是由于误解了Jetty内部相对路径的计算方式.我是从dist文件夹上方的一个文件夹中运行它,使用java -jar dist\MyApp.jar,而Jetty正在寻找dist\..\html而不是正确的dist\html.从dist文件夹内运行jar可以解决问题.我将回答我是如何工作的,而不必从dist目录中运行.
我正在尝试使用嵌入式Jetty服务器.我只想根据请求路径将请求映射到不同的servlet.
创建ServletHandler和添加servlet与创建和添加servlet相比有什么区别ServletContextHandler?
例如:
//how is this different...
ServletHandler handler = new ServletHandler();
handler.addServletWithMapping(MyServlet.class, "/path");
//from this?
ServletContextHandler contextHandler = new ServletContextHandler();
contextHandler.addServlet(MyServlet.class, "/path");
Run Code Online (Sandbox Code Playgroud) 我曾经在本地tomcat服务器上部署我的WAR,并在libtomcat 的文件夹中有一个jackson-core.jar .现在,我已切换到maven并使用jetty插件.
一切正常,但406 error - The server responded with 406 error (Not acceptable)我知道错误即将到来,因为app server(jetty)中没有jackson-core.jar.
题:
如何将jar放在嵌入式jetty的lib文件夹中,就像我为独立的tomcat服务器所做的那样.这可能吗?
我尝试过以下方法:
<configuration>
<scanIntervalSeconds>5</scanIntervalSeconds>
<webAppConfig>
<contextPath>/myapp</contextPath>
<extraClasspath>/Users/myuser/Downloads/jackson-core-2.1.0.jar</extraClasspath>
</webAppConfig>
</configuration>
Run Code Online (Sandbox Code Playgroud) 我正在尝试配置嵌入式jetty来与我的Jersey资源交谈,但我无法弄清楚如何做到这一点.我尝试过几种不同的东西但似乎没什么用.jetty教程并没有真正处理如何使用Jersey.任何代码建议或链接都非常感谢
编辑:
package pojo;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.servlet.ServletContainer;
public class Main {
public static void main(String[] args) throws Exception {
Server server = new Server(8112);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);
ServletHolder h = new ServletHolder(new ServletContainer());
h.setInitParameter("com.sun.jersey.config.property.resourceConfigClass", "com.sun.jersey.api.core.PackagesResourceConfig");
h.setInitParameter("com.sun.jersey.config.property.packages", "resources");
h.setInitOrder(1);
context.addServlet(h, "/*");
try
{
server.start();
server.join();
}
catch (Throwable t)
{
t.printStackTrace(System.err);
}
Run Code Online (Sandbox Code Playgroud)
试图连接到这个类:
package resources;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Request;
import …Run Code Online (Sandbox Code Playgroud) 我正在使用spring boot(截至目前为1.2.1),我需要增加默认的8k请求头大小限制,该限制存在HttpConfiguration于Jetty的类中.看看JettyEmbeddedServletContainerFactory哪些我可以掌握,EmbeddedServletContainerCustomizer但无法看到如何改变它的方式.
我也确实看了一下JettyServerCustomizer- 我明白我可以Server通过它再次抓住码头- 没办法怎么改变HttpConfiguration这里.
任何提示将不胜感激.
我正在玩Spark(Java Web框架,而不是Apache Spark).
我觉得定义路由和过滤器真的很好很容易,但是我希望在我的路由中应用本机servlet过滤器,似乎无法找到一种方法.
更具体地说,我想使用Jetty的DoSFilter,它是一个servlet过滤器(与Spark Filter定义形成对比).由于Spark使用嵌入式Jetty,我没有web.xml来注册DoSFilter.但是,Spark不会公开服务器实例,所以我找不到以编程方式注册过滤器的优雅方式.
有没有办法将本机servlet过滤器应用于我的路由?
我想把DoSFilter包装在我自己的Spark Filter中,但这似乎是一个奇怪的想法.
在将Jetty作为嵌入式服务器运行时,如何覆盖默认错误页面(以"Powered by Jetty"为后缀)?
即
Server server = new Server(8080);
server.setHandler(new Handler());
/* configure custom error pages? */
server.start();
server.join();
Run Code Online (Sandbox Code Playgroud) 我是 ODL 控制器和嵌入式码头的新手。如果有请求泛滥,我想在 jetty.xml 中添加 DoSFilter 来限制 REST 请求。
我尝试在互联网上搜索,但在 web.xml DoSFilter 中有很多配置它的示例,但没有找到对 jetty.xml 的太多帮助
在 jetty.xml 中配置 DoSFilter 的任何帮助都会有很大帮助。
ODL - 氮气版本
码头 - 9.2.21.X 版本
以下是我迄今为止尝试过的选项。
在 jetty.xml 中配置的过滤器:
<Get name="handler">
<Call name="addHandler">
<Arg>
<New class="org.eclipse.jetty.servlet.ServletContextHandler">
<Set name="contextPath">/</Set>
<Set name="resourceBase">../</Set>
<Call name="addFilter">
<Arg>
<New class="org.eclipse.jetty.servlet.FilterHolder">
<Arg>
<New class="org.eclipse.jetty.servlets.DoSFilter" />
</Arg>
<Call name="setInitParameter">
<Arg>maxRequestsPerSec</Arg>
<Arg>30</Arg>
</Call>
<Call name="setInitParameter">
<Arg>delayMs</Arg>
<Arg>100</Arg>
</Call>
<Call name="setInitParameter">
<Arg>maxRequestMs</Arg>
<Arg>0</Arg>
</Call>
<Call name="setInitParameter">
<Arg>maxIdleTrackerMs</Arg>
<Arg>0</Arg>
</Call>
<Call name="setInitParameter">
<Arg>ipWhitelist</Arg>
<Arg>127.0.0.1</Arg>
</Call>
</New>
</Arg> …Run Code Online (Sandbox Code Playgroud) embedded-jetty ×10
jetty ×7
java ×6
servlets ×3
jersey ×1
jetty-9 ×1
maven ×1
opendaylight ×1
spark-java ×1
spring-boot ×1
tomcat ×1