学习学习servlet过滤器(javax.servlet.Filter)

本文介绍如何使用Servlet过滤器实现评论内容的筛选功能。通过配置web.xml文件并编写CommentFilter类,可以有效地拦截并检查用户的评论内容,阻止包含特定词汇的评论发布。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习学习servlet过滤器(javax.servlet.Filter)

一、过滤器

    Servlet过滤器Fileter是一个小型的web组件,它们通过拦截请求和响应,以便查看、提取或以某种方式操作客户端和服务器之间交换的数据,实现“过滤”的功能。Filter通常封装了一些功能的web组件,过滤器提供了一种面向对象的模块化机制,将任务封装到一个可插入的组件中, Filter组件通过配置文件来声明,并动态的代理。

二、servlet过滤方法

    过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。javax.servlet.Filter 接口定义了三个方法:

序号方法描述
1public void init(FilterConfig filterConfig)web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
2public void doFilter (ServletRequest, ServletResponse, FilterChain)该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。
3public void destroy()Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。

三、写servlet过滤器

    写一个servlet屏蔽负面评论。

1、在web.xml中配置好servlet和filter

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
    <filter>
        <filter-name>hello</filter-name>
        <filter-class>filter.CommentFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hello</filter-name>
        <url-pattern>/comment</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>h</servlet-name>
        <servlet-class>web.CommentServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>h</servlet-name>
        <url-pattern>/comment</url-pattern>
    </servlet-mapping>
</web-app>

2、在src/main/java下新建一个包,名为web;并且在web包下面新建一个类,名为CommentServlet;

package web;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CommentServlet extends HttpServlet {
    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf8");
        PrintWriter out = response.getWriter();
        String str = request.getParameter("comment");
        out.println("<h1>您发表的评论内容为:" + str + "</h1>");
        out.close();
    }
}

3、在src/main/java下新建一个包,名为filter;并且在filter包下面新建一个类,名为CommentFilter

package filter;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CommentFilter implements Filter {

private String illegalWord;

public void init(FilterConfig filterConfig) throws ServletException {
    illegalWord = filterConfig.getInitParameter("illegalWord");
    System.out.println("过滤器Filter已经开始运行......" + illegalWord);
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;
    req.setCharacterEncoding("UTF-8");
    resp.setContentType("text/html;charset=UTF-8");
    PrintWriter out = resp.getWriter();
    String comment = req.getParameter("comment");
    System.out.println(comment);
    if (comment.indexOf("dam") == -1) {
        out.println("<h1>以隐藏该评论</h1>");
    } else {
        chain.doFilter(req, resp);
    }

}

    public void destroy() {
            System.out.println();
    }
}

4、在src/main/webapp下面新建一个JSP文件,名为comment.jsp;

<%@ page language="java" contentType="text/html; charset=utf8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">;
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf8">
        <title>Insert title here</title>
    </head>
    <body>
        <form action="comment" method="post">
            <fieldset>
            <legend>评论</legend>
            请输入评论:<textarea name="comment" 
            style="vertical-align:middle;width:140px;height:55px;"></textarea><br>
            <input type="submit" value="发表评论"> 
            </fieldset>
        </form>
    </body>
</html>

四、测试

1、在浏览器中输入http://localhost:8089/servlet-test55-filter/comment.jsp ,界面如下:

学习学习servlet过滤器(javax.servlet.Filter)

学习学习servlet过滤器(javax.servlet.Filter)

学习学习servlet过滤器(javax.servlet.Filter)

2、在评论框中输入不含有“dam”的字符串,

学习学习servlet过滤器(javax.servlet.Filter)

点击“发表评论”时,返回结果为

学习学习servlet过滤器(javax.servlet.Filter)

3、在评论框中输入含有“dam”的字符串,

学习学习servlet过滤器(javax.servlet.Filter)

点击“发表评论”,返回的结果为:

学习学习servlet过滤器(javax.servlet.Filter)

转载于:https://blog.51cto.com/doublelinux/2141264

### 配置 `javax.servlet.Filter` 的方法 在 Eclipse 中创建 Servlet 过滤器时遇到缺少 `javax.servlet.Filter` 接口的问题,通常是因为项目未正确引入所需的库或依赖项。以下是解决此问题的具体方式: #### 1. 添加必要的 JAR 文件 确保项目的构建路径中包含了 Java EE 或 Jakarta EE 提供的标准 API 库。可以通过以下步骤完成: - 右键点击项目 -> **Build Path** -> **Configure Build Path...** - 转到 **Libraries** 标签页。 - 如果尚未添加,则单击 **Add Library...**, 然后选择 **Server Runtime** 并继续下一步操作[^3]。 对于大多数情况下,默认服务器运行环境(如 Apache Tomcat)已经提供了 `servlet-api.jar`, 它实现了 `javax.servlet.Filter` 接口的功能。 如果使用 Maven 构建工具管理项目, 则需确认 pom.xml 是否包含如下依赖声明: ```xml <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency> ``` 上述 XML 片段定义了一个范围为 provided 的依赖关系,意味着编译阶段会加载该 jar 包,但在实际部署至容器(比如Tomcat)时不重复打包进去[^2]. #### 2. 创建并实现过滤器类 一旦解决了缺失的库问题之后,就可以着手编写自己的过滤器逻辑了。下面是一个简单的例子展示如何继承自 `HttpServlet` 类以及实现其抽象方法来处理 HTTP 请求/响应拦截功能。 ```java import jakarta.servlet.*; import java.io.IOException; public class ExampleFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Initializing the example filter..."); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Pre-processing logic here before passing control down the line. System.out.println("Before processing the actual servlet."); try{ chain.doFilter(request,response); }finally{ // Post-processing after all other filters and target resource have been processed. System.out.println("After completing execution of downstream components."); } } @Override public void destroy() { System.out.println("Destroying resources used by this filter instance..."); } } ``` 注意这里我们采用的是最新版本Jakarta EE标准中的包名前缀(`jakarta.*`)替代旧版JavaEE系列下使用的命名空间(`javax.*`). 若目标平台仍基于较早规格则应调整相应导入语句匹配实际情况. #### 3. 注册过滤器 最后一步是在 web 应用程序描述符文件(web.xml)里注册新建立起来的过滤器及其适用URL模式。例如: ```xml <filter> <filter-name>exampleFilter</filter-name> <filter-class>com.example.ExampleFilter</filter-class> </filter> <filter-mapping> <filter-name>exampleFilter</filter-name> <url-pattern>/secure/*</url-pattern> </filter-mapping> ``` 通过以上设置即可让指定路径下的资源请求都经过所设定好的ExampleFilter实例加以管控.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值