目录
一、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