【JavaWeb开发-Servlet】初识过滤器(Filter)

目录

一、ChatGPT解答什么是Servlet Filter

二、创建一个信息过滤器

1、新建项目

2、添加service-api.jar包

3、创建两个包 

4、创建一个测试页面a.jsp

5、在servlet包下创建一个servlet类

6、在filter包下创建一个过滤器类

7、编辑web.xml

8、启动服务进行测试

三、字符长度过滤器

1、创建一个过滤器类

2、修改部署文件

3、测试效果

四、过滤器的生命周期



一、ChatGPT解答什么是Servlet Filter

 

 

二、创建一个信息过滤器

1、新建项目

        新建项目前确保eclipse已经关联了Tomcat服务器。【JavaWeb开发-Servlet】day02-使用eclipse实现Servlet开发_代码骑士的博客-CSDN博客

2、添加service-api.jar包

3、创建两个包 

 

 4、创建一个测试页面a.jsp

a.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<form action="a" method="post">
		请输入你的留言:<input name="msg" >
		<input type="submit" value="提交">
	</form>
</body>
</html>

 将项目添加到服务器

输入网址http://127.0.0.1:8080/filterDemo/a.jsp查看页面效果 

5、在servlet包下创建一个servlet类

MsgServlet.class

package com.ck.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MsgServlet extends HttpServlet {
	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String msg=request.getParameter("msg");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		out.println(msg);
	}

}

 6、在filter包下创建一个过滤器类

 MsgFilter.class

package com.ck.filter;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MsgFilter implements Filter{

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2)
			throws IOException, ServletException {
			HttpServletRequest req=(HttpServletRequest)request;
			request.setCharacterEncoding("utf-8");
			String msg=request.getParameter("msg");
			HttpServletResponse res=(HttpServletResponse)response;
			res.setContentType("text/html;charset=utf-8");
			PrintWriter out=res.getWriter();
			if(msg.indexOf("NT")>=0){
				out.println("你的信息当中有不文明词语,请重新输入");
				return;
			}
			//让这个请求通过 过滤器进入进入到后面的Servlet当中
			//FileterChain 表示过滤器链 调用它的doFilter方法可以让请求继续调用后续的其他过滤器 
			//如果没有其他过滤器 就调用对应Servlet组件
			arg2.doFilter(request, response);
		
	}

}












7、编辑web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
	
	<!-- Filter -->
	<filter>
		<filter-name>f1</filter-name>
		<filter-class>com.ck.filter.MsgFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>f1</filter-name>
		<url-pattern>/a</url-pattern>
	</filter-mapping>
	
	
	
	
	<!-- Servlet -->
	<servlet>
		<servlet-name>msg</servlet-name>
		<servlet-class>com.ck.servlet.MsgServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>msg</servlet-name>
		<url-pattern>/a</url-pattern>
	</servlet-mapping>
</web-app>

8、启动服务进行测试

 三、字符长度过滤器

**如果项目中有多个过滤器,过滤器会按照xml中从上至下的顺序依次执行。

1、创建一个过滤器类

LengthFilter.class

package com.ck.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.annotation.WebFilter;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LengthFilter extends HttpFilter implements Filter {
       
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2)
			throws IOException, ServletException {
			HttpServletRequest req=(HttpServletRequest)request;
			request.setCharacterEncoding("utf-8");
			String msg=request.getParameter("msg");
			HttpServletResponse res=(HttpServletResponse)response;
			res.setContentType("text/html;charset=utf-8");
			PrintWriter out=res.getWriter();
			if(msg.length()>10){
				out.println("您输入的字符长度大于10,请重新输入");
				return;
			}
			//让这个请求通过 过滤器进入进入到后面的Servlet当中
			//FileterChain 表示过滤器链 调用它的doFilter方法可以让请求继续调用后续的其他过滤器 
			//如果没有其他过滤器 就调用对应Servlet组件
			arg2.doFilter(request, response);
		
	}

}

 2、修改部署文件

 过滤按照排列顺序依次执行

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
	
	<!-- Filter -->
	<filter>
		<filter-name>f1</filter-name>
		<filter-class>com.ck.filter.MsgFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>f1</filter-name>
		<url-pattern>/a</url-pattern>
	</filter-mapping>
	
		<filter>
		<filter-name>f2</filter-name>
		<filter-class>com.ck.filter.LengthFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>f2</filter-name>
		<url-pattern>/a</url-pattern>
	</filter-mapping>
	
	
	
	<!-- Servlet -->
	<servlet>
		<servlet-name>msg</servlet-name>
		<servlet-class>com.ck.servlet.MsgServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>msg</servlet-name>
		<url-pattern>/a</url-pattern>
	</servlet-mapping>
</web-app>

3、测试效果

 

示例流程图:

上面的例子充分说明了过滤器的两大功能:

 

下面我们将结合过滤器的生命周期,学习使用过滤器链。 

四、过滤器的生命周期

        **过滤器是一种简单的面向切面的编程应用,在生命周期内可以在不不停止服务器工作的情况下修改部署文件对切面对象进行更新。

        什么是面向切面编程:

        面向对象编程:

 定义初始化方法:

        在MsgFilter类定义变量String,并在初始化函数中赋值。在indexOf(str)函数中传入str参数。

package com.ck.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 MsgFilter implements Filter{

	String str;
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		str = "NT";
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2)
			throws IOException, ServletException {
			HttpServletRequest req=(HttpServletRequest)request;
			request.setCharacterEncoding("utf-8");
			String msg=request.getParameter("msg");
			HttpServletResponse res=(HttpServletResponse)response;
			res.setContentType("text/html;charset=utf-8");
			PrintWriter out=res.getWriter();
			if(msg.indexOf(str)>=0){
				out.println("你的信息当中有不文明词语,请重新输入");
				return;
			}
			//让这个请求通过 过滤器进入进入到后面的Servlet当中
			//FileterChain 表示过滤器链 调用它的doFilter方法可以让请求继续调用后续的其他过滤器 
			//如果没有其他过滤器 就调用对应Servlet组件
			arg2.doFilter(request, response);
		
	}

}












使用xml配置文件调用初始化方法

        这样做以后就可以只修改xml文件就能改变过滤器内容了,而不需要每次都重新编译java代码。

修改配置文件web.xml

<!-- MsgFilter -->
	<filter>
		<filter-name>f1</filter-name>
		<filter-class>com.ck.filter.MsgFilter</filter-class>
		<!-- 初始化参数设置 -->
		<init-param>
			<param-name>str</param-name>
			<param-value>dog</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>f1</filter-name>
		<url-pattern>/a</url-pattern>
	</filter-mapping>

  返回MsgFilter类,通过init方法中的参数filterConfig将xml文件中的param-value传递给str。

package com.ck.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 MsgFilter implements Filter{

	String str;
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// 过滤器的初始化方法
		str = filterConfig.getInitParameter("str");
		
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2)
			throws IOException, ServletException {
			HttpServletRequest req=(HttpServletRequest)request;
			request.setCharacterEncoding("utf-8");
			String msg=request.getParameter("msg");
			HttpServletResponse res=(HttpServletResponse)response;
			res.setContentType("text/html;charset=utf-8");
			PrintWriter out=res.getWriter();
			if(msg.indexOf(str)>=0){
				out.println("你的信息当中有不文明词语,请重新输入");
				return;
			}
			//让这个请求通过 过滤器进入进入到后面的Servlet当中
			//FileterChain 表示过滤器链 调用它的doFilter方法可以让请求继续调用后续的其他过滤器 
			//如果没有其他过滤器 就调用对应Servlet组件
			arg2.doFilter(request, response);
		
	}

}

这样就可以每次通过修改xml文件的param-value值来修改过滤内容了,而不用每次都重新编译java代码。

项目资源:

链接:https://pan.baidu.com/s/13Ddte-tDLw65IR0vwTAGrQ 
提取码:4quc 
 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码骑士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值