现实生活中的过滤器
筛子
那么,多个过滤器就可以形成一个过滤链
程序中的过滤器,类似的,注意一点:B/S程序是基于请求与响应的模式。
那我们也会用到一个类似于筛子的东西
过滤器是Servlet中的一个重要的接口,和Servlet类似。
配置过滤器,需要考虑该过滤器给谁用?
package com.njwbhz.mood.filter;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter1 implements Filter {
private int age;
public MyFilter1 ( ) {
System.out.println ( "MyFilter1()" );
}
@Override
public void init ( FilterConfig filterConfig ) throws ServletException {
System.out.println ( "MyFilter1.init()" );
this.age = Integer.valueOf ( filterConfig.getInitParameter ( "age" ) );
}
//doFilter相当于servlet中的service方法
//ServletRequest是HttpServletRequest的弗雷
//ServletResponse是HttpServletResponse的父类
//FilterChain是过滤链
@Override
public void doFilter ( ServletRequest servletRequest , ServletResponse servletResponse , FilterChain filterChain ) throws IOException, ServletException {
//核心的代码
//请求过来时,输出age的数据
System.out.println ( "request coming:" + age );// 过滤逻辑代码
//放行
filterChain.doFilter ( servletRequest , servletResponse );
//如果下面还有一个过滤器,继续出力下一个过滤器,如果没有,则最终请求控制器
//响应阶段
System.out.println ( "response coming" );
}
@Override
public void destroy ( ) {
System.out.println ( "MyFilter1.destory" );
}
//FilterConfig代表了过滤器中的位置
}
现在就给HelloServlet使用
Web.xml
<filter >
<filter-name >myFilter1</filter-name >
<filter-class>com.njwbhz.mood.filter.MyFilter1</filter-class>
<init-param >
<param-name >age</param-name >
<param-value >20</param-value >
</init-param >
</filter >
<filter-mapping >
<filter-name >myFilter1</filter-name >
<!--
起到拦截作用
当请求/hello时,本来直接访问servlet,现在被过滤器拦截住了
先解决过滤器中的逻辑,最后再执行servlet
-->
<url-pattern >/hello</url-pattern >
</filter-mapping >
启动服务器:
说明:过滤器是在服务器启动的时候实例化和初始化。
观测哪些数据?
再增加一个过滤器,组成过滤链
package com.njwbhz.mood.filter;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter2 implements Filter {
private int age;
public MyFilter2 ( ) { }
@Override
public void init ( FilterConfig filterConfig ) throws ServletException { }
//doFilter相当于servlet中的service方法
//ServletRequest是HttpServletRequest的弗雷
//ServletResponse是HttpServletResponse的父类
//FilterChain是过滤链
@Override
public void doFilter ( ServletRequest servletRequest , ServletResponse servletResponse , FilterChain filterChain ) throws IOException, ServletException {
System.out.println ( "MyFilter2 coming");// 过滤逻辑代码
//放行
filterChain.doFilter ( servletRequest , servletResponse );
System.out.println ( "MyFilter2 back" );
}
@Override
public void destroy ( ) {
}
}
<filter >
<filter-name >myFilter2</filter-name >
<filter-class>com.njwbhz.mood.filter.MyFilter2</filter-class>
</filter >
<filter-mapping >
<filter-name >myFilter2</filter-name >
<url-pattern >/hello</url-pattern >
</filter-mapping >
启动,测试
调整过滤器的顺序,MyFilter2调整到过滤链中的第一个位置
过滤链的执行顺序可以通过配置的顺序完成。
要求:过滤器或过滤链同时作用于HelloServlet以及LifeServlet
要求:过滤器或过滤链同时作用于HelloServlet以及LifeServlet,OtherServlet
配置多个url-pattern,麻烦
使用通配符。
*:所有
url-pattern: /* 所以的请求都会被过滤器拦截
/page/user/login.jsp ,满足 ,则会进入到过滤器中
只想让访问控制器的时候,进入过滤器
url-pattern: 匹配所有的没有后缀的控制器地址,写不了
必须要先约定好,假如:控制器地址在配置的时候 ,约定都加一个后缀
如 .do 或 .action 或.xyz 后缀随便写
url-pattern: *.do
测试