将网站的欢迎页面制作成一个Servlet

7

我可以将网站的welcome-file设置为Servlet吗?如果可以,该如何操作?我尝试了以下代码:

 <welcome-file-list>
    <welcome-file>FilterForwarded</welcome-file>
</welcome-file-list>

<!-- FilterForwarded is a servlet -->

在部署时,我没有看到任何错误,但当我尝试打开网站abc.com时,浏览器显示无法连接到此网站的消息。为什么会这样?

我希望当有人访问该网站时,我能够存储客户端的公共IP。为了实现这一目标,我编写了一个过滤器(Filter),它在获取IP后将其传递给servlet(从那里我可以更新日志)。在存储了IP之后,客户端将自动重定向到index.jsp。有没有办法实现这个目标?

编辑:

    <servlet-mapping>
       <servlet-name>FilterForwarded</servlet-name>
       <url-pattern>/FilterForwarded</url-pattern>
   </servlet-mapping>

这是在web.xml中定义的映射。当我在欢迎文件中使用/FilterForwarded时,尝试部署时会出现以下消息:配置错误:欢迎文件必须是相对路径:/FilterForwarded

从日志中可以看到:

com.google.apphosting.utils.config.AppEngineConfigException: Welcome files must be relative paths: /FilterForwarded
at com.google.apphosting.utils.config.WebXml.validate(WebXml.java:125)
at com.google.appengine.tools.admin.Application.<init>(Application.java:150)
at com.google.appengine.tools.admin.Application.readApplication(Application.java:225)
at com.google.appengine.tools.admin.AppCfg.<init>(AppCfg.java:145)
at com.google.appengine.tools.admin.AppCfg.<init>(AppCfg.java:69)
at com.google.appengine.tools.admin.AppCfg.main(AppCfg.java:65)

你是否为你的servlet定义了servlet-mapping?它的名称是什么? - João Silva
@JoãoSilva 是的,它的名字是 /FilterForwarded。 - Suhail Gupta
@JoãoSilva 当我尝试部署(保持相同的URL)时,我收到以下消息:配置错误:欢迎文件必须是相对路径:/FilterForwarded - Suhail Gupta
1个回答

4
如果您将过滤器映射到 /* ,则应该能够拦截所有请求并记录IP地址。
或者,您只需要记录落地页的客户端IP地址?
如果是这样,您可以更改Servlet容器的默认Servlet,但请注意,这将更改所有未在web.xml中匹配映射的请求的默认Servlet。
<servlet-mapping>
    <servlet-name>FilterForwarded</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

一种更复杂但潜在更好的解决方案是,在Java Web容器前面使用Web服务器,并使用重写规则代理到后端Servlet。这样将意味着您可以控制访问起始页的Servlet,而不会覆盖所有非匹配请求的默认Servlet。不过,对于您的问题来说,这可能有些过度。


我在部署时遇到了一个错误,提示“配置错误:欢迎文件必须是相对路径:/_”。 - Suhail Gupta
当我将url-pattern从/FilterForwarded更改为/ - Suhail Gupta
1
删除 welcome-file-list 部分,改用上面的 servlet 映射。 - groodt
是的,它起作用了。但是你能告诉我为什么在_welcome-file-list-section_上出现错误吗? - Suhail Gupta
1
欢迎文件部分URL必须是不完整的,因为当没有匹配的映射已经定义时,它会附加到目录URL上。因此没有前导/。根据Servlet 2.5规范:“Web服务器必须按照部署描述符中指定的顺序将每个欢迎文件附加到部分请求中,并检查WAR中是否映射到该请求URI的静态资源或servlet。” - groodt
我想和你讨论一个问题,地址是http://chat.stackoverflow.com/rooms/16418/discussion-between-cuberoot-and-suhail。 - Suhail Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接