第一章 过滤器简介
1.1 过滤器是什么过滤器(filter)本质是Java中预先定义好了不同的接口,和servlet类似,可以过滤不同的内容,具体怎么过滤,需要使用者定义一个实现类,然后实现接口中的过滤方法,在方法中书写过滤的条件。filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行。简而言之,是在servlet之前执行,拦截请求,将servlet中一些共同的业务代码抽取出来,这就是过滤器作用。比如:请求乱码处理。
第二章 过滤器的应用场景
1、过滤论坛中的非法字符当我们上论坛或者贴吧这类的网站浏览信息时,我们发现,很多评论有时候是携带脏词的。而这些脏词不能显示出来,使用**代替了。类似这类的脏词过滤,我们可以通过java中的过滤器,对请求参数中的脏词进行过滤。
2、登录权限检查
1.1 过滤器是什么过滤器(filter)本质是Java中预先定义好了不同的接口,和servlet类似,可以过滤不同的内容,具体怎么过滤,需要使用者定义一个实现类,然后实现接口中的过滤方法,在方法中书写过滤的条件。filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行。简而言之,是在servlet之前执行,拦截请求,将servlet中一些共同的业务代码抽取出来,这就是过滤器作用。比如:请求乱码处理。、第二章 过滤器的应用场景1、过滤论坛中的非法字符当我们上论坛或者贴吧这类的网站浏览信息时,我们发现,很多评论有时候是携带脏词的。而这些脏词不能显示出来,使用**代替了。类似这类的脏词过滤,我们可以通过java中的过滤器,对请求参数中的脏词进行过滤。2、登录权限检查
当客户端浏览器发出一个请求,这个请求在访问到正真的目标资源之前,我们需要进行登录权限的检查。如果已经登录,我们就让这个请求通过,访问资源;如果没有登录,我们不能让请求访问目标资源。这样的操作需要在访问具体资源进行条件的过滤,我们可以使用过滤器来完成。第三章 过滤器开发入门1、过滤器API介绍
Filter是由Tomcat启动时创建,是javax.servlet包下面的一个接口,这个接口中定义了3个方法。
方法 | 说明 |
---|---|
void init(FilterConfig filterConfig) | 过滤器对象创建的时候调用的方法 |
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) | 执行过滤的方法 |
void destory() | 过滤器销毁的时候调用的方法 |
2、过滤器开发步骤
项目中如果需要使用到过滤器,使用Servlet3.0的注解方式进行创建。创建步骤如下:
- 第一步:新建一个普通java类,实现Filter接口;
- 第二步:根据提示重写Filter接口的3个方法;
- 第三步:在这个类上面通过注解的方式配置这个Filter;
- 注解@WebFilter:配置Filter的注解,这个注解有两个参数;
- filterName:设置过滤器的名称;
- urlPatterns:配置这个过滤器要拦截的资源的路径;
- 注解@WebFilter:配置Filter的注解,这个注解有两个参数;
- 第四步:在doFilter()方法中,书写过滤的业务逻辑;
- chain.doFilter()方法放行;
总结:
doFilter()方法的作用
当不写doFilter()方法时候,jsp文件访问不到,被拦截;
当有了doFilter()方法时候,jsp文件可以访问,被放行;所以:doFilter()具有放行的作用。
第四章 过滤器的执行流程
过滤器的doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)方法中的request对象和response对象并不是过滤器自己创建的。而是,从被过滤的资源中传递过来的。过滤器的执行流程如下:
- 客户端(浏览器)的HttpRequest到达Servlet之前,被Filter的doFilter()方法拦截;
- 根据需要,我们可以获取或者修改HttpRequest对象中的数据;
- 在这个请求响应给浏览器之前,Filter拦截了HttpResponse对象;
- 根据需要,我们可以获取或者修改HttpReponse对象中的数据;
- 最后,由doFilter中的chain决定是否让这个请求通过;
问题:当用xml方法执行filter时候,路径配置为/*,发现,doFilter()里面的代码执行3次?
答案:这是idea配置Tomcat时导致的,当启动Tomcat时候,doFilter()会执行2次,然后再跳出浏览器,访问localhost,还会再执行foFilter()一次。
问题:如果多个过滤器都对相同路径进行匹配,执行顺序该是什么?
按字母照顺序执行
第五章 Filter的生命周期
我们分析了Filter的执行流程。我们有没有想过,我们并没有向Filter发送请求,请求是怎么进入到doFilter()中的呢。我们知道,能够调用一个类下面的非静态的成员方法,一定是这个类的对象。Filter类的对象是在什么时候创建的呢?创建之后又是怎么工作的呢?最后是在什么时候销毁的呢?这些问题就是Filter的生命周期问题。我们,可以通过以下代码对Filter的生命周期问题进行验证:
【结论】
- Filter类的对象是在服务器启动的时候创建的;
- Filter类对象创建完成后会调用init()方法;
- 每当一个请求的路径是满足过滤器的配置路径,那么就会执行一次过滤器的doFilter方法 (类似于service方法)
- 当服务器停止的时候,销毁过滤器,执行过滤器的destory方法
1、doFilter()方法
doFilter()方法是拦截请求的方法,只要一个请求符合Filter拦截路径,都会被doFilter()方法拦截。doFilter()方法有3个参数,这3个参数的作用分别如下:
参数 | 说明 |
---|---|
ServletRequest req | ServletRequest是HttpServletRequest类的父类,其中包含了被拦截的请求的信息 |
ServletResponse resp | ServletResponse是HttpServletResponse类的父类,其中包含了被拦截的响应的信息 |
FilterChain chain | FilterChain给Filter提供了放行的方法。chain.doFilter(); |
FilterChain 类是一个接口,里面有doFilter(req,resp)方法,作用是将浏览器提交请求对象和响应对象传到过滤连的资源里面去,所以doFilter()方法具有放行的作用。
2、destory()方法
过滤器的销毁方法。服务器停止或者将项目从服务器中移除的时候,销毁过滤器,调用一次destory方法。
【关闭tomcat】查看结果
【结论】
- 过滤器是在服务器停止或者项目移除时销毁的;
- 过滤器销毁后会调用destory()方法;
【小结】Filter生命周期小结
- 当服务器启动的时候,过滤器就被初始化了,执行过滤器的init方法
- 每当一个请求的路径是满足过滤器的配置路径,那么就会执行一次过滤器的doFilter方法
- 当服务器停止的时候,销毁过滤器,执行过滤器的destory方法
第六章 Filter的映射路径
映射路径指的是当前这个Filter需要拦截的路径。这个路径的配置方式有两种:
- 精确匹配:匹配指定的urlpattern;
- 模糊匹配:匹配复合条件的一类路径;
1、精确匹配
精确匹配,要求访问的资源路径必须与Filter的urlPatterns中的配置一致。如下:
精确匹配 | 说明 |
---|---|
urlPatterns = “/index.jsp” | 拦截对index.jsp页面的请求 |
urlPatterns = “/loginServlet” | 拦截对loginServlet的请求 |
urlPatterns = “/a.jpg” | 拦截对a.jsp的请求 |
2、模糊匹配
有时候,我们需要对这个服务器中的所有请求都有所特殊处理,比如处理post请求的乱码问题。我们就需要多 所有的请求都设置乱码处理。这时候,就需要对多有的请求进行拦截。如果通过上面的精确匹配模式,需要配置很多的请求,这样就比较麻烦了。如果通过urlPatterns的模糊匹配,就能够对这些请求进行统一处理。
模糊匹配主要有以下3种写法:
模糊匹配 | 使用示例 | 说明 |
---|---|---|
urlPatterns = “/*” | urlPatterns = “/*” | 对所有的请求都进行拦截 |
urlPatterns = “/xxx/*” | urlPatterns = “/user/*” | 对映射路径中/user下的所有资源进行拦截 |
urlPatterns = “*.xxx” | urlPatterns = “*.jsp” | 对指定后缀的请求进行拦截 |
使用场景1
今天电商狂欢日,要求对所有购买的电脑进行打9折
http://localhost:8080/computer/dell
http://localhost:8080/computer/xiaomi
http://localhost:8080/computer/thinkpad
使用场景2
网站有很多种请求:浏览商品,购买商品,删除商品;用户登录,修改用户信息,注册用户信息。
我们可以将请求分为两类:xxx.action和xxx.do
这样可以分清楚网站请求的类别。
3.多个路径匹配
一个过滤器可以匹配多个路径
xml
注解
温馨提示:路径没有/,Tomcat会报错!
第七章 Filter应用案例
1、Filter统一解决post请求乱码问题
8.0版本以上的tomcat为我们解决了get请求的乱码问题。我们需要自己处理post请求的乱码问题,因为我们的一个项目中可能有很多的请求。当然,我们可以在每一个Servlet中都对post的乱码进行处理。但是,Filter给我们提供了一个更加便捷的方式。我们自定义一个Filter类,拦截所有的请求,然后对这些请求进行post乱码处理即可。
xml配置
1 | <?xml version="1.0" encoding="UTF-8"?> |
【注意】过滤器doFilter方法默认拦截请求,如果需要经过过滤器之后,可以继续访问资源,要使用chain.doFilter()方法进行放行。
配置文件 : 代码耦合性降低 开发繁琐
注解:嵌入了代码,耦合性高 简化开发
后期我们代码被编译class文件时候,可以通过修改配置文件,来修改配置信息
总结:如果后期代码经常修改,我们使用配置文件。代码不易变化,我么使用注解开发。
2、非法字符过滤器
在逛论坛的时候,通常会发现一些敏感或者不和谐的字眼都被**给替代了。这个技术也可以使用我们的Filter来实现。
3、过滤器案例–登录权限校验