![90e3ce84062ee1b0fd4e550de9d2205e.png](https://i-blog.csdnimg.cn/blog_migrate/34342a375211870394b1d93e12f690bd.jpeg)
Filter:过滤器
引言
我们可以通过使用前面的技术,做出一些简单的登陆注册以及配合数据库实现对数据增删改查的Demo,程序是基本运行起来了,但是却存在着一个重大的安全问题,那就登陆权限验证,一般来说登陆的正确流程是这样的:用户在客户端发出请求 -> 后台判断是否登录 -> 是则不限制,否则 跳转回登录页面,判断是否登录和我们前面所学习的 Header中获取referer再判断达从而到防盗链的效果有相似的感觉,就是起一个判断过滤的样子,而Filter则是一个更好的解决这样问题的技术,当然强大的功能不止这一点,下面我们就好好来说一说!
(一) 过滤器概述
过滤器,顾名思义就是起到过滤筛选作用的一种事物,只不过相较于现实生活中的过滤器,这里的过滤器过滤的对象是客户端访问的web资源,也可以理解为一种预处理手段,对资源进行拦截后,将其中我们认为的杂质(用户自己定义的)过滤,符合条件的放行,不符合的则拦截下来
当然,过滤器既可以拦截request,也可以拦截返回的response,我们来看一张图
![829337374f2c3e9010197688973cf16e.png](https://i-blog.csdnimg.cn/blog_migrate/34433bcecdd6afa789cc6b46a8cab220.jpeg)
(二) 第一个过滤器程序
过滤器的本质就是一个实现了 Filter 接口的 Java 类
我们先自己创建一个类,实现Filter接口(javax.servlet),重写其中的所有方法
@WebFilter("/*")
public class FilterDemo1 implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//放行代码
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
我们先不探究其中的方法,我们先看一下如何配置filter
(三) filter配置
第一种:web.xml配置
<filter>
<filter-name>filterDemo1</filter-name>
<filter-class>package cn.ideal.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>filterDemo1</filter-name>
<!-- 拦截路径 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
filter
<filter-name></filter-name>
:指定filter名字
<filter-class></filter-class>
:指定filter全类名(带包名)
filter-mapping
<filter-name></filter-name>
:这里的标签是为了与上面filter中的名字对应,从而指向到对应的文件中
<url-pattern></url-pattern>
:设置filter所拦截的路径 ※ 这里决定了什么样的资源会被过滤器拦截处理
拦截路径设置
格式解释/test.jsp只有访问test.jsp这个资源的时候才会执行过滤器/test/*访问test下所有资源你的时候,执行过滤器*.jsp所有jsp格式的资源被访问的时候,执行过滤器/*任意资源被访问,均执行过滤器
由于过滤器内设置的是比较通用的一些设置,所以一般来说使用 /*
这种格式,不过也可以根据需求情况选择
拦截方式配置:dispatcher
拦截方式配置也就是资源被访问的形式,有这么几个属性
- REQUEST:默认值,浏览器直接请求资源
- FORWARD:转发访问资源 : RequestDispatcher.forward();
- INCLUDE:包含访问资源 : RequestDispatcher.include();
- ERROR:错误跳转资源 : 被声明式异常处理机制调用的时候
补充:声明式异常处理即:在web.xml中通过配置来确定不同的异常类型将如何被处理