1、过滤器概述
过滤器的作用,就是拦截发送到服务端的request/response对象,并且对其进行加工,过滤器具有双向顺序:filter chain (chain 链,束缚)
过滤器被调用的顺序,其实就是web.xml中被定义的顺序:
Browers ==>Filter1 ==>Filter2 ==>Filter3 ==>Web Server
Web Server ==>Filter3 ==>Filter2 ==>Filter1 ==>Browers
过滤器的定义:
与Servlet相似,过滤器是一些Web应用程序组件,可以绑定到一个Web应用程序中。但是与其他Web应用程序组件不同的是,过滤器是"链"在容器的处理过程中的。这就意味着它们会在servlet处理器之前访问一个进入的请求,并且在外发的响应信息返回到客户前访问这些响应信息。这种访问使得过滤器可以检查并修改请求和响应的内容。
一个很典型的应用:
在西安机保项目中,要求某一些业务请求类型在1-20号之外不允许被用户访问,则可以写一个过滤器,根据当前的系统时间,不允许该类的请求被处理,以及做登入,登出的日志记录等等。
一个Filter类原则上要继承HttpServlet,并且实现javax.servlet.Filter接口,并且实现init()、doFilter()、dostory()三个方法。
2、过滤器放在容器的什么位置?
过滤器放在Web资源之前,可以在请求抵达它所应用的Web资源(可以是一个servlet、一个JSP页面,甚至是一个HTML页面这样的静态内容)之前截获进入的请求,并且在它返回到客户之前截获输出。
3、过滤器的生命周期
实例化:初始化(调用init()方法);
public void init(FilterConfig config) throws ServletException
过滤(调用doFilter()方法,包含过滤器逻辑 ),Servlet会将web.xml里面配置的<param>参数值封装为FilterConfig传入Filter。
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
FilterChain的doFilter()方法是用过滤后的请求调用资源的方法,如果不写这个方法,也就不会去调用相应的资源。
销毁(destroy()方法由容器在销毁过滤器实例之前调用 );
public void destroy();
4、配置一个过滤器
在web.xml中进行配置:
<filter>
authenticateFilter</filter-name>
<filter-class>
com.yinhai.xian.login.fiter.AuthenticateFilter
</filter-class>
<init-param>
defaultUrl</param-name>
/index.do</param-value>
</init-param>
</filter>
<filter-mapping>
authenticateFilter</filter-name>
*.do</url-pattern>
</filter-mapping>
5、Filter的使用
参见/xajgyl/javacode/xian/com/yinhai/xian/login/fiter/AuthenticateFilter.java
里面有一个转发的函数:
hsr 为 HttpServletRequest对象实例
hsr.getRequestDispatcher("/timeLimit.jsp").forward(request, response);
request dispatcher的二种传送请求方式
Forward: 将请求从一个servlet传到服务器上的其他资源(servlet、JSP、HTML);
Include: 将静态或动态内容包含在当前servlet中;
获得request dispatcher的二种方式:
ServletRequest.getRequestDispatcher("/timeLimit.jsp") // 相对路径
ServletContext.getRequestDispatcher("timeLimit.jsp") // 绝对路径
Response.sendRedirect(/servapp/state/login);//要写绝对路径,产生新的请求
Forward(req,resp);//在当前路径基础上跳转
两个页面之间跳转的时侯如果需要数据传递,则只能用forward(),因为sendRedirect()重定向会产生一个新的请求。