过滤器生命周期/执行流程:
1_服务器启动的时候,tomcat检查web.xml中是否配置过一些过滤器 <filter-class>,如果配置过,调用<filter-class>内部路径,通过反射创建过滤器, 调用过滤器init方法.init方法仅执行一次.
2_当客户端浏览器向服务端发起请求的时候,先到达tomcat, Tomcat将本次HTTP请求部分封装在HttpServletRequest对象,同时创建Htt pServletResponse对象.
3_Tomcat看本次请求要访问那个资源, 看是否有对应的过滤器被触发,如果被触发,将创建好的request,response传递给过滤器的方法doFilter, 执行doFilter中的代码
4_在doFilter中如果执行了放行语句,那么tomcat继续执行本次要访问的资源(servlet/jsp),
5_被访问的资源执行完毕之后,再次经过过滤器,对客户端浏览器进行响应.
性能提升? 好软件? 运行快(语句算法),占用资源少(内存占用).
Java servlet/jsp filter listener ServletConetxt
Destroy() 并不能销毁过滤器对象 他是做一些收尾工作, 例如关闭流
过滤器有哪些作用
验证客户是否来自可信网络
对客户提交的数据进行重新编码
过滤掉客户的某些不应该出现的词汇
验证用户是否可以登录
验证客户的浏览器是否支持当前的应用
记录系统日志
过滤器 过滤请求编码 post请求 可以直接过滤,get请求需要单独过滤
1.1.1 案例实现
l 步骤1:使用装饰者设计模式,编写自定义Request对象。
public class MyRequest extends HttpServletRequestWrapper {
public MyRequest(HttpServletRequest request) {
super(request);
}
/**
* 获得指定名称的第一个参数
*/
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
try {
if ("GET".equalsIgnoreCase(super.getMethod())) {
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return value;
}
}
l 步骤2:修改过滤器,使用自定义request实现类
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
//0 强转
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//1 设置编码
//2 创建自定义request
MyRequest myRequest = new MyRequest(request);
//3 放行,使用自定义request
chain.doFilter(myRequest, response);
}
Day41 监听器 监听域对象的创建 域中属性的变化
处理乱码
Get请求 在server.xml 中添加 URIEncodeing属性=utf-8
New String(name.getByte("iso-8859"),utf-8)