我对Magnolia Servlet遇到了大麻烦,到目前为止,我已经尝试了所有我能想到的。
关于magnolia documentation我们可以在模块定义中设置servlet定义而不是web.xml(这听起来更加干净,尤其是扩展)
所以我把这段代码放在我的xml模块中
<servlets>
<servlet>
<name>jcaptcha</name>
<class>com.octo.captcha.module.servlet.image.SimpleImageCaptchaServlet</class>
<mappings>
<mapping>/jcaptcha.jpg</mapping>
</mappings>
</servlet>
</servlets>
然后我为过滤器创建了旁路节点(config.server.filters.bypasses.jcaptcha.xml)
<?xml version="1.0" encoding="UTF-8"?>
<sv:node sv:name="jcaptcha" xmlns:sv="http://www.jcp.org/jcr/sv/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>mgnl:contentNode</sv:value>
</sv:property>
<sv:property sv:name="jcr:uuid" sv:type="String">
<sv:value>f845ae89-a537-4e9f-b074-57d812fd92a6</sv:value>
</sv:property>
<sv:property sv:name="class" sv:type="String">
<sv:value>info.magnolia.voting.voters.URIStartsWithVoter</sv:value>
</sv:property>
<sv:property sv:name="pattern" sv:type="String">
<sv:value>/jcaptcha.jpg</sv:value>
</sv:property>
<sv:node sv:name="MetaData">
<sv:property sv:name="jcr:primaryType" sv:type="Name">
<sv:value>mgnl:metaData</sv:value>
</sv:property>
<sv:property sv:name="mgnl:activated" sv:type="Boolean">
<sv:value>false</sv:value>
</sv:property>
<sv:property sv:name="mgnl:activatorid" sv:type="String">
<sv:value>superuser</sv:value>
</sv:property>
<sv:property sv:name="mgnl:authorid" sv:type="String">
<sv:value>superuser</sv:value>
</sv:property>
<sv:property sv:name="mgnl:creationdate" sv:type="Date">
<sv:value>2007-04-25T18:23:31.784+02:00</sv:value>
</sv:property>
<sv:property sv:name="mgnl:lastaction" sv:type="Date">
<sv:value>2007-05-02T17:00:15.025+02:00</sv:value>
</sv:property>
<sv:property sv:name="mgnl:lastmodified" sv:type="Date">
<sv:value>2012-06-07T05:41:25.275-05:00</sv:value>
</sv:property>
</sv:node>
</sv:node>
当我请求localhost / magnolia / jcaptcha.jpg时,它仍然给我404错误。 “但是”当我将servlet定义放在web.xml中时,它会给出正确的结果。
谁能告诉我我错过了什么?
答案 0 :(得分:0)
以下是我从magnolia forum
得到的答案 <servlets>
<servlet>
<name>jcaptcha</name>
<class>com.octo.captcha.module.servlet.image.SimpleImageCaptchaServlet</class>
<mappings>
<mapping>/jcaptcha.jpg</mapping>
</mappings>
</servlet>
</servlets>
这样做可以告诉Magnolia为您运行servlet。在config:/ server / filters / servlets / jcaptcha中安装模块时,可以验证是否已安装servlet。
然后我为过滤器创建了旁路节点(config.server.filters.bypasses.jcaptcha.xml)
这样做你告诉Magnolia不要处理旁路网址,而是让Servlet容器处理程序请求。因为只有Magnolia知道servlet,而不是容器,你得到404.一旦你让容器知道servlet(通过将它添加到web.xml),你就得到了结果。
您有两个选项 - 要么在web.xml中保留旁路和定义,要么将servlet定义保留在模块中。你不能两者兼得。 另请注意,Magnolia将在安装模块期间从模块描述符中读取servlet定义,因此如果已安装该模块,则需要调用info.magnolia.module.delta.RegisterModuleServletsTask作为更新的一部分。
HTH, 扬