Java-Filter过滤器

2362 / 2026-08-03 12:15:20 战力提升

Filter 什么是过滤器Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器Filter 过滤器它是 JavaEE 的规范。也就是接口Filter 过滤器它的作用是:拦截请求,过滤响应。拦截请求常见的应用场景有:权限检查日记操作事务管理 ……等等Filter 的初体验 要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源(html 页面、jpg 图片、jsp 文件、等等)都必 须是用户登录之后才允许访问。

思考 :根据之前我们学过内容。我们知道,用户登录之后都会把用户登录的信息保存到 Session 域中。所以要检查用户是否 登录,可以判断 Session 中否包含有用户登录的信息即可!!!

{collapse-item label="问题答案"}

代码语言:javascript复制<% Object user = session.getAttribute("user");

// 如果等于 null,说明还没有登录

if (user == null) { request.getRequestDispatcher("/login.jsp").forward(request,response); return; }

%>{/collapse-item}

Filter开发步骤导包

代码语言:javascript复制4.0.0

org.example

javaWeb-filter

1.0-SNAPSHOT

13

13

javax.servlet

javax.servlet-api

4.0.1

javax.servlet.jsp

jsp-api

2.1

javax.servlet.jsp.jstl

jstl-api

1.2

taglibs

standard

1.1.2

mysql

mysql-connector-java

5.1.47注意 :导入jar包时,一定要导入servlet下面的Filter

编写过滤器

代码语言:javascript复制package com.yu.filter;

import javax.servlet.*;

import java.io.IOException;

public class CharacterEncodingFilter implements Filter {

@Override

//web服务器启动,就已经初始化了

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println("初始化...");

ServletContext context = filterConfig.getServletContext();

}

@Override

//chain 过滤链

/*

过滤器中的所有代码,在过滤特定请求的时候,都会执行

必须要让过滤器继续通行(把请求向后转交

*/

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("执行前...");

chain.doFilter(request,response);

}

@Override

//web服务器关闭时,过滤器会销毁

public void destroy() {

System.out.println("已销毁");

}

}在web.xml中配置过滤器

代码语言:javascript复制 show

com.yu.servlet.ShowServlet

show

/servlet/show

show

/show

charsetFilter

com.yu.filter.CharacterEncodingFilter

charsetFilter

/servlet/*

show

show在 filter-mapping 中,可以配置多条 servlet-name,实现对servlet的精确过滤

群体过滤用 url-pattern,可以过目某个目录的所有 servlet 文件,星号是通配符

Listener: 监听器编写一个监听器

实现一个监听器的接口

覆盖重写方法

代码语言:javascript复制package com.yu.listener;

import javax.servlet.ServletContext;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

//统计网站在线人数

public class OnlineCountListener implements HttpSessionListener{

@Override

public void sessionCreated(HttpSessionEvent se) {

ServletContext context = se.getSession().getServletContext();

System.out.println(se.getSession().getId());

Integer onlineCount = (Integer) context.getAttribute("OnlineCount");

if (onlineCount==null){

onlineCount=1;

}else {

int count=onlineCount.intValue();

onlineCount=count+1;

}

context.setAttribute("OnlineCount",onlineCount);

}

@Override

public void sessionDestroyed(HttpSessionEvent se) {

ServletContext context = se.getSession().getServletContext();

Integer onlineCount = (Integer) context.getAttribute("OnlineCount");

if (onlineCount==null){

onlineCount=1;

}else {

int count=onlineCount.intValue();

onlineCount=count-1;

}

context.setAttribute("OnlineCount",onlineCount);

}

}配置监听器

在web.xml中对监听器进行配置

代码语言:javascript复制com.yu.listener.OnlineCountListener