从Servlet / Filter重定向不起作用

时间:2012-06-06 15:21:10

标签: java servlets servlet-filters

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

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

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

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

浏览器网址为http://[localhost]/pages/login.jspx,它显示了Tomcat的404页面,网址中缺少上下文路径(在我的情况下是'/ hotel'),因此,如果我添加它:

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

重定向不会发生,浏览器网址不会更改,我会显示浏览器的404页面(此程序无法显示网页)。

我做错了什么?

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

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

2 个答案:

答案 0 :(得分:2)

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

至于你的具体问题,我不确定我是否正确理解“浏览器的404页面”,也许你的意思是当服务器无法访问或者请求被重定向时可能出现的浏览器默认错误页面无限循环(但应该在浏览器默认错误页面的实际消息中明确说明,至少Chrome和Firefox会这样做。)

鉴于您的过滤器已映射到/*,它实际上是在无限循环中重定向,因为登录页面的请求URL又与过滤器的URL模式匹配。

您需要 才能将过滤器置于更具体的网址格式上,该格式覆盖登录页面,例如在/secured/*上,其中所有受限制的页面都已移到那里(或将其映射到/pages/*并将登录页面放在那里),以修复过滤器,如下所示:< / p>

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

if (needsToRedirect && !request.getRequestURI().equals(loginURL)) {
    response.sendRedirect(loginURL);
}
else {
    chain.doFilter(request, response);
}

答案 1 :(得分:1)

1 - 您的servlet代码中是否记录了日志记录或其他可观察事件,确认它肯定在运行?

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

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

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