Struts1.x FILTER过滤器的使用
1、过滤器概述过滤器的作用,就是拦截发送到服务端的request/response对象,并且对其进行加工,过滤器具有双向顺序:filter chain (chain 链,束缚)过滤器被调用的顺序,其实就是web.xml中被定义的顺序:Browers ==>Filter1 ==>Filter2 ==>Filter3 ==>Web ServerWeb 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, ServletExceptionFilterChain的doFilter()方法是用过滤后的请求调用资源的方法,如果不写这个方法,也就不会去调用相应的资源。 销毁(destroy()方法由容器在销毁过滤器实例之前调用 ); public void destroy();
4、配置一个过滤器在web.xml中进行配置:<filter> <filter-name>authenticateFilter</filter-name> <filter-class> com.yinhai.xian.login.fiter.AuthenticateFilter </filter-class> <init-param> <param-name>defaultUrl</param-name> <param-value>/index.do</param-value> </init-param></filter><filter-mapping> <filter-name>authenticateFilter</filter-name> <url-pattern>*.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()重定向会产生一个新的请求。