过滤器
它会在一组资源(jsp,servlet,css,html等等)的前面执行,它可以让请求得到目标资源,也可以不让请求到达
过滤器有拦截请求的能力
2 过滤器如何编写
1 写一个实现Filter接口
2 在web.xml进行配置
方法:
void init(FilterConfig) 创建之后马上执行:Filter会在服务器启动时就创建
void destory() 销毁之前执行,在服务器关闭时销毁
void doFilter(ServletRequest,ServletResponse,FilterChain) 每次过滤时都会执行
Filter是单例的。
web.xml
<filter>
<filter-name>xxx</filter-name>
<filter-class>包名+类名 </filter-class>
</filter>
<filter-mapping>
<filter-name>xxxx</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3 FilterConfig
获取初始化参数:getInitParameter()
获取过滤器名称:getFilterName()
获取application: getServletContext()
FilterChain
doFilter(ServletRequest,ServletResponse) 放行
4 可以指定多个过滤器,过滤器的执行顺序,是web.xml的配置顺序
在<filter-mapping>的配置顺序,决定
5 过滤器的四种拦截方式
请求 REQUEST
转发 FORWARD
错误 INCLUDE
包含 ERROR
在<filter-mapping>中进行配置 <dispatcher>拦截方式</dispatcher>
6过滤器的应用场景
执行目标资源之前做预处理工作,例如设置编码,这种 方式通常都会方行,只是在目标资源执行之前做一些准备工作
通过条件判断是否方行,例如校验当前用户是否已经登录,或者用户ip是否已经被禁用
在目标资源执行后,做一些后续的特殊处理工作
7 案例一 分ip统计网站的访问次数
统计工作需要在所有资源之前都执行,那么就可以放到Filter中了
不做拦截操作,只是统计数据
用Map装载统计数据 Map<String,Integer>
Map需要在Filter中用来保存数据
Map需要在页面中使用,打印Map中的数据
Map保存到ServletContext中
Map在服务器开启时创建,使用ServletContextListener
8 案例二 粗粒度权限控制
9 案例三 解决全站字符乱码
在过滤器方法中:
//处理post请求编码
request.setCharacterEncoding("UTF-8");
//处理get请求问题
/*1 调包request
*2 在放行时使用我们自己的request
*3 使用装饰类,修改request的getParameter()方法 编写装饰类,继承 HttpServletRequestWrapper
* */
HttpServletRequest req = (HttpServletRequest) request;
if(req.getMethod().equals("GET")){
EncodingRequest ef = new EncodingRequest(req);
chain.doFilter(ef, response);
}
else if(req.getMethod().equals("POST")){
chain.doFilter(request, response);
}
10 案例四 页面静态化
1 第一步,创建一个项目
jsp:链接页面 link.jsp
四个超链接:
查询所有:
查看SE分类
查看EE分类
查看框架分类
show.jsp 显示查询结果
Servlet“
BookServlet
findALL()
findByCategory()
BookService:略
BookDao:
List<Book> findAll()
List<Book> findByCategory(int category)
domain Book类
2 页面静态化概念
首次访问去数据库获取数据,然后把数据保存到一个html页面中
二次访问,就不再去数据库获取了,而是直接显示html”
1 目标:给出一个过滤器,把servlet请求的资源所做输出保存到html中,重定向到html页面
二次访问时,这个html已经存在,那么直接重定向,不再访问servlet