当前位置: 首页 > 面试题库 >

Java过滤器无限循环

高慈
2023-03-14
问题内容

我想实现一个过滤器来执行身份验证,但是不知何故它陷入了无限循环中……任何想法都值得赞赏。

    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;

    doBeforeProcessing(request, response);

    Throwable problem = null;
    HttpSession session = httpRequest.getSession(true);
    if(session.getAttribute("userName")!=null&&session.getAttribute("userName")!=(""))
    {
        try {
            chain.doFilter(request, response);
        } catch (Throwable t) {
            // If an exception is thrown somewhere down the filter chain,
            // we still want to execute our after processing, and then
            // rethrow the problem after that.
            problem = t;
            t.printStackTrace();
        }   
    }else{
        httpResponse.sendRedirect("login.jsp");
        return;
    }

调试模式下的这段代码仅无限次运行,基本上,我想在用户未登录时将其重定向到login.jsp。任何答复表示赞赏。


问题答案:

这里,

httpResponse.sendRedirect("login.jsp");

您将向目标页面发送 新的
HTTP请求,而不是使用当前请求。如果此新的HTTP请求被映射到过于通用的网址格式(例如),则当然会再次点击过滤器/*。并且将执行相同的检查,并将其再次重定向。Etcetera。这是一个永无止境的故事。

FilterChain#doFilter()当当前请求的页面是登录页面时,您需要添加额外的检查才能执行。

String loginURL = httpRequest.getContextPath() + "/login.jsp";

if (httpRequest.getRequestURI().equals(loginURL)) || session.getAttribute("userName") != null) {
    chain.doFilter(request, response);
} else {
    httpResponse.sendRedirect(loginURL);
}

请注意,我还删除了对作为用户名的空字符串进行的无意义的检查(但是, 要确保 您的
代码无处将空字符串作为用户名。仅用于null表示未登录的用户。还要注意,我修复了也重定向URL,因为当当前请求的URL在子文件夹中时,URL将会失败。

一种不同的方法是把在一个共同的子文件夹中的所有那些受限网页,例如/app/secured/restricted等,并然后映射滤波器上的URL模式/app/*/secured/*/restricted/*等代替。如果将登录页面保留在此文件夹之外,则在请求登录页面时将不会调用过滤器。



 类似资料:
  • 问题内容: 我正在编写一个自定义Angular过滤器,该过滤器随机大写传递给它的输入。 这是代码: 我这样称呼它: 它可以工作,但是在我的控制台中,我看到了rootScope:infdig(无限摘要)循环。 我在理解为什么会发生这种情况以及如何解决此问题时遇到了一些麻烦。如果我理解正确,这是由于该函数调用了5个以上摘要操作。但是输入仅由过滤器调用一次,对吗? 任何帮助表示赞赏。 问题答案: 由于摘

  • 将此流收集到列表中 正如我所看到的,infinity循环有一些问题,所以peek()打印范围内的数字(12,99),这是可以的,但之后它再次打印范围内的数字(11,98),等等,你能解释一下我在哪里犯了错误吗?

  • 依赖项:Spring Boot 1.1.5。释放,Spring4.0.6。Spring安全释放装置3.2.4。释放 问题:我正在创建一个自定义过滤器,该过滤器基于请求中的令牌查询提供者以验证用户。这里有自定义筛选器代码和配置。正如你所看到的,我已经尽可能地禁用了以查明问题。启用调试显示 另一件事是日志告诉我用户已通过身份验证。 当查询应用程序时,会发生无限循环并最终返回请求,curl说它无法遵循那

  • 我有两个简单的POJOs: 然后我生成一些数据,我为父母添加100个孩子: 我的目标是移除所有10岁以下的儿童: 最后,我列出了十岁以上的孩子。但是我不想写一个单独的方法。 如何得到所有的父母与名单上的孩子十岁以上只使用单一流?

  • 你好,有人能解释一下为什么这会形成一个无限循环吗?谢谢!

  • 问题内容: 请看下面的Java 无限循环。它导致其下面的语句的编译时错误。 以下相同的无限循环可正常工作,并且不会发出任何错误,其中我只是用布尔变量替换了条件。 同样在第二种情况下,循环之后的语句显然不可访问,因为布尔变量为true,但编译器根本没有抱怨。为什么? 编辑:显然,以下版本的卡在无限循环中,但是即使循环中的条件始终存在,因此循环下面的语句也不会对该语句下的语句发出任何编译器错误,因此循