Servlet Filter登录重定向无限循环

时间:2016-02-10 09:24:36

标签: servlets login infinite-loop servlet-filters

我正在尝试使用servlet过滤器。我创建了两个JSP页面 - Home和Login。 我想创建以下流程:

在会话中访问没有凭据的主页时 - >重定向到登录页面。

输入正确的凭据(将它们与硬编码的常量进行比较)时,会重定向到主页。

输入错误的凭据时 - 再次重定向到“登录”页面。

到目前为止,这是我的代码,由于空检查,我在直接进入主页时遇到无限循环问题。在这种情况下,你能否告诉我正确方法的指示。

package bg.filter.test;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter ("/pages/*")
public class LoginFilter implements Filter {

    private static final String name = "admin";
    private static final String pass = "123";

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        String name = request.getParameter("username");
        String pass = request.getParameter("password");

        if (name != null && pass != null) {
            if (LoginFilter.name.equals(name) && LoginFilter.pass.equals(pass)) {
                ((HttpServletRequest) request).getSession().setAttribute("username", name);
                ((HttpServletRequest) request).getSession().setAttribute("password", pass);

                ((HttpServletResponse) response).sendRedirect("/FilterLoginTest/pages/Home.jsp");
            } else {
                ((HttpServletResponse) response).sendRedirect("/FilterLoginTest/pages/Login.jsp");
            }
        } else {
            name = (String)((HttpServletRequest) request).getSession().getAttribute("username");

            if(name == null) {
                ((HttpServletResponse) response).sendRedirect("/FilterLoginTest/pages/Login.jsp");
            }
        }
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

1 个答案:

答案 0 :(得分:0)

我想知道你为什么要这样实现呢,

看看JAAS JAAS for human beings

此外,如果您需要实现此过滤器,那么在登录后将用户对象放在会话中并且只是过滤器将针对null进行测试时,这是一种常见的行为, 如果它是关于授权的,您将检查网址,例如根据预定义的角色列表传递请求或重定向到未授权页面