• 欢迎光临~

Filter(过滤器)

开发技术 开发技术 2022-09-29 次浏览

1.过滤器的概念和作用

1.1概念:

  滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求;
在请求到达Servlet/JSP之前,过滤器截获请求;
1.2.作用:在客户端的请求访问后端资源之前,拦截这些请求(添加处理)。

Filter接口

2.1. Filter接口是过滤器类必须实现的接口,该接口中有三个方法:

init(FilterConfig filterConfig):该方法是对filter对象进行初始化的方法,参数FilterConfig可以获得filter的初始化参数;
doFilter(ServletRequest request,ServletResponse response,FilterChain chain):该方法是filter进行过滤操作的方法,是最重要的方法。

过滤器实现类必须实现该方法,方法体中可以对request和response进行预处理。其中FilterChain可以将处理后的request和response对象传递到过滤链上的下一个资源。
destroy():该方法在容器销毁对象前被调用。

2.2.FilterChain接口

 该方法类型作为Filter接口中的doFilter方法的参数使用,FilterChain接口中有一个方法:

doFilter(ServletRequest request,ServletResponse response),该方法可以将当前的请求和响应传递到过滤链上的下一个资源,可能是下一个过滤器,也可能是目标资源。

2.3.FilterConfig接口

该接口类型作为Filter接口中的init方法的参数使用,FilterConfig接口中有一个常用方法:

getInitParameter(String name),该方法用来获得过滤器的初始化参数值。

在web.xml中,可以为每一个filter配置需要的初始化参数,与Servlet的< init-param >类似。

过滤器的初始化参数即可通过FilterConfig中的getInitParameter方法获取。


demo代码:

Filter类;

package com.servlet;


import jakarta.servlet.*;

import java.io.IOException;

public class Filter implements jakarta.servlet.Filter {

@Override
//初始化过滤器,等待过滤对象出现
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("FilterStart");
}
@Override
//使用过滤器
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//设置过滤器做的事情
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=UTF-8");
System.out.println("FilterStartBefore");

//让程序向下运行,如果不写,程序到这就会被拦截不走了
filterChain.doFilter(servletRequest,servletResponse);

System.out.println("FilterOverEnd");
}

@Override
//过滤器销毁,web服务器关闭是自动销毁
public void destroy() {
//通知垃圾站回收垃圾
System.gc();
System.out.println("FilterOver");
}
}

Demo类;

package com.show;

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 Demo 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);
}
}


web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">

<servlet>
<servlet-name>Demo</servlet-name>
<servlet-class>com.show.Demo</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>Demo</servlet-name>
<url-pattern>/show/demo</url-pattern>
</servlet-mapping>

<filter>
<filter-name>Filter</filter-name>
<filter-class>com.servlet.Filter</filter-class>
</filter>

<filter-mapping>
<filter-name>Filter</filter-name>
<!--设置过滤的请求路径-->
<url-pattern>/show/*</url-pattern>
</filter-mapping>
</web-app>


程序员灯塔
转载请注明原文链接:Filter(过滤器)
喜欢 (0)