过滤器和监听器

  1. 过滤器  Filter

   1.1 概念

       在浏览器和目标资源之间进行过滤的中间组件。

       请求到达目标资源之前进行过滤。

       响应到达浏览器之前进行过滤。

   1.2 定义过滤器的步骤

      1. 写一个java类,实现Filter接口

    public class FirstFilter implements Filter {
    /**
     * 初始化方法
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("FirstFilter初始化的方法....");
    }

    /**
     * 处理过滤请求的方法
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("FirstFilter请求到达目标资源之前执行....");
        //放行
        filterChain.doFilter(request,response);
        System.out.println("FirstFilter响应到达浏览器之前在执行....");
    }

    /**
     * 销毁方法
     */
    @Override
    public void destroy() {
        System.out.println("FirstFilter的销毁的方法...");
    }

   2. 配置哪些目标资源需要经过过滤器 (两种方式)

      1. web.xml进行配置

<filter>
    <filter-name>firstFilter</filter-name>
    <filter-class>filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>firstFilter</filter-name>
    <!--配置路径:指定哪些目标资源经过过滤器-->
    <url-pattern>/index.jsp</url-pattern>
</filter-mapping>

     2. 在类上使用注解方式进行配置

@WebFilter(filterName = "EncodingFilter",urlPatterns = "/*")
public class FirstFilter implements Filter {

}

  

  1.3 执行原理 (生命周期)

     1. 服务器启动时,加载web.xml以及扫描@WebFilter注解,

创建filter对象,调用init()进行初始化(执行1次)

     2. 请求过滤器过滤的目标资源,调用doFilter()方法 (执行多次)。

        如果遇到filterChain.doFilter(request,response);则进行放行,

进入下一个过滤器或目标资源。

    3.服务器停止时,调用destroy()销毁方法(执行1次)

  

  1.4 过滤器链

     过滤器链:由多个过滤器组成。

执行顺序:web.xml配置方式,与<filter-mapping>配置顺序有关,在前面的先执行。

         @WebFilter注解方式,顺序按照过滤器名称字母字典顺序一次执行.

如AFilter比BFilter先执行。

    核心代码:filterChain.doFilter(request,response);放行进入下一个过滤器或目标资源。

  

  1.5 典型应用

      1. 设置统一字符编码

      2. 登录验证

      3. 敏感字符的替换

1.设置统一字符编码

2.登录验证

  1. 监听器  Listener

   1. 概念

      监听对象的创建和销毁

      监听对象的属性操作。(增加、修改、删除)

   2. 分类

      监听域对象的创建和销毁

        ServletRequestListener

        HttpSessionListener

        ServletContextListener

      监听对象的属性操作

        ServletRequestAttributeListener

        HttpSessionAttributeListener

        ServletContextAttributeListener

   3. 典型应用

      1. 统计在线人数

   4. 统计在线人数实现步骤

      1. 创建一个Listener监听器的类,监听session创建和销毁。实现HttpSessionListener

/**
 * 监听session的创建
 */
@WebListener
public class OnlineNumListener implements HttpSessionListener{

    public OnlineNumListener() {
    }
    /**
     * 监听session对象创建调用,在线人数+1
     */
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        ServletContext application=se.getSession().getServletContext();
        if(application.getAttribute("count")!=null){
            int count =(int)application.getAttribute("count");
            application.setAttribute("count",count+1);
        }else{
            application.setAttribute("count",1);
        }
    }
    /**
     * 监听session销毁调用,在线人数-1
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext application=se.getSession().getServletContext();
        int count =(int)application.getAttribute("count");
        application.setAttribute("count",count-1);
    }
}

   2. 编写jsp页面展示在线人数

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <body>
     <h2>在线人数:${count}</h2>
     <a href="exitServlet">退出</a>
  </body>
</html>

  3. 退出

@WebServlet(name = "ExitServlet", value = "/exitServlet")
public class ExitServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session=request.getSession();
        //销毁session
        session.invalidate();
    }
}

解决控制台乱码问题

IDEA 控制台中文乱码4种解决方案_java_脚本之家IntelliJ IDEA 如果不进行相关设置,可能会导致控制台中文乱码、配置文件中文乱码等问题,本文主要介绍了IDEA控制台中文乱码4种解决方案,具有一定的参考价值,感兴趣的可以了解一下icon-default.png?t=O83Ahttps://www.jb51.net/program/323537olj.htm

### Java Servlet 过滤器监听器概念 #### 一、过滤器 (Filter) 过滤器是在请求到达目标资源之前执行的一段代码,可以用来拦截客户端发送到服务器端的请求并做预处理。通过配置多个过滤器形成链式结构来实现复杂的功能。 - **作用** - 对用户请求进行统一编码设置。 - 权限验证:判断是否有权限访问某些页面或接口。 - 日志记录:记录用户的操作行为以便后续分析。 - **定义方式** 要创建一个自定义过滤器类,需继承`javax.servlet.Filter`接口,并重写其中的方法: ```java public class MyCustomFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // 执行一些前置逻辑... // 继续传递给下一个过滤器或者最终的目标Servlet/Resource chain.doFilter(request,response); // 可选地,在这里也可以放置后置逻辑... } } ``` 为了使该过滤器生效,还需要将其注册至web应用中,通常在部署描述符文件(web.xml)内完成此工作[^1]。 #### 二、监听器 (Listener) 监听器能够捕获Web应用程序生命周期内的特定事件的发生时刻,比如会话(session)被创建或销毁时触发相应的动作;还可以监控属性的变化情况等。这有助于开发者更好地管理状态信息以及响应环境变动带来的影响。 - **种类及其用途** - `ServletContextListener`: 当整个Web App启动或关闭的时候会被激活,可用于初始化全局变量或是清理临时数据。 - `HttpSessionListener`: 跟踪HTTP Session对象的状态变化,如新建立连接或者是断开链接之后的操作。 - 属性变更监听者(`AttributeListener`)系列则专注于监视容器内部存储的数据项增删改的情况。 下面是一个简单的例子展示了如何编写一个实现了`ServletContextListener`接口的监听器: ```java import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class ContextLoaderListener implements ServletContextListener{ private static final String INIT_PARAM_NAME="initParam"; @Override public void contextInitialized(ServletContextEvent sce){ System.out.println("Application is starting..."); // 获取context参数 String paramValue=sce.getServletContext().getInitParameter(INIT_PARAM_NAME); if(paramValue!=null && !paramValue.isEmpty()){ // Do something with the parameter value. }else{ throw new IllegalStateException("Missing required initialization parameter."); } } @Override public void contextDestroyed(ServletContextEvent sce){ System.out.println("Application is shutting down..."); // Perform cleanup tasks here. } } ``` 上述代码片段里声明了一个名为`ContextLoaderListener` 的监听器实例,它会在项目加载初期读取指定名称的应用级配置参数,并且在整个服务停止前负责释放占用资源等工作[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值