Java 使用Servlet筛选器和j_安全检查登录时的无休止循环

Java 使用Servlet筛选器和j_安全检查登录时的无休止循环,java,tomcat,servlet-filters,j-security-check,Java,Tomcat,Servlet Filters,J Security Check,我已经实现了一个servletFilter并在我的web.xml中声明了它,但问题是我现在不能登录。用户提交用户名和密码,代码重定向到j_安全检查页面,然后无休止地重新加载logon.html。在代码doFilter(req,res)被两次命中的情况下,用于发送回logon.html的sendRedirect代码从未被使用 我还缺少其他元素吗?我读到servlet过滤器和j_security_check并不总是很好,但我想我可以找到一个解决办法 代码: public void doFilter(

我已经实现了一个servletFilter并在我的web.xml中声明了它,但问题是我现在不能登录。用户提交用户名和密码,代码重定向到j_安全检查页面,然后无休止地重新加载logon.html。在代码doFilter(req,res)被两次命中的情况下,用于发送回logon.html的sendRedirect代码从未被使用

我还缺少其他元素吗?我读到servlet过滤器和j_security_check并不总是很好,但我想我可以找到一个解决办法

代码:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    HttpSession session = request.getSession(false);

    String loginURI = request.getContextPath() + "/logon.html";
    String securityURI = request.getContextPath() + "/j_security_check";

    boolean loggedIn = session != null && session.getAttribute("user") != null;
    boolean securityRequest = request.getRequestURI().equals(securityURI);
    boolean loginRequest = request.getRequestURI().equals(loginURI);

    if (loggedIn || loginRequest || securityRequest) {
        chain.doFilter(req, res);
    } else {
        response.sendRedirect(loginURI);
    }
}
因此,代码检查请求是否来自登录页面或j_security_check页面,如果来自,则处理doFilter。这是工作,但我不知道为什么它没有处理通过应用程序,如果它通过两次

web.xml:

<session-config>
    <session-timeout>1</session-timeout>
</session-config>

<filter>
    <filter-name>servletFilter</filter-name>
    <filter-class>org.t.s.w.AuthServletFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>servletFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

1.
servletFilter
org.t.s.w.AuthServletFilter
servletFilter
/*

尝试像这样在过滤器中反转您的条件

if (!loggedIn || !loginRequest || !securityRequest) {
    response.sendRedirect(loginURI);
} else {
    chain.doFilter(req, res);
}

试着像这样在过滤器中反转你的状况

if (!loggedIn || !loginRequest || !securityRequest) {
    response.sendRedirect(loginURI);
} else {
    chain.doFilter(req, res);
}

问题很简单。您的筛选器链正在捕获所有请求,包括logon.html请求。当过滤器发现用户未登录时,它将重定向到“logon.html”

“重定向”是一个全新的请求。它向用户的浏览器发送一个响应,告诉它获取一个新的URL;因此,新请求将再次命中您的筛选器,并且再次。。。一次又一次


您可以测试请求的URI是否为“logon.html”,如果是简单的“doFilter”,也可以向前执行请求。

问题很简单。您的筛选器链正在捕获所有请求,包括logon.html请求。当过滤器发现用户未登录时,它将重定向到“logon.html”

“重定向”是一个全新的请求。它向用户的浏览器发送一个响应,告诉它获取一个新的URL;因此,新请求将再次命中您的筛选器,并且再次。。。一次又一次


您可以测试请求的URI是否为“logon.html”,如果只是“doFilter”,也可以执行请求转发。

您只是通过反转条件来打破无止境循环。您只是通过反转条件来打破无止境循环。