Java Web 过滤器

Java Web——过滤器

过滤器声明周期

实例化:web.xml(只会执行一次)

初始化:init() 只会执行一次

过滤:doFilter() 执行多次(filterChain)

销毁:destroy() 在web容器关闭时销毁

过滤器是否能改变用户请求的Web资源呢?能否改变用户请求的路径?

  • 可以改变web资源。

过滤器能否直接返回数据,能不能直接处理用户请求?

  • 过滤器不是servlet,不可以处理请求,返回数据

过滤器链

在多个过滤器同时匹配了url-pattern时,则会触发过滤器链

顺序:服务器会按照web.xml中过滤器定义的先后顺序组装成一条链

1
2
3
4
5
6
7
8
9
st=>start: Start
request=>operation: 用户请求
filter1=>operation: 过滤器1
filter2=>operation: 过滤器2
filter3=>operation: 过滤器3
resource=>operation: Web资源
e=>end

st->request->filter1->filter2->filter3->e

过滤器链工作链

图片来源:慕课网

具体来说:

  • 先执行过滤器1doFilter方法之前的内容

  • 再执行过滤器2doFilter方法之前的内容

  • 接下来执行servlet service方法(JSP页面内容)
  • 接下来执行过滤器2doFilter方法之后的内容
  • 最后执行过滤器1doFilter方法之后的内容,并将请求结果返回给用户

过滤器的分类

Servlet2.5有四种过滤器:

  • REQUEST:用户直接访问页面时,web容器将还会调用过滤器
  • FORWARD:目标资源时通过RequestDispatcher的forward访问时,该过滤器将被调用
  • INCLUDE:目标资源时通过RequestDispatcher的include访问时,该过滤器将被调用
  • ERROR:目标资源时通过声明式异常处理机制调用时,过滤器将被调用
  • ASYNC(servlet3.0新增):支持异步处理

forward():表示在服务器端从一个Servlet中将请求转发到另一个资源(Servlet、Jsp或Html等),本意是让第一个组件对请求做些预处理(或者什么都不做),而让另一组件处理并返回响应。

include():表示在响应中包含另一个资源(Servlet、Jsp或Html等)的响应内容,最终被包含的页面产生的任何响应都将并入原来的response对象,然后一起输出到客户端。

作者:九尾喵的薛定谔

链接:https://www.jianshu.com/p/300e0327eac0

来源:简书

重定向response.sendRedirest(req.getContextPath() + “/main.jsp”) ;会触发request过滤器

request.getRequestDispatcher(“main.jsp”).forward(request, response); 不会触发request过滤器

servlet3.0内容 @WebFilter

@WebFilter

省去web.xml配置

@WebFilter Attributes

@WebFilter(filterName=”LoginFilter”, value={“/*”}, initParams={
@WebInitParam(name=”noLoginPaths”, value=”login.jsp;index.jsp;fail.jsp;/LoginServlet”),
@WebInitParam(name=”charset”, value=”UTF-8”)
}, dispatcherTypes={DispatcherType.REQUEST})

Ty.Wings wechat
欢迎您订阅我的公众号,并在GitHub上为我Star!