Filter与Listener

Filter过滤器

定义

sun公司制定的一种规范,用于处理拦截Servlet的请求并处理通用的逻辑

定义过滤器

  1. 定义java类,实现Filter接口:使用javax.servlet.*包
  2. 重写抽象方法:init、doFilter、destory
  3. 配置过滤器:最好回链,给下一个过滤器使用

流程

优先级

  1. 当多个filter作用在web组件上,过滤器调用的顺序与web.xml文件中的filter-mapping配置的顺序有关
  2. 如果是注解,优先级与类名的字符顺序有关

优点

  1. 灵活,可“插拔性”较好,当需要新增或者减少一个功能时,通过配置快速实现,而且不会影响之前的功能
  2. 当多个web组件有相同的逻辑需要实现时,可以使用filter处理共同的逻辑,便于后期扩展与维护

注解

@WebFilter("/comment/*") //过滤一种servlet
@WebFilter(urlPatterns = {"*.admin", "*.userInfo"})	//过滤多种servlet

基本使用

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/filter/showServlet")
public class showServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("老污龟");
    }
}

package filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/filter/*")
public class CharacterEncodingFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器初始化创建");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //设置编码方式
        response.setCharacterEncoding("utf-8");
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html");
        System.out.println("执行前");
        chain.doFilter(request, response);
        System.out.println("执行后");
    }

    public void destroy() {
        System.out.println("过滤器销毁");
    }
}

不使用注解,web.xml配置

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/filter/*</url-pattern>
    </filter-mapping>

练习

需求

​ 写一个CommentFilter2,判断评论内容的长度是否超过20,如果超过,输出内容过长,反之,继续调用后续的组件

代码实现

package filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/comment/*")
public class LengthFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        String comment = servletRequest.getParameter("comment");
        if (comment.length() > 20) {
            servletResponse.getWriter().write("评论内容超长");
        } else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }

    @Override
    public void destroy() {

    }
}

监听器

定义

sun公司制定的个特殊的类,用来监听容器中产生的一些事件并做相应的处理

两类事件:

  • 第一类:与生命周期相关的事件,比如容器中创建或者销毁了request,session,servletContext对象可以进行监听
  • 第二类:绑定事件,比如调用了request/session/servletContext三个对象的setAttribute(),removeAttribute()方法

定义监听器

  1. 定义java类,实现特定的接口
  2. 重写方法
  3. 配置监听器

案例

需求

监听当前页面在线人数

代码实现

package listener;

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

public class OnlineCountListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent se) {
        ServletContext context = se.getSession().getServletContext();
        Integer onlineCount = (Integer) context.getAttribute("onlineCount");
        if (onlineCount == null) {
            onlineCount = 1;
        } else {
            onlineCount++;
        }
        context.setAttribute("onlineCount", onlineCount);
    }

    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext context = se.getSession().getServletContext();
        //se.getSession().invalidate();//销毁
        Integer onlineCount = (Integer) context.getAttribute("onlineCount");
        if (onlineCount == null) {
            onlineCount = 0;
        } else {
            onlineCount--;
        }
        context.setAttribute("onlineCount", onlineCount);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<h1>当前有<span><%=this.getServletConfig().getServletContext().getAttribute("onlineCount")%></span> 人在线</h1>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值