记录4

JavaWeb每日学习记录(第4天):过滤器(Filter)与监听器(Listener)

今天是JavaWeb学习的第六天,我主要学习了过滤器(Filter)和监听器(Listener)的概念、作用以及它们在Web应用中的实际应用。这两个组件是JavaWeb中非常重要的技术,它们可以用于实现日志记录、权限控制、资源统计等功能,进一步增强了Web应用的灵活性和可维护性。


一、过滤器(Filter)

过滤器是JavaWeb中用于拦截请求和响应的组件,它可以在请求到达Servlet之前或响应返回客户端之前执行一些操作。例如,可以用于日志记录、权限验证、字符编码设置等。

示例1:实现一个字符编码过滤器

在Web开发中,字符编码问题是一个常见的问题。为了避免乱码,我编写了一个字符编码过滤器,用于统一设置请求和响应的编码格式。

字符编码过滤器(CharacterEncodingFilter.java)

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

@WebFilter("/*")  // 拦截所有请求
public class CharacterEncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("字符编码过滤器初始化...");
    }

    @Override
    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");

        // 继续后续的请求处理
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        System.out.println("字符编码过滤器销毁...");
    }
}

通过这个过滤器,我可以确保所有请求和响应都使用UTF-8编码,从而避免了乱码问题。

示例2:实现一个登录权限过滤器

在Web应用中,某些页面或功能可能需要用户登录后才能访问。我编写了一个登录权限过滤器,用于检查用户是否已经登录。如果用户未登录,则重定向到登录页面。

登录权限过滤器(LoginFilter.java)

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

@WebFilter("/home.jsp")  // 拦截特定页面
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("登录权限过滤器初始化...");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        // 获取session中的用户信息
        HttpSession session = req.getSession(false);
        String username = (session != null) ? (String) session.getAttribute("username") : null;

        if (username != null) {
            // 用户已登录,继续后续处理
            chain.doFilter(request, response);
        } else {
            // 用户未登录,重定向到登录页面
            resp.sendRedirect("login.jsp?error=login");
        }
    }

    @Override
    public void destroy() {
        System.out.println("登录权限过滤器销毁...");
    }
}

通过这个过滤器,我可以保护需要登录才能访问的页面,确保用户在未登录时无法直接访问这些资源。


二、监听器(Listener)

监听器是JavaWeb中用于监听Web应用中的事件(如请求、会话、上下文的创建和销毁)的组件。它可以用于统计在线人数、初始化全局变量等。

示例3:实现一个在线人数统计监听器

我编写了一个监听器,用于统计当前在线人数。通过监听HttpSession的创建和销毁事件,我可以实时更新在线人数。

在线人数统计监听器(OnlineCountListener.java)

import javax.servlet.*;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
public class OnlineCountListener implements HttpSessionListener {
    private int count = 0;  // 在线人数

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        count++;
        se.getSession().getServletContext().setAttribute("onlineCount", count);
        System.out.println("当前在线人数:" + count);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        if (count > 0) {
            count--;
        }
        se.getSession().getServletContext().setAttribute("onlineCount", count);
        System.out.println("当前在线人数:" + count);
    }
}

在JSP页面中,我可以通过以下方式显示当前在线人数:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>在线人数统计</title>
</head>
<body>
    <h1>当前在线人数:<%= application.getAttribute("onlineCount") %></h1>
</body>
</html>

通过这个监听器,我可以实时统计在线人数,并在页面中动态显示。


三、总结

今天我学习了过滤器和监听器的概念及其在JavaWeb中的应用。过滤器可以用于拦截请求和响应,实现字符编码设置、权限验证等功能;监听器可以用于监听Web应用中的事件,实现在线人数统计、资源初始化等功能。

通过编写字符编码过滤器、登录权限过滤器和在线人数统计监听器,我掌握了这两个组件的实际应用,并感受到了它们在Web开发中的重要性。明天,我计划学习JavaWeb中的异常处理机制,进一步完善Web应用的健壮性。

posted @ 2025-02-19 20:12  马瑞鑫03  阅读(15)  评论(0)    收藏  举报