过滤器(Filter)及监听器(Listener)

过滤器:Filter(重点)

Filter:过滤器,用来过滤网站的数据;

  • 处理中文乱码
  • 登录验证…
步骤:
  1. 导包

  2. 编写过滤器:注意:导包不要错javax.servlet下的)

    实现Filter接口重写对应的方法

    import javax.servlet.*;
    import java.io.IOException;
    
    public class CharacterEncodingFilter implements Filter {
    
        //初始化:web服务器启动,就已经初始化了;随时等待过滤器对象的出现
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("CharacterEncodingFilter初始化");
        }
    
        //Chain:链
        /*
        1. 过滤器中的所有代码,在过滤特定请求的时候都会执行
        2. 必须要让过滤器继续同行
         */
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            servletRequest.setCharacterEncoding("utf-8");
            servletResponse.setCharacterEncoding("utf-8");
            servletResponse.setContentType("text/html;charset=UTF-8");
    
            System.out.println("CharacterEncodingFilter执行前......");
            filterChain.doFilter(servletRequest,servletResponse); //使我们的程序继续执行,如果不写,程序到这里会被拦截停止
            System.out.println("CharacterEncodingFilter执行前......");
        }
    
        //销毁:web服务器关闭时,过滤会销毁
        public void destroy() {
            System.out.println("CharacterEncodingFilter销毁");
        }
    }
    
    
  3. 在web.xml中配置Filter

    <filter>
            <filter-name>CharacterEncodingFilter</filter-name>
            <filter-class>com.lb.filter.CharacterEncodingFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>CharacterEncodingFilter</filter-name>
            <!--只要是/servlet下的任何请求,都会经过这个过滤器-->
            <url-pattern>/servlet/*</url-pattern>
            <!--整个网站都会经过这个过滤器-->
            <!--<url-pattern>/*</url-pattern>-->
        </filter-mapping>
    

监听器:Listener

实现一个监听器的接口:有很多种

以Session为例,步骤:
  1. 编写一个监听器

    实现监听器的接口

    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    
    //统计在线人数:统计session个数:一个session代表一个用户
    public class OnlineCountListener implements HttpSessionListener {
    
        //创建session监听
        //一旦创建session就会触发一次这个事件
        public void sessionCreated(HttpSessionEvent httpSessionEvent) {
            ServletContext ctx = httpSessionEvent.getSession().getServletContext();
    
            System.out.println(httpSessionEvent.getSession().getId());  //只要进来就输出一个Id
    
            Integer onlineCount= (Integer) ctx.getAttribute("统计在线人数");
    
            if (onlineCount == null) {  //如果在线人数为空,就加1
                onlineCount = new Integer(1);
            } else {
                int count = onlineCount.intValue();
                onlineCount = new Integer(count + 1);
            }
    
            ctx.setAttribute("统计在线人数", onlineCount);
        }
    
        //销毁session监听
        //一旦销毁session就会触发一次这个事件
        public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
            ServletContext ctx = httpSessionEvent.getSession().getServletContext();
    
            Integer onlineCount= (Integer) ctx.getAttribute("统计在线人数");
    
            if (onlineCount == null) {  //如果在线人数为空,就加1
                onlineCount = new Integer(0);
            } else {
                int count = onlineCount.intValue();
                onlineCount = new Integer(count - 1);
            }
    
            ctx.setAttribute("统计在线人数", onlineCount);
    
        }
    }
    
    
    /*
    Session销毁:
    1.手动销毁:getSession().invalidate();
    2.自动销毁:在web.xml中配置
     */
    

    补充:Session销毁:1.手动销毁:getSession().invalidate();

    2.自动销毁:在web.xml中配置

    <!--session自动销毁-->
       <session-config>
           <!--1分钟后session销毁-->
           <session-timeout>1</session-timeout>
       </session-config>
    
  2. web.xml注册监听器

    <!--注册监听器-->
        <listener>
            <listener-class>com.lb.listener.OnlineCountListener</listener-class>
        </listener>
    
Filter实现权限拦截
//登录

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取前端请求的参数
        String username = req.getParameter("username");

        if (username.equals("admin")) {  //登录成功
            req.getSession().setAttribute(Constant.USER_SESSION,req.getSession().getId());
            resp.sendRedirect("/sys/success.jsp");
        } else {  //登陆失败
            resp.sendRedirect("/error.jsp");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
//登录失败

public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object user_session = req.getSession().getAttribute(Constant.USER_SESSION);

        if (user_session != null) {
            req.getSession().removeAttribute(Constant.USER_SESSION);
            resp.sendRedirect("/Login.jsp");
        } else {
            resp.sendRedirect("/Login.jsp");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
//添加过滤器

public class SysFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        if (request.getSession().getAttribute(Constant.USER_SESSION) == null) {
            response.sendRedirect("/error.jsp");
        }

        filterChain.doFilter(servletRequest, servletResponse);  //Chain:链:让程序继续往下走
    }

    public void destroy() {

    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值