zoukankan      html  css  js  c++  java
  • 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(){
        }
    }
  • 相关阅读:
    PythonStudy——数据类型总结 Data type summary
    PythonStudy——可变与不可变 Variable and immutable
    PythonStudy——列表操作 List operatio
    PythonStudy——列表的常用操作 List of common operations
    PythonStudy——列表类型 List type
    PythonStudy——字符串扩展方法 String extension method
    PythonStudy——字符串重要方法 String important method
    AWT,Swing,RCP 开发
    JQuery插件机制
    最新知识网站
  • 原文地址:https://www.cnblogs.com/snowwang/p/6005977.html
Copyright © 2011-2022 走看看