【笔记整理】之filter过滤器
filter过滤器
1、什么是过滤器:
1、对servlet的请求/响应进行一些额外操作或者处理,包括获取信息、添加信息、拦截
2、一个filter过滤器可以对应于一个或者多个servlet
3、请求servlet或者响应到前台之前 先要经过servlet过滤器
也就是servlet容器在调用service()方法前调用doFilter()进行一些操作,并决定是否进行chain.doFilter()继续操作
2、编写一个filter
过滤器实现了 javax.servlet.Filter 接口的 Java类. 有三个方法:
1、void init(FilterConfig filterConfig)
web容器启动时候遍历 web部署描述符 进行过滤器初始化,只执行初始化一次
通过filterConfig可以获取filter配置的init-param参数
filterConfig.getInitParam("site"); ""里为param-name
2、void doFilter(ServletRequest, ServletResponse, FilterChain)
FilterChain接口只有一个方法:doFilter(ServletRequest, ServletResponse)
作用是把web容器当前请求交给下一个过滤器或者servlet处理,如果没有调用FilterChain的doFilter方法 则该请求停止在此过滤器不会继续执行
3、void destroy()
过滤器实例回收前进行的资源回收操作.
public class filter implements Filter { /** * 容器启动时候初始化一次 */ @Override public void init(FilterConfig config) { System.out.println("init " + config.getInitParameter("name")); config.getFilterName(); config.getInitParameterNames(); config.getServletContext(); } /** * 过滤器过滤处理操作,每次请求都处理; * chain为链子,链接所有过滤器; */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { System.out.println("doFilter1"); try { chain.doFilter(request, response); } catch (IOException | ServletException e) { // TODO Auto-generated catch block System.out.println("error" + e.getMessage()); } } /** * 资源回收 */ @Override public void destroy() { } }
3、配置filter
1、web.xml叫做web部署描述符,声明一些约定、规定的配置文件.
2、当web容器启动时候,会为web.xml(部署描述符)中配置的每一个过滤器启动一个实例.
3、过滤器配置在 web.xml(部署描述符)里.跟servlet格式差不多
一般将过滤器放在servlet前面
<filter> <filter-name>test</filter-name> <filter-class>filter</filter-class> <init-param> <param-name>name</param-name> <param-value>test</param-value> </init-param> </filter> <filter-mapping> <filter-name>test</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
4、过滤器执行顺序跟web部署描述符里配置顺序有关,<filter-mapping>在前先配置的过滤器会先执行,某个请求的所有匹配的过滤器、servlet构成一条过滤链
4、一些说明
1、filter的init()初始化操作在tomcat完全启动之前就执行了
2、如果//chain.doFilter(request, response); 注释掉了 请求这个地址时候,不会有进一步动作, 但是请求对应的servlet的初始化操作会先于过滤器doFilter之前执行
3、关于<filter-mapping>节点下对应的servlet配置补充
除了上面通过url-patten匹配servlet之外,还可以通过servlet-name匹配对应的servlet,同时servlet2.4新增dispatcher节点
<filter-mapping> <filter-name></filter-name> <servlet-name></servlet-name> <dispatcher></dispatcher> </filter-mapping>
dispatcher 分配调度 必须在filter-mapping最后,且在servlet-name或url-pattern后面,将请求分为4个类型,只有匹配上的类型才可以执行次过滤器
* REQUEST 正常请求(有几次执行几次),也是默认值
* INCLUDE 引入<jsp:include page="../modules/common/archive.jsp"></jsp:include>
* FORWARD 必须是转发,且出错跳转的不算在内
* ERROR 是触发error由error-page跳转过来的时候,但是这个不触发forward
<error-page> <error-code>500</error-code> <location>/filter/error.jsp</location> </error-page>
4、关于转发与重定向对比
转发 | 重定向 | |
客户端发起请求次数 | 1次 | 2次 |
客户端URL是否变化 | 不变 | 变为重定向后的URL |
是否可以跨站点请求 | 不可以 | 可以 |
响应速度 | 相对快 | 相对慢 |
发起跳转 | 后端直接跳转 | 后端响应http code为3xx,前端重新发起请求 |
实现方式:
//跳转
request.getRequestDispatcher("http://localhost:8777/hello/form").forward(request, response);
//重定向 response.sendRedirct("https://www.cnblogs.com/");