2010-03-18 85 views
1

我正在尝试编写自己的Realm来验证用户身份。 我写了一个扩展org.apache.catalina.realm.RealmBase的类,编译成一个.jar文件并将其放在/ lib库中。 然后我说这server.xml中:Tomcat 6自定义Realm

<Realm className="wstest.tomcat.security.MyRealm" 
      resourceName="myrealm"/> 

的Tomcat似乎并没有 “看” 我的新罐子...... 当我启动Tomcat我得到:

ERROR main org.apache.commons.digester.Digester - Begin event threw exception 
java.lang.ClassNotFoundException: wstest.tomcat.security.MyRealm 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
    at org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:205) 
    at org.apache.tomcat.util.digester.Rule.begin(Rule.java:153) 
    at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1356) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:179) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1343) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2755) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 
    at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1642) 
    at org.apache.catalina.startup.Catalina.load(Catalina.java:526) 
    at org.apache.catalina.startup.Catalina.load(Catalina.java:560) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:261) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) 

回答

2

哪个/ lib目录你用过的文件夹? WebProject中的还是Tomcat中的? 我自己是一个tomcat新手,但据我所知,你应该把你的JAR放在后者中。

0

server.xml在webapps之前加载。因此,tomcat需要在加载应用程序JAR文件之前找到Realm实现类。将JAR放在tomcat/lib中,并且应该解决这个问题。

您还需要注意一个问题:不要在Realm构造函数中记录任何内容。 containerLog字段没有设置在那里,所以你会得到一个讨厌的NPE。 loadInternal()设置containerLog。