Servlet过滤器重定向,url没有改变

Posted

技术标签:

【中文标题】Servlet过滤器重定向,url没有改变【英文标题】:Servlet filter redirect, url not changed 【发布时间】:2013-09-02 19:33:55 【问题描述】:

我的身份验证过滤器有问题。当过滤器重定向到登录页面时,所有以前的页面(主页面)都显示在登录页面中。 如果我手动进入登录页面,它工作正常。

这是我的过滤器:

    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    HttpSession session = req.getSession(false);
    String loginURL = req.getContextPath() + SiteMap.LOGIN_CONTROLLER;
    boolean sessionCreated = session != null && !session.isNew();

    if (sessionCreated) 
        chain.doFilter(request, response);
     else 
        res.sendRedirect(loginURL);
    

我还注意到,当过滤器重定向到登录页面时,浏览器栏中的 URL 保持不变。主要问题是我从登录页面的其他页面获取内容。不知道哪里出了问题。

【问题讨论】:

如果您已经有权访问某个页面,那么getSession 将始终返回一个“非新会话”,这将导致您的if 语句的第一种情况。 我认为if 语句工作正常,因为它重定向正确,唯一的问题是 URL 没有更改为“/login”。 好的,在这个过滤器之前还有其他的 servlet 过滤器吗?响应中不应包含任何过滤器,否则 sendRedirect 将无法工作。 不,这是唯一的过滤器。我有:res.sendRedirect(loginURL); 你是什么意思写在回复上?我正在帮助这个link @extra90 您如何从登录页面调用其他页面..??是使用request.forward还是redirect,您可以发布代码吗 【参考方案1】:

我遇到了完全相同的问题。 真正的问题是我和你都忘记添加以下行:

response.setContentType("text/html");

添加此行后,我的重定向工作正常。在此之前,我的 servlet 将留在 与空白页面相同的页面(因为没有任何内容写入响应输出流)。

希望这可以帮助遇到此问题的其他人。在测试这种可能性之前,我花了一些痛苦的时间。

【讨论】:

【参考方案2】:

在浏览器中更改 URl 并不取决于过滤器,而是取决于您如何调用页面/servlet。您可以通过两种方式调用您的 servlet/jsp

    RequestDispatcher : 将控制权转移给同一请求下的其他人(相同的URL)

    Send Redirect : 发起一个新请求(New Url)

    注意:过滤器所做的只是对请求进行验证

【讨论】:

【参考方案3】:

您传递的 loginURL 的值是什么。发送相对路径。

【讨论】:

http://***.com/questions/2190733/java-servlet-filter-redirect-problem?rq=1 发现应该直接重定向到登录页面。 重定向到 /login.jsp 您可以使用 'fiddler' 监控您的请求并检查发生了什么 这不是答案,应该是评论。

以上是关于Servlet过滤器重定向,url没有改变的主要内容,如果未能解决你的问题,请参考以下文章

从 Web 应用程序中的 servlet 过滤器重定向到上一页

从 servlet 过滤器重定向到 jsf 会返回未呈现为 html 的实际 jsf 代码

身份验证过滤器重定向回 Laravel 中的原始 POST 请求

我应该使用 servlet 还是过滤器来重定向 URL?

在 servlet 重定向之前使用过滤器修改响应 URL (Java/Tomcat)

在 servlet 过滤器中使用请求参数将 JSF ajax 请求重定向到 URL