简述: JavaWeb中的监听器和过滤器他们的用法详解。

本文初发于 “曾晨de小站” zengchen233.cn,同步转载于此。

过滤器Filter

比如说写一个LoginDemo

用户登录之后才能进入主页!用户注销后就不能进入主页了!

  1. 用户登录之后,向Sesison中放入用户的数据

  2. 进入主页的时候要判断用户是否已经登录;要求:在过滤器中实现!

我们可以使用过滤器来过滤掉非法请求,示例代码如下:

package cn.zengchen233.filter;

import cn.zengchen233.util.Constant;

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

public class SysFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        if (req.getSession().getAttribute(Constant.USER_SESSION) == null) {
            resp.sendRedirect("/500.jsp");
        }
        chain.doFilter(req, resp);
    }
}

上述代码讲的是过滤掉/sys/*下面的全部请求,如果没有这个Session就会把你重定向到/500.jsp这么页面底下,完美解决了登陆问题,完整代码:LoginDemo

监听器Listener

监听器可以用来监听很多事件的发生,一般用在gui编程当中,此处是web编程用来监听在线人数,示例代码:

package cn.zengchen233.listener;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnlineCountListener implements HttpSessionListener {
    @Override
    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);
    }

    @Override
    public void sessionDestroyed(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);
    }
}

此处用到了装箱拆箱,这块地方还不怎么懂,还需要复习复习Java SE。