记录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应用的健壮性。