Java Web——过滤器
过滤器声明周期
实例化:web.xml(只会执行一次)
初始化:init() 只会执行一次
过滤:doFilter() 执行多次(filterChain)
销毁:destroy() 在web容器关闭时销毁
过滤器是否能改变用户请求的Web资源呢?能否改变用户请求的路径?
- 可以改变web资源。
过滤器能否直接返回数据,能不能直接处理用户请求?
- 过滤器不是servlet,不可以处理请求,返回数据
过滤器链
在多个过滤器同时匹配了url-pattern时,则会触发过滤器链
顺序:服务器会按照web.xml中过滤器定义的先后顺序组装成一条链
1 | st=>start: Start |
图片来源:慕课网
具体来说:
先执行过滤器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
省去web.xml配置
@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})