6.过滤器
本章目标:
- 过滤器简介
- 示例
本章内容:
一、过滤器简介
1、什么是Filter过滤器
过滤器是向Web应用程序的请求和响应处理添加功能的Web服务组件
Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
Filter也称之为过滤器,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
2、过滤器的作用
- 检查请求并执行相应的行动,并阻塞请求或响应,使其不能进一步传递。
- 修改请求和响应的头部和数据,用户可以提供自定义的请求或可以通过提供定制的响应版本来实现。
- 可被添加到Web应用程序中或者从Web应用程序中删除而不需重写基层应用程序代码,并能向过去的代码中添加新功能。
- 在实际开发中,譬如我们可以对客户提交的数据进行重新编码,可以从系统获得配置信息,可以过滤客户提交的某些不合法的词汇,可以验证客户是否已经登录,可以验证客户端浏览器是否支持当前的应用,还可以记录系统的日志文件等等。
3、Filter拦截原理
Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法。
web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法。调用filterChian对象的doFilter方法,web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。相反,如果不调用该方法,web资源不会被访问。
4、Filter接口常用方法:
- 初始化:init(FilterConfig filterConfig)
- 过滤doFilter(ServletRequest req, ServletResponse resp, FilterChainfilterChain):Filter中的doFilter()方法主要写实现过滤器功能的代码,doFillter方法中可以一句需求决定是否调用filterChain的doFilter方法放行
- 注销过滤器:destroy()
5、Filter的生命周期
Filter的创建和销毁由WEB服务器负责。
- web应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。
- 所有的请求都会经过过滤器,并多少调用doFilter()方法
- 过滤器的注销会随着服务器的关闭而关闭。除此之外,Web容器还可以通过调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。
6、过滤器链
- FilterChain 接口用于调用过滤器链中的一系列过滤器,由Web容器根据Filter映射自动产生FilterChain对象
- FilterChain.doFilter(ServletRequest, ServletResponse)方法用于调用过滤器链中的下一个过滤器
- 在过滤器链中的最后一个过滤器中调用doFilter方法将请求发送的指定的Web资源
二、示例
1、基础示例
package com.woniuxy.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FirstFilter implements Filter {
public void destroy() {
System.out.println("*******过滤器销毁*******");
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain chain) throws IOException, ServletException {
System.out.println("*******过滤器doFilter之前*******");
chain.doFilter(arg0, arg1);
System.out.println("*******过滤器doFilter之后*******");
}
public void init(FilterConfig arg0) throws ServletException {
System.out.println("*******过滤器开始*******");
}
}
2、设置编码
package com.woniuxy.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class EncodingFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
request.setCharacterEncoding("utf-8");
} catch (Exception e) {
}
chain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
3、验证登录
package com.woniuxy.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class FilterDemo implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
HttpServletRequest request = (HttpServletRequest) arg0;
HttpServletResponse response = (HttpServletResponse) arg1;
request.setCharacterEncoding("utf-8");
HttpSession session = request.getSession();
Object obj = session.getAttribute("user");
String uri = request.getRequestURI();
if (uri.endsWith("login.jsp") || (uri.endsWith("user") && "login".endsWith(request.getParameter("status")))) {
chain.doFilter(request, response);
} else if (obj != null) {
chain.doFilter(request, response);
} else {
response.sendRedirect("/shop/manage/login.jsp");
//response.sendRedirect("http://"+request.getHeader("Host")+"/manage/login.jsp");
}
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
4、web.xml中配置
<filter>
<filter-name>session</filter-name>
<filter-class>com.woniuxy.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>session</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
本文来自博客园,作者:icui4cu,转载请注明原文链接:https://www.cnblogs.com/icui4cu/p/18843152