Filter和监听器

Filter(重点)

Filter:过滤器,用来过滤网站的数据;
处理中文乱码
登陆验证。。。

在这里插入图片描述Filter开发步骤:
1导包
2编写过滤器
1导包Filter导Servlet下的
2重写三个方法
3编写要过滤的内容
4在web.xml文件中进行配置
注意这个: filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序到这里就停止了
例子:

public class CharaterEncodingFilter implements Filter {

//web服务器启动就初始化了,随时等待过滤对象
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化");
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//Chain 链
//1过滤中的所有代码,再过滤特定请求的时候都会执行
//2必须要让过滤器继续通行    filterChain.doFilter(servletRequest,servletResponse);
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=UTF-8");
        System.out.println("filterChain执行前");
        filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序到这里就停止了
        System.out.println("执行后");
    }
//web服务器关闭才会销毁
    public void destroy() {
        System.out.println("销毁");
    }
}

web.xml配置

  <filter>
        <filter-name>filter</filter-name>
    <filter-class>com.xxr.filter.CharaterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filter</filter-name>
        <!--只要是/servlet下面的任何请求,都会过滤-->
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>

监听器

实现监听器的接口
正确代码

//统计网站在线人数 : 统计session
public class OnlineCountListener implements HttpSessionListener {

    //创建session监听: 看你的一举一动
    //一旦创建Session就会触发一次这个事件!
    public void sessionCreated(HttpSessionEvent se) {
        ServletContext ctx = se.getSession().getServletContext();

        System.out.println(se.getSession().getId());

        Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");

        if (onlineCount==null){
            onlineCount = new Integer(1);
        }else {
            int count = onlineCount.intValue();
            onlineCount = new Integer(count+1);
        }

        ctx.setAttribute("OnlineCount",onlineCount);

    }

    //销毁session监听
    //一旦销毁Session就会触发一次这个事件!
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext ctx = se.getSession().getServletContext();

        Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");

        if (onlineCount==null){
            onlineCount = new Integer(0);
        }else {
            int count = onlineCount.intValue();
            onlineCount = new Integer(count-1);
        }

        ctx.setAttribute("OnlineCount",onlineCount);

    }


    /*
    Session销毁:
    1. 手动销毁  getSession().invalidate();
    2. 自动销毁
     */
}

我的问题代码

  public void sessionCreated(HttpSessionEvent se) {
        HttpSession session = se.getSession();
      
        Integer onlincount = (Integer) session.getAttribute("onlincount");
        System.out.println(se.getSession().getId());
     //   Integer onlincount = (Integer) ctx.getAttribute("onlincount");
        //listener=  new Integer(1);
        if(onlincount==null)
          // onlincount=new Integer(1);
            onlincount=1;
        else {
            //int i = onlincount.intValue();
            //onlincount= i+1;
            onlincount= onlincount+1;
        }
        session.setAttribute("onlincount",onlincount);

    }
//销毁SESSION监听
    //一旦销毁session就会触发这个事件
    public void sessionDestroyed(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        Integer onlincount = (Integer) session.getAttribute("onlincount");
        System.out.println(se.getSession().getId());
        //   Integer onlincount = (Integer) ctx.getAttribute("onlincount");
        //listener=  new Integer(1);
        if(onlincount==null)
            // onlincount=new Integer(1);
            onlincount=0;
        else {
            //int i = onlincount.intValue();
            //onlincount= i+1;
            onlincount= onlincount-1;
        }
        session.setAttribute("onlincount",onlincount);

    }

遇到的问题在自己写代码时只写了
request.getSession().getAttribute();
发现通过打开第二个浏览器人数并不增加,最终发现
ServletContext > Session > Request > Page,这是从大到小的范围

ServletContext:是全局的,所有Session都可取到。el中用 applicationScope

Session:整个会话中的。el中用 sessionScope

Request:当前请求中的。el中用 requestScope

Page:只是当前页面中的。el中用 pageScope

写request.getSession().getServletContext().setAttribute(“abc”,123);,当然从session中取不到了,用 {applicationScope.abc} 可取到

如果不指定范围,用 {abc} 也可取到,它是按 从小到大 的顺序进行查找

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值