第十章 过滤器 什么是过滤器: A:过滤器是封装了某些功能的一个Servlet B:过滤器能够在服务器接受客户端的请求之前进行预处理,也能够在服务器处理完结果之后进行后处理 C:过滤器拦截请求和响应,以便以某种方式操作正在客户机和服务器之间交换的数据 D:客户端----->(请求)过滤器------->Web服务器 或 Web服务器-->响应---->客户 E:过滤器会在客户端发送请求和服务器响应客户端"自动"被调用 为什么要使用过滤器: 提出问题 1)阻止末授权访问 2)压缩数据 结论:如果有多个JSP页面和Servlet都需要进行一个相同或相似的操作,我们可以把这个操作放到一个过滤器 如何编写过滤器 A:过滤器一般会继承HttpServlet类,并实现Filter接口 B:过滤器一定要实现Filter接口中定义的三个方法: 1)public void init(FilterConfig filterConfig) throws ServletException //初始化 其中的FilterConfig参数用来读取过滤器的配置信息,如果过滤处理过程中 不汲及到读取配置信息,则可以不使用这个参数 2)public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) //执行 3)public void destroy()//销毁 C:doFilter中的ServletRequest表示请求,ServletResponse表示响应。 HttpServletRequest是ServletRequest的子类,HttpServletResponse是 ServletResponse它的子类,为了得到更多的方法一般需要向子类进行转换 HttpServletRequest req=(HttpServletRequest)request; HttpServletResponse res=(HttpServletResponse)response; 在doFilter中进行程序处理之后,一定要调用filterChain.doFilter(request,response); 来执行过滤器(**************) 过滤器的生命周期 实例化--->初始化(去执行init方法)----->过滤(执行doFilter方法)--->销毁(执行destroy()方法) 过滤器编写配置信息 1)过滤器只要经过配置之后,才能使用。 2)在web.xml中进行配置 3)语法格式: <filter> //用来描述过滤器 <filter-name>loginfilter</filter-name> <filter-class>tagapp.loginFilter</filter-class> </filter> <filter-mapping> //过滤器的映射关系配置 <filter-name>loginfilter</filter-name> <url-pattern>/*</url-pattern> (表示所有页面都要经过过滤器过滤 </filter-mapping> 4)这些都是Jbulider自动生成的,但是要有所了解 过滤器的应用举例 说明:编写过滤器一定要搞清楚,不过滤的和过滤的页面 1)编写一个过滤器用来限制用户末登录就使用其页面 HttpServletRequest req=(HttpServletRequest)request; HttpServletResponse res=(HttpServletResponse)response; HttpSession session=req.getSession(); String url=req.getRequestURI(); if (session.getAttribute("isLogin")==null && !url.endsWith("login.jsp") && !url.endsWith("check.jsp") ) //说明没有登录 { res.sendRedirect("login.jsp"); } filterChain.doFilter(request,response); 2)使用过滤器限制客户访问游戏网站的时间 HttpServletResponse res = (HttpServletResponse) response; HttpServletRequest req = (HttpServletRequest) request; Date demo = new Date(); int save = demo.getHours(); String url=req.getRequestURI(); if (!(save >= 8 && save <= 18) && !url.endsWith("error.jsp")) { res.sendRedirect("error.jsp"); } filterChain.doFilter(request,response); 3)改进第2例中,使用参数配置来决定限制的时间段 A:设置参数 <filter> <filter-name>limitfilter</filter-name> <filter-class>tagapp.limitFilter</filter-class> <init-param> <param-name>starttime</param-name> <param-value>8</param-value> </init-param> </filter> B:读取参数 this.filterConfig.getInitParameter("starttime") 4)通过过滤器来解决从表单提交数据写入数据库中的乱码 正确情况下,如果从表单提交过来的数据是汉字,则会出现乱码。但是 可以通过request.setCharacterEncoding("GBK")来设置,但是每一个 页面都来设置很复杂,于是可以通过过滤器来实现 request.setCharacterEncoding("GBK"); filterChain.doFilter(request,response);

评论