【学习笔记】Filter 过滤器
过滤器的作用:用来过滤网站的数据(处理中文乱码、登录验证....)
过滤器加在服务器和servlet、jsp、静态资源 中间,用来过滤服务器的请求
我们以处理乱码问题为例:
之前处理乱码都是在servlet中设置 setCharacterEncoding("utf-8"),但如果servlet数量太多,我们不可能在每一个servlet中都这样设置,所以我们可以在过滤器中去设置。
步骤:
-
编写过滤器
-
实现Filter接口,
-
导包,注意一定要导入servlet包下的Filter
-
重写方法 init() 初始化、destory() 销毁、doFilter() 实现过滤
import jakarta.servlet.*; import java.io.IOException; public class CharacterEncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("过滤器初始化"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;Character=UTF-8"); servletRequest.setCharacterEncoding("utf-8"); filterChain.doFilter(servletRequest,servletResponse); //让请求继续执行,如果不写就被截断在这里了 } @Override public void destroy() { System.out.println("过滤器销毁"); } }
注意点:在doFilter()方法中,必须要写filterChain.doFilter(servletRequest,servletResponse)
必须让过滤器继续通行
过滤器中的所有代码,在过滤特定请求的时候都会执行,意思就是要配置过滤器,使过滤器在什么请求下可以使用
-
-
配置过滤器
<filter> <filter-name>CharacterEncoding</filter-name> <filter-class>CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncoding</filter-name> <url-pattern>/servlet/*</url-pattern> </filter-mapping>
这段配置和配置servlet相同,意思就是 /servlet的任何请求都会走过滤器
测试:
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ShowServlet 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);
}
}
<servlet>
<servlet-name>ShowServlet</servlet-name>
<servlet-class>ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
我们配置了两个路径,一个是/servlet/show 一个是/show
访问/servlet/show ,没有出现乱码问题
访问/show ,出现乱码问题
过滤器初始化在服务器已启动就执行了