Java EE基础(21):过滤器概念 + 简单使用(Filter)
一、过滤器
1.概念
Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
也就是在客户端(浏览器)对服务器资源进行访问时,在访问之前对请求与响应进行过滤。
2.作用
在客户端的请求访问后端资源之前,拦截这些请求。
在服务器的响应发送回客户端之前,处理这些响应。
主要两种:
- 当客户端请求来时拦截请求。
- 当服务器响应前,处理响应。
3.使用
- Java 类实现 Filter 接口,并实现它的方法。
- Filter 配置(示例中配置使用了注解,而不是web.xml,因为注解更简单)。
4.类型
根据规范建议的各种类型的过滤器
身份验证过滤器(Authentication Filters)。
数据压缩过滤器(Data compression Filters)。
加密过滤器(Encryption Filters)。
触发资源访问事件过滤器。
等等…
二、简单示例
1.解释
这里为了简单,采用注解配置过滤器(就不在web.xml中配置过滤器了,如有需要请查看其他文章)。
解释:注解是在Servlet 3.0就可以使用的,如我们之前使用过的@WebServlet()注解,使用注解这样我们就不需要再去配置web.xml了。
想使用web.xml 请访问:https://blog.csdn.net/weixin_42247720/article/details/84951633
想了解注解 Servlet 3.0 新特性请访问:https://blog.csdn.net/pan_junbiao/article/details/88414912
2.演示
创建项目并部署,新建一个Servlet。
新建一个class,实现Filter接口,使用注解配置Filter。
过滤器你也可以不使用/ * ,/ * 代表所有请求的路径都拦截了。
客户端访问成功!
控制台看到过滤器起作用。
3.代码
Servlet
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应编码格式
resp.setHeader("content-type", "text/html;charset=utf-8");
// 响应
System.out.println("进入了 MyServlet 的 service 方法!");
resp.getWriter().write("进入了 MyServlet 的 service 方法!");
}
}
Filter
import java.io.IOException;
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;
@WebFilter("/*") // 过滤所有(*代表所有)
public class MyFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化....Filter init...");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 做一些需要过滤的事情
System.out.println("对请求做过滤,do filter...");
// 放行(让请求通过过滤器)
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("过滤器销毁....Filter destroy...");
}
}
三、示例2(统一编码格式设置)
1.需求
在上面,我们学会了过滤器的简单使用,这一篇我们做一个小案例巩固。
我们发现,在每次写Servlet的时候,我们都需要对请求和响应的编码格式进行设置。
所以我们使用过滤器,对所有请求进行统一编码格式设置
2.示例
3.代码
Servlet
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入了 MyServlet 的 service 方法!");
resp.getWriter().write("进入了 MyServlet 的 service 方法!");
}
}
Filter
import java.io.IOException;
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;
@WebFilter("/*") // 过滤所有(*代表所有)
public class MyFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化....Filter init...");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("对请求做过滤,do filter...");
request.setCharacterEncoding("utf-8"); // 设置请求编码格式
System.out.println("对响应做过滤,do filter...");
response.setContentType("text/html;charset=utf-8"); // 设置响应编码格式
// 放行(让请求通过过滤器)
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("过滤器销毁....Filter destroy...");
}
}
其他
参考
Servlet 编写过滤器:https://www.runoob.com/servlet/servlet-writing-filters.html
相关
更多Java EE基础的 Servlet与JSP相关 请点击:【Servlet + JSP】 目录
上一篇: 中国传感器行业正呈现良好发展态势
下一篇: 这些办法招让你“瘫痪”的主机起死回生