• javaWeb中servlet开发——过滤器


    servlet开发——过滤器(filter)

    servlet有三种,分为简单servlet、过滤器servlet、监听servlet

    简单servlet是作为一种程序所必须的开发结构保存的,继承httpServlet类形式。

    过滤器servlet和监听servlet不是程序所必须的。

    要想完成一个过滤器的开发,首先必须让一个类实现Filter接口,此接口是javax.serclet中的。根据这个包的特点可发现,此接口的主要功能是完成公共协议的操作。

    Filter接口中的方法:

    简单的servlet必须手工调用,如在form表单的action之中编写路径。

    过滤这种操作本身属于本身自动完成的。package org.lxh.filterdemo ;

    import java.io.* ;
    import javax.servlet.* ;
    public class SimpleFilter implements Filter {
    	public void init(FilterConfig config)
              throws ServletException{
    		// 接收初始化的参数
    		String initParam = config.getInitParameter("ref") ;	
    		System.out.println("** 过滤器初始化,初始化参数=" + initParam) ;
    	}
    	public void doFilter(ServletRequest request,
                  ServletResponse response,
                  FilterChain chain)
                  throws IOException,
                         ServletException{
    		System.out.println("** 执行doFilter()方法之前") ;
    		chain.doFilter(request,response) ;
    		System.out.println("** 执行doFilter()方法之后") ;
    } public void destroy(){ System.out.println("** 过滤器销毁。") ;
    try{
    Thread.sleep(1000);//线程中休眠,可以看出销毁输出
    }cathc(Exception e){
    } } }

     过滤器完成,也需要在web.xml中进行配置。先写filer配置,再写简单servlet配置

    <display-name>Welcome to Tomcat</display-name>
      <description>
         Welcome to Tomcat
      </description>
        <filter>
            <filter-name>simple</filter-name>
            <filter-class>org.lxh.filterdemo.SimpleFilter</filter-class>
            <init-param>
                <param-name>ref</param-name>
                <param-value>HELLOMLDN</param-value>
            </init-param>
        </filter>
           <filter-mapping>
            <filter-name>simple</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

    此处,<url-mapping>表示一个过滤器的过滤路径,现在既然是”/*则表示对 一个目录中的所有内容进行过滤。

    过滤器不需要任何配置,就可以在服务器启动的时候自动地完成初始化操作。

    一个过滤器的生命周期和servlet是相同的。

    doFilter方法中FitlerChain作用

     过滤器是执行两次的,一个过滤器本身可以对多个路径进行过滤。那么过滤器如何应用?

    在实际开发中,应用最频繁的就是编码过滤和登录验证。

    对应编码,所有的页面都需要使用,只要是页面,都需要编写request.setCharacterEncoding()方法对编码进行限制。

    package org.lxh.filterdemo ;
    import java.io.* ;
    import javax.servlet.* ;
    public class EncodingFilter implements Filter {
        private String charSet ;
        public void init(FilterConfig config)
              throws ServletException{
            // 接收初始化的参数
            this.charSet = config.getInitParameter("charset") ;    
        }
        public void doFilter(ServletRequest request,
                  ServletResponse response,
                  FilterChain chain)
                  throws IOException,
                         ServletException{
            request.setCharacterEncoding(this.charSet) ;
            chain.doFilter(request,response) ;
        }
        public void destroy(){
        }

    进行web.xml配置

    <filter>
            <filter-name>encoding</filter-name>
            <filter-class>org.lxh.filterdemo.EncodingFilter</filter-class>
            <init-param>
                <param-name>charset</param-name>
                <param-value>GBK</param-value>
            </init-param>
        </filter>
    <filter-mapping>
            <filter-name>encoding</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

    至于登录验证操作,都需要session验证,但每个页面都写session判断,相当复杂,所以可以对一些需要限制的地方采用登录验证。

    package org.lxh.filterdemo ;
    import java.io.* ;
    import javax.servlet.* ;
    import javax.servlet.http.* ;
    public class LoginFilter implements Filter {
        public void init(FilterConfig config)
              throws ServletException{
        }
        public void doFilter(ServletRequest request,
                  ServletResponse response,
                  FilterChain chain)
                  throws IOException,
                         ServletException{
            // session属于http协议的范畴
            HttpServletRequest req = (HttpServletRequest) request ;
            HttpSession ses = req.getSession() ;
            if(ses.getAttribute("userid") != null) {
                // 已经登陆过了,则可以访问
                chain.doFilter(request,response) ;
            } else {
                request.getRequestDispatcher("login.jsp").forward(request,response) ;
            }
        }
        public void destroy(){
        }
    }
  • 相关阅读:
    Vivado生成及使用edf文件
    ZYNQ Block Design中总线位宽的截取与合并操作
    Modelsim问题集锦
    Questasim10.6c下载安装教程
    ZYNQ工程PL顶层创建block module报错解决
    Linux自定义应用程序及其菜单图标
    OpenWRT DNS无法解析WAN连接的内网服务器域名
    Wishbone总线从接口转Xilinx MIG (Spartan 6)
    Wishbone总线接口RAM
    Windows系统下将目录挂载为一个磁盘并分配盘符
  • 原文地址:https://www.cnblogs.com/snowwang/p/6005977.html
Copyright © 2020-2023  润新知