2

我有重定向问题 - 它根本不适用于有效路径。现在我在 Servlet 中使用页面转发,但我需要在过滤器中进行重定向。

所有页面都位于“页面”文件夹中,并具有 .jspx 扩展名

我尝试了以下方法(此路径适用于转发):

httpResponse.sendRedirect("/pages/login.jspx");

browser url is http://[localhost]/pages/login.jspx,它显示Tomcat的404页面,url中缺少上下文路径(在我的例子中是'/hotel'),所以,如果我添加它:

httpResponse.sendRedirect("/hotel/pages/login.jspx");

重定向没有发生,浏览器 url 没有改变,我看到了浏览器的 404 页面(这个程序无法显示网页)。

我究竟做错了什么?

用于测试的过滤器具有以下映射:

@WebFilter(filterName = "SecurityFilter", urlPatterns = "/*")
4

2 回答 2

2

重定向的 URL 确实与最初请求的 URL 相关。要动态添加上下文路径,建议使用HttpServletRequest#getContextPath()而不是硬编码它,因为上下文路径值可以通过特定于服务器的配置在外部进行更改。

As to your concrete problem, I'm not sure if I understand "browser's 404 page" properly, perhaps you mean the browser-default error page which can occur when the server is unreachable or when the request has been redirected in an infinite loop (that should however have been made clear in the actual message of the browser default error page, at least Chrome and Firefox do that).

Given that your filter is mapped on /*, it's actually redirecting in an infinite loop because the request URL of the login page in turn also matches the URL pattern of the filter.

You'd need either to put the filter on a more specific URL pattern which does not cover the login page, e.g. on /secured/* where all restricted pages are been moved in there (or map it on /pages/* and put the login page outside there), or to fix your filter as follows:

String loginURL = request.getContextPath() + "/pages/login.jspx";

if (needsToRedirect && !request.getRequestURI().equals(loginURL)) {
    response.sendRedirect(loginURL);
}
else {
    chain.doFilter(request, response);
}
于 2012-06-06T15:30:27.373 回答
1

1 - 您的 servlet 代码中是否有日志记录或其他可观察到的事件来确认它确实在运行?

2 - 如果您在重定向之前编写任何实际响应内容,重定向可能会失败- 您有这样做吗?

3 - 另一种选择,在根目录中设置一个页面,甚至是“hello.html”静态页面,看看是否可以使用“/hello.html”和“hello.html”中的任何一个重定向到该页面。

只是我将在自己的调试方法中使用的一些想法,希望有所帮助!

于 2012-06-06T15:25:04.520 回答