Servlet过滤器登录重定向无限循环[重复]

Posted

技术标签:

【中文标题】Servlet过滤器登录重定向无限循环[重复]【英文标题】:Servlet Filter login redirection infinite loop [duplicate] 【发布时间】:2016-05-20 13:34:18 【问题描述】:

我正在试验 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】:

不知道为什么要这样实现,

看看 JAAS JAAS for human beings

此外,如果您需要实现此过滤器,登录后将用户对象放入会话中是一种常见行为,例如,过滤器将针对 null 对其进行测试, 如果是关于授权,您将检查 URL,例如针对预定义的角色列表来传递请求或重定向到未经授权的页面

【讨论】:

以上是关于Servlet过滤器登录重定向无限循环[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Servlet 过滤器和 j_security_check 登录时出现无限循环

PHPMyAdmin 单点登录身份验证无限重定向循环

成功登录后的 Node.js Express 无限重定向循环

第一次成功登录 MVC .NET 5 OWIN ADAL OpenIDConnect 后,第二次登录导致无限重定向循环

新的 Asp.Net MVC5 项目生成一个无限循环到登录页面

Azure OpenID Connect 通过 OWIN 中间件导致无限重定向循环