文章目录
过滤器
过滤器概述
1.过滤器位于客户端与web应用程序之间,用于检查和修改两者之间流过的请求。
2.在请求到达Servlet/JSP之前,过滤器截获请求。
3.作用:在客户端的请求访问后端资源之前,拦截这些请求(添加处理)。
过滤器相关API
Servlet API(javaEE)中,与过滤器相关的API共有三个接口,分别是
-Filter
-FilterChain
-FilterConfig
Filter接口
Fileter接口是过滤器类必须实现的接口,该接口中有三个方法。
1.init(FilterConfig filterConfig):该方法是对filter对象进行初始化的方法,仅在容器初始化filter对象结束后被调用一次。参数FilterConfig可以获得filter的初始化参数。如果没有初始化的操作可以不重写。
//获取web.xml中的配置的有关过滤器的初始化内容
filterConfig.getInitParameter("name");
2.doFilter(ServletRequest request,ServletRespone response,FiltrerChain chain):该方法是filter进行过滤操作的方法,是最重要最核心的方法。过滤器实现类必须实现该方法。方法体中可以对request和response进行预处理。其中FilterChain可以将处理后的request和response对象传递到过滤链上的下一个资源。
三个参数的使用
ServletRequest request:一般需要向下转型为HttpServletRequest,使用request的方法;
ServletRespone response:一般需要向下转型为HttpServletResPonse,使用response的方法;
Chain.doFilter(servletRequest, servletResponse):将处理后的request和response对象传递到过滤链上的下一个资源。
3.destroy():该方法在容器销毁过滤器前被调用,可以不重写调用父类使用。
FilterChain接口
该接口类作为Filter接口中doFilter方法的参数使用。
方法
doFilter(ServletRequest request,ServletResponse response)
该方法可以将当前的请求和响应传递到过滤链的下一个资源,可能是下一个过滤器,也可能是目标资源.
FilterConfig接口
该接口类型作为Filter接口的init方法的参数使用,FilterConfig接口中有一个常用方法
getInitParameter(String name)
该方法用来获得过滤器的初始化参数值。
在web.xml中,可以为每一个filter配置需要的初始化参数,与Servlet的< init-param>类似。过滤器的初始化参数即可通过FilterConfig中的getInitParameter()方法获取。这里的配置通过后面的案例进行展示。
案例(统一编码过滤器)
Java代码
import javax.servlet.*;
import java.io.IOException;
public class EncodingFilter implements Filter {
String encoding;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("统一编码过滤器");
encoding = filterConfig.getInitParameter("encodingName");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//所有请求的编码格式都设置为utf-8
servletRequest.setCharacterEncoding(encoding);
//让本次请求继续向下执行,可能是下一个过滤器,也可能是目标资源(要访问的servlet或者jsp)
filterChain.doFilter(servletRequest,servletResponse);
}
}
web.xml配置文件
<!--统一编码过滤器配置-->
<filter>
<filter-name>encodFilter</filter-name>
<filter-class>com.ff.jsppro.filter.EncodingFilter</filter-class>
<!--初识化init的配置参数-->
<init-param>
<param-name>encodingName</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodFilter</filter-name>
<!-- /* 表示所有的请求都经过此过滤器-->
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤器总结
1.过滤器用来实现通用的功能,减少代码冗余,提高可维护性。
2.一个过滤器可以配置给多个资源使用(编码过滤器)。
3.一个资源也可以配置多个过滤器(success.jsp),按照配置顺序调用。
监听器
Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。
监听器分类
1.按监听对象分类
(1)用于监听应用程序对象(ServletContext)
(2)用于监听用户会话对象(HttpSession)
(3)用于监听请求消息对象(ServletRequest)
2.按监听事件分类
(1)监听对象的创建和销毁的事件监听器。
(2)监听对象属性变更(添加、修改、删除)的监听器。
监听器接口
Servlet API中定义了监听器接口,用来监听不同的事件类型。
ServletContextListener:上下文监听器;
ServletContextAttribute:上下文属性监听器;
ServletRequestListener:请求监听器;
ServletRequestAttributeListener:请求属性监听器;
HttpSessionListener:会话监听器;
HttpSessionAttribute:会话属性监听器.
配置监听器类
创建监听器类,实现监听器接口,在web.xml文件中配置监听器类。
<listener>
<listener-class>监听器类全类名</listener-class>
</listener>
实例
监听器类(java代码)
package com.cwd.jsppro.listener;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
public class ObjectListener implements ServletContextListener, ServletRequestListener {
/*
监听ServletContext对象的创建
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext创建了");
ServletContext application = sce.getServletContext();//整个应用程序只有一个对象
application.setAttribute("config","123");//设置初始化数据
}
/*
监听ServletContext对象的销毁
*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext销毁了");
}
/*
请求对象创建
*/
long s = 0;
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("请求对象创建");
s = System.currentTimeMillis();
}
/*
请求对象销毁
*/
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("请求对象销毁");
//获取客户端ip
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
System.out.println(request.getRemoteAddr()+"请求耗时:::"+(System.currentTimeMillis()-s));
}
}
配置web.xml监听器类
<!--监听器配置-->
<listener>
<listener-class>com.ff.jsppro.listener.ObjectListener</listener-class>
</listener>