黑马程序员技术交流社区

标题: 【南京校区】 java过滤器原理分析以及实现,通过过滤器实... [打印本页]

作者: 大蓝鲸Java    时间: 2018-1-30 13:45
标题: 【南京校区】 java过滤器原理分析以及实现,通过过滤器实...
本帖最后由 大蓝鲸Java 于 2018-1-30 13:53 编辑

1、过滤器

1.1、过滤器的原理
[Java] 纯文本查看 复制代码
1、Filter过滤器,
    □   它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
   
    □   它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理
1.2、过滤器的配置
[Java] 纯文本查看 复制代码
<filter>指定一个过滤器。
        <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空</filter-name>
        <filter-class>元素用于指定过滤器的完整的限定类名。</filter-class>
        <init-param>元素用于为过滤器指定初始化参数
            <param-name>指定参数的名字</param-name>
            <param-value>指定参数的值</param-value>   
         </init-param> 在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
         <init-param>元素用于为过滤器指定初始化参数
            <param-name>指定参数的名字</param-name>
            <param-value>指定参数的值</param-value>   
         </init-param> 在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
    </filter>
    <filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
        <filter-name>子元素用于设置filter的注册名称</filter-name>
        <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)</url-pattern>
    </filter-mapping>
1.3、过滤器的生命周期
[Java] 纯文本查看 复制代码
 当web容器启动的时候,自动调用过滤器的init(FilterConfig arg0)方法来对filter进行初始化,当web关闭,关机,或者reload整个应用时,都会调用destroy()来关闭filter。在容器存活期间,filter过滤器一直是存活的。
1.4、过滤器的自动登陆实现
[Java] 纯文本查看 复制代码
 java
//1、如果session中存在user,直接放行
//2、如果不存在session,到cookie中获取用户名密码
//2.1如果有用户名密码,到数据库查询是否在
//2.1.1如果存在,存在session中,放行
//2.1.2如果不存在,放行。
//2.2如果用户名密码不存在,放行。
               
HttpServletRequest req = (HttpServletRequest)request;

User user = (User)req.getSession().getAttribute("user");

//1、如果session中存在user,直接放行
if(user!=null){
  chain.doFilter(req, response);
}else{
  //session中不存在。到cookie中去查找。ctrl+2   l
  Cookie[] cookies = req.getCookies();
  String userJson = "";
  for (Cookie cookie : cookies) {
    if("user".equals(cookie.getName())){
      userJson = cookie.getValue();
    }
  }

  //cookie中不存在用户信息
  if("".equals(userJson)||userJson==null){
    chain.doFilter(req, response);
  }else{
  
        //cookie中存在用户信息
    user = JsonUtils.jsonToPojo(userJson, User.class);
    QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
    String sql = "select * from user where username = ? and password =?";
    try {
      user = qr.query(sql, new BeanHandler<User>(User.class),user.getUsername(),user.getPassword());
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    if(user==null){
      chain.doFilter(req, response);
    }else{
      req.getSession().setAttribute("user", user);
      chain.doFilter(req, response);
    }
  }
}

作者: Yin灬Yan    时间: 2018-1-30 15:11
我来占层楼啊   




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2