我正在尝试LoggingFilter在嵌入式Jetty设置中配置Jersey.使用的胶水代码如下:
ServletContainer servletContainer = new ServletContainer(application);
ServletHolder servletHolder = new ServletHolder(servletContainer);
servletHolder.setInitParameter("com.sun.jersey.config.feature.Debug", "true");
servletHolder.setInitParameter("com.sun.jersey.config.feature.Trace", "true");
servletHolder.setInitParameter("com.sun.jersey.spi.container.ContainerRequestFilters",
"com.sun.jersey.api.container.filter.LoggingFilter");
servletHolder.setInitParameter("com.sun.jersey.spi.container.ContainerResponseFilters",
"com.sun.jersey.api.container.filter.LoggingFilter");
Run Code Online (Sandbox Code Playgroud)
但实际上忽略了日志记录过滤器,我在控制台中看不到相关日志.我怎样才能做到这一点?在Jersey 1.x和2.x上进行了测试.
一个相关的答案描述了如何利用这个来实现web.xml.
在下面Jetty文档的示例中,描述了一种执行高效异步HTTP请求的简单方法.但是,在这个例子中,它从未指定你实际应该如何检索服务器的回复,我似乎无法弄明白.
Result对象具有getResponse()和getRequest(),但它们都没有访问内容的方法.
谁知道?
Jetty的文档
可以用这种方式编写一个简单的异步GET请求:
httpClient.newRequest("http://domain.com/path")
.send(new Response.CompleteListener()
{
@Override
public void onComplete(Result result)
{
// Your logic here
}
});
Run Code Online (Sandbox Code Playgroud)
方法Request.send(Response.CompleteListener)返回void并且不阻塞; 作为参数提供的Response.CompleteListener在请求/响应对话完成时得到通知,Result参数允许您访问响应对象.
我正在尝试访问包装在同一.jar文件(testJetty.jar)中的静态资源(例如first.html),该文件也具有启动码头(v.8)服务器(MainTest.java)的类。我无法正确设置资源库。
我的jar文件(testJetty.jar)的结构:testJetty.jar
first.html
MainTest.java
==在本地计算机上工作正常,但是当我将其包装在jar文件中然后运行时,它不起作用,并出现“ 404:找不到文件”错误。
我尝试使用以下值设置资源库,所有这些都失败了:
a)尝试将其设置为。
resource_handler.setResourceBase("."); // Results in directory containing the jar file, D:\Work\eclipseworkspace\testJettyResult
Run Code Online (Sandbox Code Playgroud)
b)尝试从getResource获取它
ClassLoader loader = this.getClass().getClassLoader();
File indexLoc = new File(loader.getResource("first.html").getFile());
String htmlLoc = indexLoc.getAbsolutePath();
resource_handler.setResourceBase(htmloc); // Results in D:\Work\eclipseworkspace\testJettyResult\file:\D:\Work\eclipseworkspace\testJettyResult\testJetty1.jar!\first.html
Run Code Online (Sandbox Code Playgroud)
c)尝试获取webdir
String webDir = this.getClass().getProtectionDomain()
.getCodeSource().getLocation().toExternalForm();
resource_handler.setResourceBase(webdir); // Results in D:/Work/eclipseworkspace/testJettyResult/testJetty1.jar
Run Code Online (Sandbox Code Playgroud)
这3种方法均无效。
任何帮助或替代将不胜感激
谢谢阿巴斯
我正在尝试配置嵌入式Jetty Web服务器以编程方式使用SPNEGO(不使用xml).
我试图将此转换为:http://www.eclipse.org/jetty/documentation/current/spnego-support.html到非基于xml的配置.这是我的尝试:
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
// ...
String domainRealm = "MY.DOMAIN.COM";
Constraint constraint = new Constraint();
constraint.setName(Constraint.__SPNEGO_AUTH);
constraint.setRoles(new String[] { domainRealm });
constraint.setAuthenticate(true);
ConstraintMapping cm = new ConstraintMapping();
cm.setConstraint(constraint);
cm.setPathSpec("/*");
SpnegoLoginService loginService = new SpnegoLoginService();
loginService.setConfig(System.getProperty("spnego.properties"));
loginService.setName(domainRealm);
ConstraintSecurityHandler sh = new ConstraintSecurityHandler();
sh.setLoginService(loginService);
sh.setConstraintMappings(new ConstraintMapping[]{cm});
sh.setRealmName(domainRealm);
ServletContextHandler contextHandler = new ServletContextHandler();
contextHandler.setErrorHandler(new ErrorHandler() { }); // TODO
contextHandler.setContextPath(contextPath);
contextHandler.addServlet(new ServletHolder(new DispatcherServlet(context)), "/*");
contextHandler.addEventListener(new ContextLoaderListener(context));
contextHandler.setSecurityHandler(sh);
Server server = new Server(port);
server.setHandler(contextHandler);
Run Code Online (Sandbox Code Playgroud)
但是,当我点击服务器时,它正在尝试使用基本身份验证(base 64). …
我想构建一个在嵌入式Jetty服务器中调用异步servlet的简单示例.当我尝试从Request的AsyncContext启动Runnable时,我得到一个NullPointerException.这是服务器代码:
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
ServletHandler handler = new ServletHandler();
server.setHandler(handler);
ServletHolder holder = handler.addServletWithMapping(AsyncServlet.class, "/*");
holder.setAsyncSupported(true);
server.start();
server.join();
}
Run Code Online (Sandbox Code Playgroud)
这是servlet代码:
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
final AsyncContext ctxt = req.startAsync();
ctxt.start(() -> {
ctxt.complete();
});
}
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪的错误:
java.lang.NullPointerException
at org.eclipse.jetty.server.AsyncContextState$2.run(AsyncContextState.java:168)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:620)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:540)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)
也许服务器需要任何其他配置.有什么建议?
增加:相同的servlet在嵌入式tomcat中运行时没有任何变化.
如何在Spring Boot 1.2.x中配置带有SSL连接器的Jetty?
以下配置适用于Spring引导1.1.6,但是为版本1.2.1 提供了"SslSocketConnector无法解析为类型"错误.
@Configuration
@EnableAutoConfiguration
public class OptosoftOAuthSecurityApplication implements
EmbeddedServletContainerCustomizer {
public static void main(String[] args) {
SpringApplication.run(OptosoftOAuthSecurityApplication.class, args);
}
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
if (container instanceof JettyEmbeddedServletContainerFactory) {
customizeJetty((JettyEmbeddedServletContainerFactory) container);
}
}
public void customizeJetty(
JettyEmbeddedServletContainerFactory containerFactory) {
containerFactory.addServerCustomizers(jettyServerCustomizer());
}
@Bean
public JettyServerCustomizer jettyServerCustomizer() {
return new JettyServerCustomizer() {
@Override
public void customize(Server server) {
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStorePassword("jetty6");
try {
sslContextFactory.setKeyStorePath(ResourceUtils.getFile(
"classpath:jetty-ssl.keystore").getAbsolutePath());
} catch (FileNotFoundException ex) {
throw new IllegalStateException("Could …Run Code Online (Sandbox Code Playgroud) 我正在使用使用Jetty 9.0.2的SparkJava 2.2.
我得到Jetty抛出的"Form too large"异常.如果我直接使用Jetty,我已经知道如何解决这个问题:
http://www.eclipse.org/jetty/documentation/current/setting-form-size.html
问题:
现在我需要找到一种org.eclipse.jetty.server.Request.maxFormContentSize通过SparkJava 更改设置的方法.有没有办法做到这一点?
我必须注意其他方法(JVM_OPTS,System.setProperty)由于某些原因不适合我.我仍然得到同样的例外.
堆栈跟踪:
[qtp1858644635-27] ERROR spark.webserver.MatcherFilter -
java.lang.IllegalStateException: Form too large 308913>200000
at org.eclipse.jetty.server.Request.extractParameters(Request.java:334)
at org.eclipse.jetty.server.Request.getParameterMap(Request.java:765)
at javax.servlet.ServletRequestWrapper.getParameterMap(ServletRequestWrapper.java:193)
at spark.QueryParamsMap.<init>(QueryParamsMap.java:59)
at spark.Request.initQueryMap(Request.java:364)
at spark.Request.queryMap(Request.java:349)
at spark.webserver.RequestWrapper.queryMap(RequestWrapper.java:213)
at com.xyz.analytics.webservice.RequestTools.getRequestQueryMap(RequestTools.java:27)
at com.xyz.analytics.webservice.RequestTools.getMandrillQueryParams(RequestTools.java:22)
at com.xyz.analytics.webservice.Endpoints.lambda$initiateEndpointsAndExceptionHandlers$2(Endpoints.java:61)
at com.xyz.analytics.webservice.Endpoints$$Lambda$3/1485697819.handle(Unknown Source)
at spark.SparkBase$1.handle(SparkBase.java:311)
at spark.webserver.MatcherFilter.doFilter(MatcherFilter.java:159)
at spark.webserver.JettyHandler.doHandle(JettyHandler.java:60)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:179)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:451)
at org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:252)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:266)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:240)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:596)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:527)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)
我必须注意其他方法(JVM_OPTS,System.setProperty)对我不起作用.
好吧,调试器甚至不会在任何设置的断点处停止org.eclipse.jetty.server.handlerContextHandler...加上当它在org.eclipse.jetty.server.Request断点处停止时,_context属性为null.似乎SparkJava以不同的方式处理它.死路. …
在这里,我试图在到达servlet之前拒绝jetty服务器级别的请求.由于按照以下配置,线程池有6个最小和10个最大并行执行线程,10个请求可以在线程池中排队,其中55个请求可以在连接器级别排队.总数为85表示如果一次发送200个请求,则应拒绝115个请求.但即使我用jmeter一次发送1000个请求.Jetty服务器满足所有请求.下面是一段代码.
Server server = new Server();
QueuedThreadPool threadPool = new QueuedThreadPool();
LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(15);
ExecutorThreadPool pool = new ExecutorThreadPool(6, 10, 30000, TimeUnit.MILLISECONDS, queue);
server.setThreadPool(pool);
threadPool.setMaxThreads(AssuranceConfiguration.annetAssurancesrvConsumerThread);
server.setThreadPool(threadPool);
if (AssuranceConfiguration.annetAssurancesrvSslRequired)
{
if (logger.isInfoEnabled())
{
logger.info("Going to use HTTPS, Initialising SSL context....");
}
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStore(JettyServer.class.getResource(KEYSTOREFILE).getFile());
sslContextFactory.setKeyStorePassword(AssuranceConfiguration.annetAssurancesrvKeystoreidentifier);
sslContextFactory.setKeyManagerPassword(AssuranceConfiguration.annetAssurancesrvKeystoremanagerPassword);
SslSelectChannelConnector sslConnector = new SslSelectChannelConnector(sslContextFactory);
sslConnector.setPort(AssuranceConfiguration.annetAssurancesrvPort);
server.setConnectors(new Connector[] { sslConnector });
}
else
{
if (logger.isInfoEnabled())
{
logger.info("Going to use HTTP, Initialising simple context....");
}
SelectChannelConnector simpleConnector = new SelectChannelConnector(); …Run Code Online (Sandbox Code Playgroud) 我已经在SO和官方文档上搜索了一段时间,但我找不到直接使用CDI注入到JAX-RS客户端的方法.
我使用构建器方法检索客户端,我想注册一个WriterInterceptor(或任何类似组件的过滤器),它使用注入来检索另一个bean.
我想使用CDI注入并避免使用HK2注册每个bean.
ClientBuilder.newBuilder()
.register(MyWriter.class)
.build();
Run Code Online (Sandbox Code Playgroud)
和MyWriter一起注入类.
@Provider
public class MyWriter implements WriterInterceptor {
private final MyRepo repo;
@Inject
public MyWriter(MyRepo repo) {
this.repo = repo;
}
@Override
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
context.proceed();
}
}
public class MyRepo {
}
Run Code Online (Sandbox Code Playgroud)
我在泽西2和Weld SE的嵌入式码头上跑步.
使用Javalin.create().port(portNumber)设置监听端口,但是尚不清楚如何设置监听/绑定地址。
embedded-jetty ×10
jetty ×6
java ×5
jersey ×2
servlets ×2
asynchronous ×1
cdi ×1
jar ×1
javalin ×1
jax-rs ×1
jetty-9 ×1
kotlin ×1
sockets ×1
spark-java ×1
spnego ×1
spring-boot ×1
ssl ×1
weld ×1