【问题标题】:Redirection from Servlet/Filter does not work来自 Servlet/Filter 的重定向不起作用
【发布时间】:2012-06-10 15:32:22
【问题描述】:

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

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

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

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

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

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

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

我做错了什么?

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

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

【问题讨论】:

    标签: java servlets servlet-filters


    【解决方案1】:

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

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

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

    您需要 either 将过滤器置于更具体的 URL 模式上,该模式 覆盖登录页面,例如在/secured/* 上,所有受限页面都被移到那里(或将其映射到/pages/* 并将登录页面放在外面),按如下方式修复您的过滤器:

    String loginURL = request.getContextPath() + "/pages/login.jspx";
    
    if (needsToRedirect && !request.getRequestURI().equals(loginURL)) {
        response.sendRedirect(loginURL);
    }
    else {
        chain.doFilter(request, response);
    }
    

    【讨论】:

    • 这确实是一个重定向循环,我应该首先为这个过滤器使用一个记录器。
    • 不客气。使用真正的网络浏览器并实际阅读其错误消息(应该说诸如“此站点未正确重定向”之类的内容)也会带来很多洞察力:)
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-02-19
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 2013-02-06
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      相关资源
      最近更新 更多