首页   

Filter学习笔记(三) 案例:登录验证

zheng_zq  ·  · 4 年前

需求

  1. 访问服务器资源。验证其是否登录
  2. 如果登录了,则直接放行。
  3. 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。

分析


注意 :如果是跟登录相关的资源要直接放行,不然会形成死循环。比如说:index.jsp、LoginServlet、验证码和登录相关的CSS、JS等资源。
注意 :Filter的request和response对象分别是 ServletRequest ServletResponse ,而非Servlet里面的 HttpServletRequest HttpServletResponse
不能直接获取路径,需要这样获取,如下:

//1.强制转换
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;

实现

/**
 * 登录验证的过滤器
 */
@WebFilter("/*")
public class Filter implements javax.servlet.Filter {
    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //1.强制转换
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        //2.获取资源请求路径
        String requestURI = request.getRequestURI();
        //3.判断是否包含登录相关资源路径
        if (requestURI.contains("login.jsp") || requestURI.contains("/loginServlet")) {
            //包含,用户想登录,放行
            chain.doFilter(req, resp);
        } else {
            //不包含,需要验证用户是否登录
            //4.从session中获取user
            Object user = request.getSession().getAttribute("user");
            if (user != null) {
                //登录了。放行
                chain.doFilter(req, resp);
            } else {
                //没有登录。跳转到登录页面。
                request.setAttribute("login_msg", "您尚未登录,请登录");
                request.getRequestDispatcher("/login.jsp").forward(request, resp);
            }
        }
    }

    @Override
    public void init(FilterConfig config) throws ServletException {

    }

}

注意 :如果出了BUG大概率是


这一步没有排除掉相关的资源,比如说跟登录相关的,并且是存放在服务器的CSS、JS等等。这里仅仅是代码演示,不考虑太多。

推荐文章
云南新闻广播  ·  金色热线丨省运管局:农村客货邮融合发展 ...  ·  2 年前  
泡泡扣扣  ·  蚂蚁有骨头和血液吗?  ·  4 年前  
© 2022 51好读
删除内容请联系邮箱 2879853325@qq.com