怎么创建web应用基于jetty websocket-CSDN论坛

我启动jetty,报下面异常:
10:34:22.799:INFO::jetty-7.2.2.v
10:34:28.665:WARN::FAILED org.eclipse.jetty.security.ConstraintSecurityHandler@17ec9f7: java.lang.IllegalStateException: No LoginService for org.eclipse.jetty.security.authentication.BasicAuthenticator@3b1f38 in org.eclipse.jetty.security.ConstraintSecurityHandler@17ec9f7
10:34:28.665:WARN::FAILED org.eclipse.jetty.server.session.SessionHandler@fd918a: java.lang.IllegalStateException: No LoginService for org.eclipse.jetty.security.authentication.BasicAuthenticator@3b1f38 in org.eclipse.jetty.security.ConstraintSecurityHandler@17ec9f7
10:34:28.665:WARN::Failed startup of context o.e.j.w.WebAppContext{/,file:/E:/workspace/sms/WebRoot/}
java.lang.IllegalStateException: No LoginService for org.eclipse.jetty.security.authentication.BasicAuthenticator@3b1f38 in org.eclipse.jetty.security.ConstraintSecurityHandler@17ec9f7
at org.eclipse.jetty.security.authentication.LoginAuthenticator.setConfiguration(LoginAuthenticator.java:45)
at org.eclipse.jetty.security.SecurityHandler.doStart(SecurityHandler.java:335)
at org.eclipse.jetty.security.ConstraintSecurityHandler.doStart(ConstraintSecurityHandler.java:228)
at org.eclipse.ponent.AbstractLifeCycle.start(AbstractLifeCycle.java:55)
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:93)
at org.eclipse.jetty.server.handler.ScopedHandler.doStart(ScopedHandler.java:97)
at org.eclipse.jetty.server.session.SessionHandler.doStart(SessionHandler.java:114)
at org.eclipse.ponent.AbstractLifeCycle.start(AbstractLifeCycle.java:55)
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:93)
at org.eclipse.jetty.server.handler.ScopedHandler.doStart(ScopedHandler.java:97)
at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:630)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:228)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1181)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:584)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:496)
at org.eclipse.ponent.AbstractLifeCycle.start(AbstractLifeCycle.java:55)
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:93)
at org.eclipse.jetty.server.Server.doStart(Server.java:243)
at org.eclipse.ponent.AbstractLifeCycle.start(AbstractLifeCycle.java:55)
at util.OneWebAppUnassembled.main(OneWebAppUnassembled.java:21)
结果我将下面这两行代码加上在执行便没有问题了:
&&&&&& HashLoginService dummyLoginService = new HashLoginService("TEST-SECURITY-REALM");&&
&&&&& webAppCtx.getSecurityHandler().setLoginService(dummyLoginService);
有些web应用在我当前jetty下是可以正常运行的,但我部署另一个web应用就会出现上面的异常,我现在没搞清楚是什么原因导致的,还有这两句代码都做了什么事情实现了什么功能,妄解答!谢谢
问题补充:对于一个web容器,为什么会出现有些web应用可以正常运行,有些则不可以,对于jetty嵌入到应用中,需要实现哪些方面功能,才能得以支持所有的web应用!
问题补充:Wind_ZhongGang 写道&?xml version="1.0"& encoding="ISO-8859-1"?&
&!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"&
&Configure class="org.eclipse.jetty.webapp.WebAppContext"&
& &Set name="contextPath"&/template&/Set&
& &Set name="war"&&SystemProperty name="jetty.home" default="."/&/webapps/Template.war&/Set&
& &Set name="extractWAR"&true&/Set&
& &Set name="copyWebDir"&false&/Set&
& &Set name="defaultsDescriptor"&&SystemProperty name="jetty.home" default="."/&/etc/webdefault.xml&/Set&
& &Get name="securityHandler"&
&&& &Set name="loginService"&
&&&&& &New class="org.eclipse.jetty.security.HashLoginService"&
&&& &Set name="name"&Test Realm&/Set&
&&& &Set name="config"&&SystemProperty name="jetty.home" default="."/&/etc/realm.properties&/Set&
&&&&& &/New&
&&& &/Set&
&&& &Set name="checkWelcomeFiles"&true&/Set&
& &/Get&
&/Configure&
不知道楼主是否对jetty安装文件下的context文件里的配置文件有所研究,如果想要在jetty中部署你的web应用程序,需要增加这样的配置文件,如果不想使用配置文件而想嵌入应用程序中,也应该实现配置文件中所需要的最少步骤。从配置文件中可以看出,在jetty中启动一个web应用程序是从WebAppContext类开始的,其中需要配置它的属性,如启动时的地址,启动时的war包的位置,还有就是配置securityHandler中的loginService。这些配置相应的也就能够体现在你的java程序中了。
谢谢兄台!我对jetty就研究了几天还不甚了解,一直在看些资料。如你所讲的话:Configure标签下这么的set子标签和属性,都要一一实现,应用程序中嵌入的jetty容器功能才全面的话这样的工作力度貌似还是很大的。
期待更多的答案!
问题补充:myali88 写道我刚才测试了一下,如果你在web.xml里增加了下面的配置,那么jetty启动的时候就会报No LoginService的错误:
&security-constraint&
&web-resource-collection&
&web-resource-name&A Protected Page&/web-resource-name&
&url-pattern&/*&/url-pattern&
&/web-resource-collection&
&auth-constraint&
&role-name&admin&/role-name&
&role-name&user&/role-name&
&role-name&moderator&/role-name&
&/auth-constraint&
&/security-constraint&
&login-config&
&auth-method&BASIC&/auth-method&
&realm-name&MyRealm&/realm-name&
&/login-config&
不知道你的web应用里面是否也有这些配置。
我的web.xml配置了&
&login-config&
&auth-method&BASIC&/auth-method&
&/login-config&
应该就是这个问题。
但是我想问问:嵌入到应用中的jetty容器,是不是在代码中需要对应的代码功能jetty.xml中的相应的配置内容的功能呢?那这么的属性应该如何完成呢?
问题补充:Wind_ZhongGang 写道并不像你想像中的那么大,主要使用的就是配置文件中提及的几个类,至于set get都是这些类中的方法而已,只要你设置了正确的属性,那么启动就没有问题。jetty本身就很小,想要使用配置文件或是在应用程序中编程实现都是很容易的事情。这还要取决于你的需求有多大。了解了配置文件中怎么启动的服务器,你就会相应了解在应用程序中应该怎么编程实现了。
非常感谢,好像兄台对Jetty比较了解。不知道有没有使用过JNDI和jetty绑定来开发,如果有的话,请将代码分享,小弟不才,妄指点一二!
问题补充:myali88 写道引用
但是我想问问:嵌入到应用中的jetty容器,是不是在代码中需要对应的代码功能jetty.xml中的相应的配置内容的功能呢?那这么的属性应该如何完成呢?
如果是嵌入式的可以直接在代码中增加:
HashUserRealm myrealm = new HashUserRealm("MyRealm",System.getProperty("jetty.home")+"/etc/realm.properties");
server.setUserRealms(new UserRealm[]{myrealm});
这个是jetty 6的写法,jetty 7的写法你上面已经有了。
如果是在jetty.xml里面配置的话,可以这样:
&Configure class="org.eclipse.jetty.webapp.WebAppContext"&
&Set name="contextPath"&/test&/Set&
&Set name="war"&&SystemProperty name="jetty.home" default="."/&/webapps/test&/Set&
&Get name="securityHandler"&
&Set name="loginService"&
&New class="org.eclipse.jetty.security.HashLoginService"&
&Set name="name"&Test Realm&/Set&
&Set name="config"&&SystemProperty name="jetty.home" default="."/&/etc/realm.properties&/Set&
&/Configure&
问题补充:我看web.xml中,
&& &login-config&
&&&&&&& &auth-method& BASIC | DIGEST | CLIENT-CERT|FORM
&&&&&&& &/auth-method&
&&& &/login-config&
BASIC,DIGEST ...四种安全认证类型。如果web.xml可能配置的是其中一种,测试都通过了。谢谢了!您知道嵌入的jetty的web容器(就是之前我写的代码),在启动运行或者关闭,日志可以写到我指定log文件中呢?就有如tomcat中生成到log文件夹的log文件,jetty有什么样的机制去做这些事情呢?再次感谢!您帮了我不少忙!
问题补充:myali88 写道
Server server = new Server(8080);
HandlerCollection collection = new HandlerCollection();
collection.addHandler(handler);
RequestLogHandler logHandler = new RequestLogHandler();
NCSARequestLog log = new NCSARequestLog();
log.setFilename("target/request.log");
log.setAppend(true);
logHandler.setRequestLog(log);
collection.addHandler(logHandler);
server.setHandler(collection);
server.start();
楼上的做法是对的,不过这样只能记录请求的日志,至于jetty服务器启动本身的日志输出,这个还是通过外部日志系统完成的,就如果我们webapp里面要输出日志,需要配置log4j一样,内置的jetty也是一个app,做法类似。
可不可以通过对etc/jetty-logging.xml用java代码来实现,便可实现犹如tomcat一样在log目录下生产相应的log文件呢?也就是说这是属于jetty web容器本身的log日志信息。
Jetty-logging.xml文件的内容如下:
&?xml version="1.0"?&&
&!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"&&
&!-- =============================================================== --&
&!-- Configure stderr and stdout to a Jetty rollover log file&&&&&&& --&
&!-- this configuration file should be used in combination with&&&&& --&
&!-- other configuration files.& e.g.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& --&
&!--&&& java -jar start.jar etc/jetty-logging.xml&&&&&&&&&&&&&&&&&&& --&
&!-- ======================================== --&
&Configure id="Server" class="org.eclipse.jetty.server.Server"&&
&&& &New id="ServerLog" class="java.io.PrintStream"&&
&&&&& &Arg&&
&&&&&&&& &New class="org.eclipse.jetty.util.RolloverFileOutputStream"&&
&&&&&&&& &Arg&&Property name="jetty.logs" default="/var/log/jetty"/&/yyyy_mm_dd.stderrout.log&/Arg&&
&&&&&&&&& &Arg type="boolean"&false&/Arg&&
&&&&&& &Arg type="int"&30&/Arg&&
&&&&&&&&& &Arg&&Call class="java.util.TimeZone" name="getTimeZone"&&Arg&GMT&/Arg&&/Call&&/Arg&&
&&&&&&&&& &Get id="ServerLogName" name="datedFilename"/&&
&&&&&&& &/New&&
&&&& &/Arg&&
&&& &/New&&
&&& &Call class="org.eclipse.jetty.util.log.Log" name="info"&&Arg&Redirecting stderr/stdout to &Ref id="ServerLogName"/&&/Arg&&/Call&&
&& &Call class="java.lang.System" name="setErr"&&Arg&&Ref id="ServerLog"/&&/Arg&&/Call&&
&& &Call class="java.lang.System" name="setOut"&&Arg&&Ref id="ServerLog"/&&/Arg&&/Call&&
&/Configure&
因为嵌入一个jetty web容器没有了xml配置文件,但是我想实现一个jetty web容器本身的log信息的生产和维护,目前还是比较没有思绪,待解!
问题补充:myali88 写道
&Configure id="Server" class="org.eclipse.jetty.server.Server"&
&New id="ServerLog" class="java.io.PrintStream"&
&New class="org.eclipse.jetty.util.RolloverFileOutputStream"&
&Arg&&Property name="jetty.logs" default="/var/log/jetty"/&/yyyy_mm_dd.stderrout.log&/Arg&
&Arg type="boolean"&false&/Arg&
&Arg type="int"&30&/Arg&
&Arg&&Call class="java.util.TimeZone" name="getTimeZone"&&Arg&GMT&/Arg&&/Call&&/Arg&
&Get id="ServerLogName" name="datedFilename"/&
&Call class="org.eclipse.jetty.util.log.Log" name="info"&&Arg&Redirecting stderr/stdout to &Ref id="ServerLogName"/&&/Arg&&/Call&
&Call class="java.lang.System" name="setErr"&&Arg&&Ref id="ServerLog"/&&/Arg&&/Call&
&Call class="java.lang.System" name="setOut"&&Arg&&Ref id="ServerLog"/&&/Arg&&/Call&
&/Configure&
你将这段配置,转成java代码的方式应该就可以了。比如上面的
&Configure id="Server" class="org.eclipse.jetty.server.Server"& 相当于new Server()
&New id="ServerLog" class="java.io.PrintStream"& 相当于new PrintStream,&Arg&部分就是构造函数的参数。
其他的都是类似,你可以这样把xml翻译成java代码。
谢谢myali88 和 Wind_ZhongGang你们两位的帮助,我正尝试着写这个!这样的交流让我学到很多东西。
采纳的答案
&Configure id="Server" class="org.eclipse.jetty.server.Server"&
&New id="ServerLog" class="java.io.PrintStream"&
&New class="org.eclipse.jetty.util.RolloverFileOutputStream"&
&Arg&&Property name="jetty.logs" default="/var/log/jetty"/&/yyyy_mm_dd.stderrout.log&/Arg&
&Arg type="boolean"&false&/Arg&
&Arg type="int"&30&/Arg&
&Arg&&Call class="java.util.TimeZone" name="getTimeZone"&&Arg&GMT&/Arg&&/Call&&/Arg&
&Get id="ServerLogName" name="datedFilename"/&
&Call class="org.eclipse.jetty.util.log.Log" name="info"&&Arg&Redirecting stderr/stdout to &Ref id="ServerLogName"/&&/Arg&&/Call&
&Call class="java.lang.System" name="setErr"&&Arg&&Ref id="ServerLog"/&&/Arg&&/Call&
&Call class="java.lang.System" name="setOut"&&Arg&&Ref id="ServerLog"/&&/Arg&&/Call&
&/Configure&
你将这段配置,转成java代码的方式应该就可以了。比如上面的
&Configure id="Server" class="org.eclipse.jetty.server.Server"& 相当于new Server()
&New id="ServerLog" class="java.io.PrintStream"& 相当于new PrintStream,&Arg&部分就是构造函数的参数。
其他的都是类似,你可以这样把xml翻译成java代码。
正确,将配置文件中的信息转换成java代码。
Server server = new Server(8080);
HandlerCollection collection = new HandlerCollection();
collection.addHandler(handler);
RequestLogHandler logHandler = new RequestLogHandler();
NCSARequestLog log = new NCSARequestLog();
log.setFilename("target/request.log");
log.setAppend(true);
logHandler.setRequestLog(log);
collection.addHandler(logHandler);
server.setHandler(collection);
server.start();
楼上的做法是对的,不过这样只能记录请求的日志,至于jetty服务器启动本身的日志输出,这个还是通过外部日志系统完成的,就如果我们webapp里面要输出日志,需要配置log4j一样,内置的jetty也是一个app,做法类似。
&Set name="handler"&
&&& &New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler"&
&&&&& &Set name="requestLog"&
&New id="RequestLogImpl" class="org.eclipse.jetty.server.NCSARequestLog"&
& &Set name="filename"&&Property name="jetty.logs" default="./logs"/&/test-yyyy_mm_dd.request.log&/Set&
& &Set name="filenameDateFormat"&yyyy_MM_dd&/Set&
& &Set name="append"&true&/Set&
& &Set name="LogTimeZone"&GMT&/Set&
&/New&
&&&&& &/Set&
&&& &/New&
& &/Set&
在你的配置文件中添加这样的配置,或都以应用程序的形式实现
NCSARequestLog log=new NCSARequestLog();
log.setFilename();
log.setFilenameDateFormat();
log.setAppend();
log.setLogTimeZone();
RequestLogHandler logHandler=new RequestLogHandler();
logHandler.setRequestLog(log);
引用
但是我想问问:嵌入到应用中的jetty容器,是不是在代码中需要对应的代码功能jetty.xml中的相应的配置内容的功能呢?那这么的属性应该如何完成呢?
如果是嵌入式的可以直接在代码中增加:
HashUserRealm myrealm = new HashUserRealm("MyRealm",System.getProperty("jetty.home")+"/etc/realm.properties");
server.setUserRealms(new UserRealm[]{myrealm});
这个是jetty 6的写法,jetty 7的写法你上面已经有了。
如果是在jetty.xml里面配置的话,可以这样:
&Configure class="org.eclipse.jetty.webapp.WebAppContext"&
&Set name="contextPath"&/test&/Set&
&Set name="war"&&SystemProperty name="jetty.home" default="."/&/webapps/test&/Set&
&Get name="securityHandler"&
&Set name="loginService"&
&New class="org.eclipse.jetty.security.HashLoginService"&
&Set name="name"&Test Realm&/Set&
&Set name="config"&&SystemProperty name="jetty.home" default="."/&/etc/realm.properties&/Set&
&/Configure&
不熟悉,不过给你推荐一篇文章 http://blog.csdn.net/lovingprince/article/details/6364767
看看jetty安装文件夹下的etc文件中的realm.properties文件。
jetty: MD5:164c88b50af52c89945d44,user
admin: CRYPT:adpexzg3FUZAk,server-administrator,content-administrator,admin
other: OBF:1xmk1w261u9r1w1c1xmq,user
plain: plain,user
user: password,user
digest: MD5:6eabfbc385bc2bb754e297,user
并不像你想像中的那么大,主要使用的就是配置文件中提及的几个类,至于set get都是这些类中的方法而已,只要你设置了正确的属性,那么启动就没有问题。jetty本身就很小,想要使用配置文件或是在应用程序中编程实现都是很容易的事情。这还要取决于你的需求有多大。了解了配置文件中怎么启动的服务器,你就会相应了解在应用程序中应该怎么编程实现了。
我刚才测试了一下,如果你在web.xml里增加了下面的配置,那么jetty启动的时候就会报No LoginService的错误:
&security-constraint&
&web-resource-collection&
&web-resource-name&A Protected Page&/web-resource-name&
&url-pattern&/*&/url-pattern&
&/web-resource-collection&
&auth-constraint&
&role-name&admin&/role-name&
&role-name&user&/role-name&
&role-name&moderator&/role-name&
&/auth-constraint&
&/security-constraint&
&login-config&
&auth-method&BASIC&/auth-method&
&realm-name&MyRealm&/realm-name&
&/login-config&
不知道你的web应用里面是否也有这些配置。
&?xml version="1.0"& encoding="ISO-8859-1"?&
&!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"&
&Configure class="org.eclipse.jetty.webapp.WebAppContext"&
& &Set name="contextPath"&/template&/Set&
& &Set name="war"&&SystemProperty name="jetty.home" default="."/&/webapps/Template.war&/Set&
& &Set name="extractWAR"&true&/Set&
& &Set name="copyWebDir"&false&/Set&
& &Set name="defaultsDescriptor"&&SystemProperty name="jetty.home" default="."/&/etc/webdefault.xml&/Set&
& &Get name="securityHandler"&
&&& &Set name="loginService"&
&&&&& &New class="org.eclipse.jetty.security.HashLoginService"&
&&& &Set name="name"&Test Realm&/Set&
&&& &Set name="config"&&SystemProperty name="jetty.home" default="."/&/etc/realm.properties&/Set&
&&&&& &/New&
&&& &/Set&
&&& &Set name="checkWelcomeFiles"&true&/Set&
& &/Get&
&/Configure&
不知道楼主是否对jetty安装文件下的context文件里的配置文件有所研究,如果想要在jetty中部署你的web应用程序,需要增加这样的配置文件,如果不想使用配置文件而想嵌入应用程序中,也应该实现配置文件中所需要的最少步骤。从配置文件中可以看出,在jetty中启动一个web应用程序是从WebAppContext类开始的,其中需要配置它的属性,如启动时的地址,启动时的war包的位置,还有就是配置securityHandler中的loginService。这些配置相应的也就能够体现在你的java程序中了。
已解决问题
未解决问题怎么创建web应用基于jetty-CSDN论坛_百度知道
怎么创建web应用基于jetty-CSDN论坛
提问者采纳
javaee 的web是有标准的。答题不易,您的采纳是我前进的动力,互相理解, 在不同的应用服务器下都是可以运行的你好,请继续追问,如果我的回答没能帮助您
其他类似问题
为您推荐:
南充市的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁怎么创建web应用基于jetty-CSDN论坛_百度知道
怎么创建web应用基于jetty-CSDN论坛
我有更好的答案
你好。javaee 的web是有标准的, 在不同的应用服务器下都是可以运行的。答题不易,互相理解,您的采纳是我前进的动力,如果我的哗弧糕旧蕹搅革些宫氓回答没能帮助您,请继续追问。您也可以向我们团队发出请求,会有更专业的人来为您解答。
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁怎么创建web应用基于jetty-CSDN论坛_百度知道
怎么创建web应用基于jetty-CSDN论坛
如果我的回答没能帮助您。 javaee 的web是有标准的, 在不同的应用服务器下都是可以运行的你好。,请继续追问
知道智能回答机器人
根据知道用户的观点和内容总结出特定问题的答案,为知道用户提供更好的问答体验。
其他类似问题
为您推荐:
jetty的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁启动jetty遇到问题
[问题点数:60分,结帖人Spring_Xu_123]
启动jetty遇到问题
[问题点数:60分,结帖人Spring_Xu_123]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 jetty9 websocket 的文章

 

随机推荐