0

我在使用 Magnolia Servlet 时遇到了很大的麻烦,到目前为止,我已经尝试了我能想到的一切。

关于magnolia 文档 ,我们可以在模块定义而不是 web.xml 中设置 servlet 定义(这听起来更简洁,特别是对于扩展)

所以我把这段代码放在我的 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 时,它给出了正确的结果。

谁能告诉我我错过了什么?

4

1 回答 1

0

这是我从木兰论坛得到的答案

 <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 不要处理所述绕过 url,而是让 Servlet 容器处理该请求。因为只有 Magnolia 知道 servlet,而不知道容器,所以您会得到 404。一旦您让容器知道 servlet(通过将其添加到 web.xml),您就会得到结果。

您有 2 个选项 - 在 web.xml 中保留绕过和定义,或者在模块中保留 servlet 定义。你不能两者兼得。另请记住,Magnolia 会在安装模块期间从您的模块描述符中读取 servlet 定义,因此如果该模块已安装,您需要在更新过程中调用 info.magnolia.module.delta.RegisterModuleServletsTask。

HTH,一月

于 2012-06-10T07:41:46.110 回答