Filter概述
接受客户端发送过来的请求,然后针对请求进行过滤
FIilter生命周期
TomCat 启动的时候执行 init(FilterConfig fConfig)
拦截的时候 执行doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
当TomCat关闭的时候执行 ondestroy
FilterConfig对象
跟SerlvetConfig 对象差不多就是获取下面对应的参数,熟悉API就可以了
<filter-mapping>
<filter-name>DemoFilter1</filter-name>
<url-pattern>/jsp/demo1.jsp</url-pattern>
</filter-mapping>
执行原理
- Filter过滤的器的执行顺序 根据在 web.xml 中配置顺序一致
- A—>C chain.doFilter(request, response);后 C—>A
Filterchain对象
Interface FilterChain
概述 过滤器使用 FilterChain 调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源。
Filter-Mapping的配置
关于Request Forward 在Filter来配置的说明 默认是拦截请求 ,配置以后才可以拦截转发
关于request forward 等问题
关于HttpServletRequest的动态代理的二次封装
需求 : 对于post get提交的request请求乱码问题 想要通过增强在HttpServletRequest这个类来实现乱码问题的增强。
解决方案 : 继承 装饰 动态代理 三种模式都可以解决,又因为HttpServletRequestWrapper实现了HttpServletRequest这个接口,因此可以通过动态代理的方式来进行增强
增强的类 被装饰的类
public class MyRequestWarpper extends HttpServletRequestWrapper{
private HttpServletRequest request;
public MyRequestWarpper(HttpServletRequest request) {
super(request);
this.request = request;
}
/**
* 通过重写这个方式来实现解决乱码问题
*/
@Override
public String getParameter(String name) {
// TODO Auto-generated method stub
// 1.判断是什么请求
// 2. get 请求
// 3. post 请求
String method = request.getMethod();
if(method.equalsIgnoreCase("get")) {
try {
String value = new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");
System.out.println("MyRequestWarpper " + value);
return value;
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return request.getParameter(name);
}
}
在Serlvet中的使用
public class MyRequestSerlvet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
MyRequestWarpper myRequestWarpper = new MyRequestWarpper(request);
String parameter = myRequestWarpper.getParameter("user");
String parameter2 = myRequestWarpper.getParameter("pwd");
System.out.println(parameter);
System.out.println(parameter2);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
HttpRequest对象的增强
问题汇总
1. 初始运行项目时会报出NotClassfindException 就说定义的filter没有找到 ,
解决办法 去tomcat目录下查看对应的jsp的Classes的没有被编译,手动编译 , 关闭tomcat Project Buildall 手动编译 从新部署项目运行 ok 最直接的办法就是关闭Eclipse重启
2. 注意过滤的对象 还有内容
解决 A 请求 B 过滤器 过滤的是B的内容,配置的是B的路径
Listener 监听器
第一类 监听域对象的变化
ServletContextListener:监听ServletContext对象的创建和销毁
HttpSessionListener:监听HttpSession对象的创建和销毁
ServletRequestListener:监听ServletRequest对象的创建和销毁
第二类 监听域对象属性的变化
ServletContextAttributeListener:监听ServletContext域属性变更的监听器
HttpSessionAttributeListener:监听HttpSession域属性变更的监听器
ServletRequestAttributeListener:监听ServletRequest域属性变更的监听器
第三类 用来监听HttpSession中的JavaBean的对象状态改变监听器