过滤器:
    过滤器的概述:
    什么是过滤器:
    过滤器:Filter. 对客户端向服务器发送的请求进行过滤.

    • Filter和Listener都属于Servlet中的高级部分.Filter是Servlet中最为实用的技术.
      为什么学习过滤器:
    • 过滤敏感词汇.
    • 统一网站的字符集编码.
    • 可以控制自动登录
      使用过滤器:
      步骤一:编写一个类实现Filter接口.
      步骤二:配置过滤器. FilterDemo1 com.juwins.filter.demo1.FilterDemo1 FilterDemo1 /*

    FilterChain对象的概述:过滤器链.
    什么是过滤器链:
    过滤器链指的是 一组过滤器对某些WEB资源进行过滤.那么这组过滤器称为是过滤器链.

    这组过滤器链执行的顺序与配置顺序有关!!!
    Filter的生命周期:
    什么是生命周期:
    生命周期:对象从创建到销毁的过程.

    • Servlet的生命周期:Servlet对象从创建到销毁过程.(*)
    • 生命周期:
    • 从客户端第一次访问Servlet的时候,服务器创建一个Servlet的对象.Servlet中init方法就会执行.每次访问Servlet服务器都会开启一个线程访问Servlet中的service方法.service方法内部根据请求的方式的不同调用doXXX的方法.当项目从服务器中移除或者关闭服务器的时候.服务器就会销毁Servlet对象.Servlet中的destroy方法就会执行.
    • 创建:
    • 第一次访问这个Servlet的时候.
    • 启动的时候创建Servlet:2
    • 销毁:
    • 服务器关闭或者是项目移除!
      Filter的生命周期:(记住、了解)
      指的是Filter从创建到销毁的过程!!!
    • Filter何时创建和销毁:
    • 创建:
    • 服务器启动的时候创建Filter的对象.
    • 销毁:
    • 服务器关闭的时候或者是项目移除!

    Filter的生命周期:

    • 服务器启动的时候,服务器创建一个代表过滤器对象.过滤器中init方法就会执行了.当过滤器过滤到要进行拦截的资源的路径的时候,doFilter方法就会执行.当服务器关闭的时候.销毁过滤器对象.destroy方法就会执行.
      FilterConfig:过滤器的配置对象.
      方法:
    • 获得过滤器的名称:
    • 获得过滤器的初始化参数的方法:
    • 获得过滤器的所有初始化参数的名称:
    • 获得ServletContext对象.

    代码:
    // 1.获得过滤器的名称:
    String filterName = filterConfig.getFilterName();
    System.out.println(“过滤器的名称:”+filterName);
    // 2.获得初始化参数的值:
    String username = filterConfig.getInitParameter(“username”);
    String password = filterConfig.getInitParameter(“password”);
    System.out.println(“过滤器的初始化参数:”+username+” “+password);
    // 3.获得所有初始化参数的名称:
    Enumeration e = filterConfig.getInitParameterNames();
    while(e.hasMoreElements()){
    String name = e.nextElement();
    String value = filterConfig.getInitParameter(name);
    System.out.println(name+” “+value);
    }
    过滤器相关的配置:

    • :过滤器的名称
    • :过滤器的全路径.

    • :初始化参数的名称
    • :初始化参数的值 ``` private FilterConfig filterConfig;

    @Override public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; }

    @Override public void doFilter(S ervletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 获得初始化参数:字符集: String encoding = filterConfig.getInitParameter(“encoding”); request.setCharacterEncoding(encoding); response.setContentType(“text/html;charset=”+encoding); chain.doFilter(request, response); }

    @Override public void destroy() {

    } ```

    }
    分IP统计网站访问次数的过滤器:
    代码:
    public class IPFilter implements Filter{
    private FilterConfig filterConfig;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    // 创建一个Map集合:Map用于保存客户的IP和对应的访问次数:
    Map map = new LinkedHashMap();
    // 将Map集合存入到ServletContext域中.
    filterConfig.getServletContext().setAttribute(“map”, map);
    this.filterConfig = filterConfig;
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
    // 获得Map集合
    Map map = (Map) filterConfig
    .getServletContext().getAttribute(“map”);
    // 获得客户端IP地址:
    String ip = request.getRemoteAddr();
    // 判断IP是否已经在Map集合中.
    Integer count = map.get(ip);
    if(count == null){
    // 没有访问过这个网站.
    map.put(ip, 1);
    }else{
    // 之前访问过网站.
    count++;
    map.put(ip, count);
    }
    //放行:
    chain.doFilter(request, response);
    } @Override
    public void destroy() {
    }}
    自动登录的过滤器:
    登录功能的编写:

    • 步骤一:引入jar包:
    • mysql驱动:
    • c3p0连接池:
    • DBUtils工具类:
    • BeanUtils工具类:
    • JSTL包:
    • 步骤二:引入配置文件
    • c3p0的配置文件:
    • UTILS工具类
    • 步骤三:创建登录页面:
    • login.jsp
    • 步骤四:编写登录的业务逻辑:
    • 编写LoginServlet:
    • 编写UserService:
    • 编写UserDao:
    • 步骤五:创建成功页面:
    • demo5/success.jsp
    • 步骤六:在登录页面中勾选自动登录复选框:记住用户名和密码
      String remember = request.getParameter(“remember”);
      if(“true”.equals(remember)){
      // 复选框已经勾选:
      // 使用Cookie记住用户名和密码.
      Cookie cookie = new Cookie(“autoLogin”, existUser.getUsername()+”#juwins#”+existUser.getPassword());
      // 设置Cookie的有效访问路径:
      cookie.setPath(“/“);
      // 设置Cookie的有效时间:
      cookie.setMaxAge(60_60_24);
      // 回写到浏览器:
      response.addCookie(cookie);
      }
    • 步骤七:编写自动登录的过滤器:
      public class AutoLoginFilter implements Filter{
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {
      }
      @Override
      public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException {
      /*
      判断Session中是否已经存在用户的登录信息:
      已经存在:
      放行.
      不存在:
      从request中获得所有Cookie的信息.
      查找指定名称Cookie:
      没有查询到:
      直接放行.
      查询到:
      获得Cookie中的用户名和密码:
      根据用户名和密码去数据库进行查询:
      查询到用户:
      将用户的信息保存到session中
      放行.
      没有查找到用户:
      Cookie中用户名和密码有可能被篡改.
      放行.
      */
      HttpServletRequest req = (HttpServletRequest) request;
      // 判断Ses-sion中是否有用户的信息.
      User existUser = (User) req.getSession().getAttribute(“existUser”);
      if(existUser != null){
      // 已经存在:
      chain.doFilter(req, response);
      }else{
      // 从Cookie中获取:
      Cookie[] cookies = req.getCookies();
      // 查找指定名称Cookie
      Cookie cookie = CookieUtils.findCookie(cookies, “autoLogin”);
      if(cookie == null){
      // 没有找到指定名称的Cookie:
      chain.doFilter(req, response);
      }else{
      // 找到了指定名称的Cookie:
      // 从Cookie中获得用户名和密码的信息:
      String value = cookie.getValue();
      String username = value.split(“#juwins#”)[0];
      String password = value.split(“#juwins#”)[1];
      // 使用用户名和密码去数据库进行查询:
      UserDao userDao = new UserDao();
      User user = userDao.findByUsernameAndPassword(username, password);
      if(user == null){
      // 用户名或密码错误:
      // Cookie的信息被篡改.
      chain.doFilter(req, response);
      }else{
      // 登录成功:
      req.getSession().setAttribute(“existUser”, user);
      chain.doFilter(req, response);
      }
      }
      }
      } @Override
      public void destroy() {
      }
      }