过滤器
常见应用
- 拦截请求
- 处理中文乱码
- 登录验证(权限检查)
Filter过滤器的使用步骤
- 编写一个类去实现Filter接口
- 实现过滤方法 doFilter()
- 到 web.xml中去配置 Filter的拦截路径。
乱码解决Filter代码演示
servlet程序
package com.tian.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("乱码测试");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Filter过滤器
package com.tian.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
//初始化 web服务器启动,就已经初始化了,随时等待规律对象出现!
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter初始化");
}
/**
*chain : 链
* 过滤中的所有代码。在过滤特定请求的时候都会执行
* 必须要让过滤器继续通行
* filterChain.doFilter(request,response);
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("CharacterEncodingFilter执行前");
filterChain.doFilter(request,response);//让我们的请求继续走,如果不写,程序到这里就停止了
System.out.println("CharacterEncodingFilter执行后");
}
//销毁 web服务器关闭的时候,过滤会销毁
public void destroy() {
System.out.println("CharacterEncodingFilter销毁");
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.tian.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/servlet/myServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.tian.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!-- 只要是 /servlet的任何请求,都会经过这个过滤器 -->
<url-pattern>/servlet/*</url-pattern>
<!-- <url-pattern>/*</url-pattern>-->
</filter-mapping>
</web-app>
多个过滤器执行注意细节图解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XfjrrMRc-1628157283497)(30-过滤器Filter.assets/48.png)]
Filter的拦截路径
精确匹配
<url-pattern>/login.jsp</url-pattern>
目录匹配
<url-pattern>/admin/*</url-pattern>
后缀名匹配(注意不要斜杠开头)
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.do</url-pattern>
<url-pattern>*.abc</url-pattern>
**Filter过滤器它只联心请求的地址是否匹配,不关心请求的资源是否存在! ! ! **