JavaWeb之过滤器与监听器

十一、过滤器与监听器

目录:Filter(重点)、监听器、过滤器 监听器的常见应用

1.Filter(重点)

Filter:过滤器,用来过滤网站的数据,如处理中文乱码、登录验证…
过滤器的使用

Filter开发步骤
①导报
注意:Filter使用的是Filter(javax.servlet)。
②编写过滤器
实现Filter接口,重写对应的方法接口。
以防中文乱码为例

package com.ping.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 : 链
  /*
  Ⅰ过滤中的所有代码,在过滤特定请求的时候都会执行。
  Ⅱ必须要让过滤器继续同行。
  chain.doFilter(request,response);
  */
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=UTF-8");
    System.out.println("CharacterEncodingFilter执行前...");
    chain.doFilter(request,response); //如果不写,程序到这里就被拦截停止
    System.out.println("CharacterEncodingFilter执行后...");
  }
  //销毁:web服务器关闭的时候,过滤会销毁
  public void destroy() {
    System.out.println("CharacterEncodingFilter销毁");
  }
}

③在web.xml中配置Filter

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

2.监听器

编写一个监听器
①实现监听器的接口。

package com.ping.listener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
//统计网站在线人数 : 统计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);
  }
}

②在前端取出实现

<h1>当前有<span><%=this.getServletConfig().getServeltContext().getAttribute("OnlineCount")%></span>人在线</h1>

③在web.xml中注册监听器

com.ping.listener.OnlineCountListener

Session销毁
①手动销毁

getSession().invalidate();

②自动销毁

<session-config>
  <session-timeout>1</session-timeout>
</session-config>

3.过滤器、监听器常见应用

1)监听器在GUI编程中经常使用

package com.ping.listener;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class TestPanel {
  public static void main(String[] args) {
    Frame frame = new Frame("Hello World");  //新建一个窗体
    Panel panel = new Panel(null); //面板
    frame.setLayout(null); //设置窗体的布局
    frame.setBounds(300,300,500,500);
    frame.setBackground(new Color(0,0,255)); //设置背景颜色
    panel.setBounds(50,50,300,300);
    panel.setBackground(new Color(0,255,0)); //设置背景颜色
    frame.add(panel);
    frame.setVisible(true);
    //监听事件,监听关闭事件
    frame.addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent e) {
        super.windowClosing(e);
      }
    });
  }
}

2)用户登录之后才能进入主页,用户注销后就不能进入主页了。
①用户登录之后,向Sesison中放入用户的数据。
②进入主页的时候要判断用户是否已经登录,要求在过滤器中实现。

package com.ping.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
  public void init(FilterConfig filterConfig) throws ServletException { }
  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;
    if (request.getSession().getAttribute(Constant.USER_SESSION)==null){
      response.sendRedirect("/error.jsp");
    }
    chain.doFilter(request,response);
  }
  public void destroy() { }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值