Servlet 过滤器
过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。javax.servlet.Filter 接口定义了三个方法:
序号 方法 & 描述 1 public void doFilter (ServletRequest, ServletResponse, FilterChain)该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。 2 public void init(FilterConfig filterConfig)web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。 3 public void destroy()Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。
实现javax.servlet.Filter接口:
public class Filter implements javax.servlet.Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain filter) throws IOException, ServletException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
filter.doFilter(req, resp);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
Web.xml 中的 Servlet 过滤器映射(Servlet Filter Mapping):
定义过滤器,然后映射到一个 URL 或 Servlet,这与定义 Servlet,然后映射到一个 URL 模式方式大致相同。在部署描述符文件 web.xml 中为 filter 标签创建下面的条目:
<filter>
<filter-name>filter</filter-name>
<filter-class>com.bdqn.filter.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/filter</url-pattern>
</filter-mapping>
Web 应用程序可以根据特定的目的定义若干个不同的过滤器。
web.xml配置各节点说明:
filter 指定一个过滤器。
filter-name 用于为过滤器指定一个名字,该元素的内容不能为空。
filter-class 元素用于指定过滤器的完整的限定类名。
init-param 元素用于为过滤器指定初始化参数,它的子元素 param-name 指定参数的名字, param-value 指定参数的值。
在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
filter-mapping 元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
filter-name 子元素用于设置filter的注册名称。该值必须是在 filter 元素中声明过的过滤器的名字
url-pattern 设置 filter 所拦截的请求路径(过滤器关联的URL样式)
servlet-name 指定过滤器所拦截的Servlet名称。
Servlet监听器:
监听器是web应用程序事件模型的一部分,当web应用的的某些状态发生改变时,会产生相应的事件。监听器可以接收这些事件,并可以在事件发生时做相关的处理。
通过实现HttpSessionListener接口实现在线人数统计:
public class Listening implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent event) {
ServletContext context= event.getSession().getServletContext();
Object count=context.getAttribute("count");
int count1;
if (count==null) {
count1=1;
}else {
count1=(Integer)count;
count1++;
}
context.setAttribute("count", count1);
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
ServletContext context= event.getSession().getServletContext();
Object count=context.getAttribute("count");
int count1=0;
if (count==null) {
count1=0;
}else {
count1=(Integer)count;
count1--;
}
context.setAttribute("count", count);
}
}
Web.xml 中的 Servlet 监听器的配置:
<listener>
<listener-class>com.bdqn.listen.Listening</listener-class>
</listener>