2023-01-06
一 、过滤器(Filter)
1 、概念:Filter是一个实现了特殊接口(Filter)的java类 ,实现对请求资源(jsp ,servlet,html)的过滤的功能 。过滤器是一个运行在服务器的程序,优先于请求资源(Servlet或者jsp 、html)之前执行 。过滤器是Javaweb技术中最为实用的技术之一 。
2 、功能:拦截请求 ,检查 ,之后选择放行或者是禁止放行 。
3 、应用场景:登陆权限检查 、解决网站乱码 、过滤敏感字符等等 。
二 、过滤器的HelloWord
(1)首先 ,先创建一个module ,选择“web Application ” ,写入项目名 ,完成创建 。
(2)准备一个请求
①将“index.jsp ”删除 ,在web文件夹下创建index.html ,创建一个超链接
②在src文件夹中创建一个Servlet包 ,在该包下创建一个名为“HelloServlet ”的Servlet,去掉注解 。
③在“web.xml ”中创建访问路径
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.hh.Servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
④设置“HelloServlet ”中的代码
package com.hh.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 HelloServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("访问到了HelloServlet");
}
}
⑤将服务器进行简单修改 ,将Name可以设置为“filter_listener ” ,使用“Chrome ”,使用“Redeploy ”.
⑥为这次请求创建一个过滤器,创建过滤器的步骤:
a.新建一个类 ,“com.hh.filter.HelloFilter ” ,使这个类实现一个接口“Filter”,该接口的包是“javax.servlet ”
b.实现一个类
c.实现接口中的所有抽象方法,使用快捷键“ctrl+o ” 。有“init” 、“doFilter ”、“destroy ”
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//当前过滤器的核心方法
System.out.println("访问到了HelloFilter");
//放行代码
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("这是过滤器放行后的代码");
}
d.配置过滤器的过滤路径 ,在“web.xml”中设置
<filter>
<filter-name>HelloFilter</filter-name>
<filter-class>com.hh.filter.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HelloFilter</filter-name>
<url-pattern>/hello</url-pattern>
</filter-mapping>
刷新服务器后 ,在弹出的超链接页面中点击超链接 ,在后台的运行顺序为:
(3)结论:请求发出 ,如果符合过滤器的过滤要求 ,执行放行前代码;放行 ,执行目标资源;目标资源执行完毕 ,会执行放行后的代码;
三 、过滤器生命周期
需要了解:filter对象什么时候创建 、对象类的方法什么时候执行、对象什么时候销毁
(1)在“HelloFilter ”中创建一个构造器 ,使用快捷键“Alt+Insert ” ,点击“Constructor ”
public HelloFilter() {
System.out.println("HelloFilter的构造器被执行了");
}
(2)在“HelloFilter ”中的“init ” 、“destroy ”中添加输出语句
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("HelloFilter在进行初始化");
}
@Override
public void destroy() {
System.out.println("HelloFilter被销毁了");
}
(3)filter对象是在特定情况下被创建,filter对象是在特定情况下被执行 。
即“在web项目被加载的时候 ,过滤器对象被创建 ” ,之后立刻执行初始化方法;n次发送符合过滤器路径的请求时,直接执行n次“doFilter ”方法;web项目被卸载的时候(服务器关闭) ,对象被销毁 ,销毁之前,执行destroy方法。
(4)验证结论:
将服务器关闭后 ,过滤器被销毁
声明:本站所有文章 ,如无特殊说明或标注 ,均为本站原创发布 。任何个人或组织 ,在未征得本站同意时 ,禁止复制 、盗用、采集 、发布本站内容到任何网站 、书籍等各类媒体平台 。如若本站内容侵犯了原著者的合法权益 ,可联系我们进行处理。