Javaweb未登录被filter过滤,过滤后重定向到登录页面,然后登录后就不放行被过滤的页面了该怎么办

Javaweb
未登录被filter过滤,过滤后重定向到登录页面,然后登录后就不放行被过滤的页面了该怎么办


```java
package filter;


import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class LoginCheckFilter implements Filter {
    private String excludedPages;
    private String[] excludedPageArray;
    @Override
    public void init(FilterConfig config) throws ServletException {
        excludedPages = config.getInitParameter("excludedPages");
        if (null != excludedPages && excludedPages.length() > 0) {
            excludedPageArray = excludedPages.split(",");
        }
        return;
    }
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        boolean isExcludedPage = false;
        HttpSession session = ((HttpServletRequest) req).getSession();
        Object user = session.getAttribute("user");
        System.out.println("user"+user);
        // 获取不过滤的列表
        for (String page : excludedPageArray) {
            if (((HttpServletRequest) req).getServletPath().equals(page)) {
                isExcludedPage = true;
                break;
            }
        }
        if (isExcludedPage) { //如果有不过滤的页面,放行
            chain.doFilter(req, resp);
        } else {
            if (user != null){
                chain.doFilter(req,resp);
            }else {
                ((HttpServletRequest)req).getRequestDispatcher("/first.jsp").forward(req,resp);
            }
        }

    }
    @Override
    public void destroy() {
    }
}



```

在Filter中,可以通过检查会话中是否存在登录状态信息来判断用户是否已登录,如果已登录,则放行请求,否则进行重定向到登录页面

public class AuthenticationFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // 获取当前会话
        HttpSession session = httpRequest.getSession(false);

        // 检查会话中是否存在登录状态信息
        if (session != null && session.getAttribute("loggedIn") != null) {
            // 用户已登录,放行请求
            chain.doFilter(request, response);
        } else {
            // 用户未登录,重定向到登录页面
            httpResponse.sendRedirect(httpRequest.getContextPath() + "/login");
        }
    }

    // 省略其他方法
}


不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7800814
  • 这篇博客也不错, 你可以看下JavaWeb的Filter过滤器
  • 除此之外, 这篇博客: (29) JavaWeb中使用filter过滤器拦截请求、权限检查,过滤响应。中的 二、Filter 过滤器的使用步骤: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    1、编写一个类去实现 Filter 接口

    public class AdminFilter implements Filter {
    /*** 
    * @Description: doFilter方法专门用于拦截请求(可以做权限检查),过滤响应。
    * @Param: [servletRequest, servletResponse, filterChain]
    * @return: void
    */ 
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
            HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
            HttpSession session = httpServletRequest.getSession();
            Object user = session.getAttribute("user");
            //如果等于null,说明还没有登录。
            if (user == null) {
                //请求转发
                servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest, servletResponse);
                return;
            } else {
                // 让 程 序 继 续 往 下 访 问 用 户 的 目 标 资 源
                filterChain.doFilter(servletRequest, servletResponse);
            }
        }
    }
    

    2、实现过滤方法 doFilter()
    3、到 web.xml 中去配置 Filter 的拦截路径

        <!--filter标 签 用 于 配 置 一 个 Filter过 滤 器 -->
        <filter>
            <!--给 filter起 一 个 别 名 -->
            <filter-name>AdminFilter</filter-name>
            <!--配 置 filter 的 全 类 名 -->
            <filter-class>filter.AdminFilter</filter-class>
        </filter>
        <!--filter-mapping配 置 Filter过 滤 器 的 拦 截 路 径 -->
        <filter-mapping>
            <!--filter-name表 示 当 前 的 拦 截 路 径 给 哪 个 filter使 用 -->
            <filter-name>AdminFilter</filter-name>
            <!--url-pattern 配 置 拦 截 路 径
            / 表 示 请 求 地 址 为 : http://ip:port/ 工 程 路 径 /映 射 到 IDEA的web目 录
            /admin/*表 示 请 求 地 址 为 : http://ip:port/ 工 程 路 径 /admin/*-->
            <url-pattern>/admin/*</url-pattern> 
        </filter-mapping>
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^