• JAVAWEB Filter使用


    Filter学习
     1Filter是什么:是过滤器简称
     2Filter有什么作用:在filter中可以得到代表用户请求和响应的request、response对象,因此在编程中可以使用Decorator(装饰器)模式对request、response对象进行            包装,再把包装对象传给目标资源,从而实现一些特殊需求。
      Example: 举一个不恰当的例子:比如当我们喜欢的人电话给我们,我们想手机提供不一样的铃声,
            让我来区分是谁打电话给我,这样我就不用拿出手机出来,才知道谁打电话给我
     3Filter运行原理解析
     如下图:
     

       3Filter接口的介绍:
     ①FilterConfig接口:用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始            化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:

      String getFilterName():得到filter的名称。
      String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
      Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
      public ServletContext getServletContext():返回Servlet上下文对象的引用。

       ②FilterChian接口:在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
              web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表            Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain          对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源(就是URL的资源)。

     3Filter怎样使用:
      使用步骤:

        1自定义Filter,并实现内置的Filter接口
        2复写doFilter()方法,在里面处理我们需要的逻辑
        3若还有其他过滤器就调用FilterChian的doFilter()方法
        4若返回页面就是用response
        5注册Filter,配置Filter拦截怎样的请求
     4JAVAWEB的Filter代码示例
    ①自定义Filter:

    package com.filter.demo;
    
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class CharacterEncodingFilter implements Filter{
        
        FilterConfig filterConfig=null;
        String characterEncoding="UTF-8";
        String str;
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1,
                FilterChain arg2) throws IOException, ServletException {
            HttpServletRequest request=(HttpServletRequest) arg0;
            HttpServletResponse response=(HttpServletResponse) arg1;
            System.out.println("拦截到请求了");
            System.out.println("编码为---->"+str);
            if (str==null) {
                System.out.println();
                str=characterEncoding;
            }
            //2设置编码
            request.setCharacterEncoding(str);
            response.setCharacterEncoding(str);
            request.setAttribute("name", "jere");
            System.out.println("执行前--->name="+request.getAttribute("name"));
            //返回下一个Filter
            arg2.doFilter(request, response);
            System.out.println("执行后--->name="+request.getAttribute("name"));
        }
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            System.out.println(this.getClass().getName()+"过滤器启动了-----");
            //获取启动的时的参数
            filterConfig=arg0;
            str=filterConfig.getInitParameter("name");
        }
    
    }

    自定义Servlet:

    package com.filter.demo;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.jasper.tagplugins.jstl.core.Out;
    
    /**
     * Servlet implementation class FilterServlet
     */
    public class FilterServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public FilterServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.getWriter().print("test");
            request.setAttribute("name", "jeremy");
        }
    
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
        }
    
    }

    ③在web.xml文件注册Servlet和Filter
      

     <servlet>
        <description></description>
        <display-name>FilterServlet</display-name>
        <servlet-name>FilterServlet</servlet-name>
        <servlet-class>com.filter.demo.FilterServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>FilterServlet</servlet-name>
        <url-pattern>/FilterServlet</url-pattern>
      </servlet-mapping>
      <filter>
              <filter-name>CharacterEncodingFilter</filter-name>
            <filter-class>com.filter.demo.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>name</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
      </filter>
      <filter-mapping>
              <filter-name>CharacterEncodingFilter</filter-name>
          <!-- 也可以使用URL-Pattern --> <servlet-name>FilterServlet</servlet-name> </filter-mapping>

    页面测试

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    <a href="/FilterDemo/FilterServlet">test Filter</a>
    </body>
    </html>

    以上就是简单的FIlter示例

  • 相关阅读:
    十进制,二进制,八进制,十六进制中的相互转换
    oracle中dual表的使用
    弹出窗口
    oracle中的函数
    [导入]几种所见所得的在线编辑器
    操作字符串
    设计模式初认识
    创建型模式之简单工厂模式
    MySQL批量检查表的脚本
    中英文单位对照
  • 原文地址:https://www.cnblogs.com/jeremy-blog/p/4419556.html
Copyright © 2020-2023  润新知