Filter过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。
使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
过滤器在 Web 部署描述符(web.xml)中的 XML 标签声明,一般把 Filter 配置在所有的 Servlet 之前。
Filter的生命周期和编写的Servlet类似。
public void init(FilterConfig filterConfig) throws ServletException;//初始化
通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException;//拦截请求
这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL的时候,Servlet过滤器将先执行doFilter方法。FilterChain参数用于访问后续过滤器。
public void destroy();//销毁
Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。
FilterConfig 使用
Filter 的 init 方法中提供了一个 FilterConfig 对象。
如 web.xml 文件配置如下:
<filter>
<filter-name>FilterEconding</filter-name>
<filter-class>com.my.filter.FilterEconding</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>filter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterEconding</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
在 init 方法使用 FilterConfig 对象获取参数:
public void init(FilterConfig config) throws ServletException {
// 获取初始化参数
String name = config.getInitParameter("name");
// 输出初始化参数
System.out.println("过滤器: " + name);
}
Filter过滤器实例:
public void doFilter(ServletRequest serRequest, ServletResponse servletResponse,
FilterChain chain) throws IOException, ServletException {
serRequest.setCharacterEncoding("utf-8");
String name = serRequest.getParameter("name");
//http://localhost:8080/20190511/servlet/UserServlet?name=123 访问地址
if("123".equals(name)){
System.out.println("filter执行成功!");
// 把请求传回过滤链
chain.doFilter(serRequest, servletResponse);
}else{
serRequest.setCharacterEncoding("utf-8");
//在页面输出响应信息
PrintWriter out = servletResponse.getWriter();
out.write("name不正确,请求被拦截,不能访问web资源");
System.out.println("name不正确,请求被拦截,不能访问web资源");
}
}
如果我访问地址的name值为123就把请求传回,如果不是123就提示name不正确,拦截请求。