Filter

介绍
过滤器 ,过滤客户端发出来的请求。
浏览器发出, 然后服务器派servlet处理。
–> 在中间就可以过滤, 其实过滤器起到的是拦截的作用。
接口
(过滤请求和响应,于servlet之前运行)

● 作用
a. 对一些敏感词汇进行过滤
b. 统一设置编码(全栈编码)
c. 自动登录
d. 权限的设置
e. 处理会员参数(过滤广告)

404errorPage页面设置

如何使用Filter
–> 至少有个servlet
–> 编写一个java类,必须直接或间接的实现Filter接口 –> 主要实现doFilter方法
–> 使用注解方式,为虚拟路径配置过滤器

定义一个类, 实现Filter
public class FilterDemo implements Filter {
public void destroy() {
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println(“来到过虑器了。。。”);
chain.doFilter(request, response);
}

public void init(FilterConfig fConfig) throws ServletException {
}​
}

注册过滤器

在web.xml里面注册,注册的手法与servlet基本一样。

FilterDemo
FilterDemo
com.itheima.filter.FilterDemo


FilterDemo
/*

Filter的生命周期

● 创建
在服务器启动的时候
● 销毁
服务器停止的时候
● doFilter
只要访问了Filter在服务器中配置的路径的时候

Filter执行顺序

  1. 客户端发出请求,先经过过滤器, 如果过滤器放行,那么才能到servlet
  2. 如果有多个过滤器, 那么他们会按照注册的映射顺序 来 排队。 只要有一个过滤器, 不放行,那么后面排队的过滤器以及咱们的servlet都不会收到请求。
  3. 多个Filter必须同类型
    –> 要么全用注解方式
    多个过滤器的顺序为自然顺序
    –> 要么全用xml配置方式
    书写顺序

Filter细节:

init方法的参数 FilterConfig
–> 获取filter在注册的名字 以及初始化参数。
–> 其实这里的设计的初衷与ServletConfig是一样的。

如果想放行,那么在doFilter 方法里面操作
–> 使用参数 chain,放行让请求到达下一个目标。
chain.doFilter(request, response);
–> 如果有多个过滤器,那么他们会按照注册的映射顺序执行(排队)

映射路径–url-pattern
如果是servlet –> 配置的是访问的路径 sevlet虚拟路径
如果是Filter –> 需要拦截的路径 Filter的映射路径

/* 写法格式与servlet一样。
a. 全路径匹配 以 / 开始
/LoginServlet
–> 若Filter采用精确匹配,只有访问路径与映射路径一模一样,才能拦截
b. 以目录匹配 以 / 开始 以 * 结束
/demo01/*
–> 如果Filter采用目录匹配,当访问路径是该映射路径的子集,就能拦截 过滤器中采用目录匹配
c. 以后缀名匹配 以 * 开始 以后缀名结束
.jsp .html *.do

请求转发的servlet会不会被过滤
–> 默认情况下,Filter只拦截request直接访问

针对 dispatcher 设置(可以多参数设置)
REQUEST : 只要是请求过来,都拦截,默认就是REQUEST
FORWARD : 只要是转发都拦截。
ERROR : 页面出错发生跳转
INCLUDE : 包含页面的时候就拦截。

参数说明
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException
{
System.out.println(“执行过滤操作”);
// chain.doFilter(req, resp);
}
ServletRequest req –> 此次要进行了过滤的请求
ServletResponse resp –> 此次要进行了过滤的请求对应的响应
FilterChain chain –> 放行对象
–> 管理当前访问路径上的过滤器
–> 过滤链 对象

访问没有Filter –> 请求从浏览器到达服务器,根据请求路径/映射关系,找到对应servelt的service方法
访问有Filter –> 请求从浏览器到达服务器,根据请求路径/映射关系,不会立即运行servlet的service方法
而是经过该路径上的过滤器
底层:
创建一个FilterChain对象
对象中
public FilterChain(){
private Filters() filters;
}
根据配置文件或者注解中 配置的过滤路径,跟请求路径进行匹配
如果匹配上,将该Filter对象,放在数组中
执行过滤器链的doFilter方法
取出第一个Filter执行该Filter的doFilter方法—-
OK—–放行:chain.doFilter(request.response);
取出第二个Filter执行该Filter的doFilter方法—
OK—–放行:chain.doFilter(request.response);

——若所有执行都放行了,就访问Servlet

处理全栈中文乱码问题
配置web.xml

Filter编写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值