• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    java servlet过滤器使用示例

    Servlet过滤器简介     
    Servlet过滤器实际上就是一个标准的java类,这个类通过实现Filter接口获得过滤器的功能。它在jsp容器启动的时候通过web.xml配置文件被系统加载。
    Servlet过滤器在接收到用户请求的时候被调用,当服务器接收到用户的请求的时候,依次调用配置好的过滤器,完成后将执行请求所要求的servlet,而servlet执行后的响应,则先通过配置好的过滤器后再发送给用户。

    过滤器的用途:
    1、用户认证和授权管理。
    2、统计web应用的访问量和访问命中率,生成访问报告。
    3、实现web应用的日志处理功能。
    4、实现数据压缩功能。
    5、对传输的数据进行加密。
    6、实现xml文件的XSLT的转换。
    一个servlet过滤器其实是一个java类,它的实现需要分为两个部分,java类自身以及在web.xml文件中的XML描述。对于filter接口,该接口由一对描述的生命周期的方法init(),destroy(),init方法在服务器初始化过滤器的时候会调用,而destory方法在服务器关闭的时候会调用,还有一个行为方法doFilter方法会在执行过滤操作的时候调用.

    Servlet过滤器的配置
    Servet过滤器需要通过web应用程序部署描述符文件web.xml来部署到应用中。配置如下

    复制代码 代码如下:

    filter>
        filter-name>Filtername/filter-name>

        filter-class>com.filter.Filter/class/filter-class>

           init-param>
       param-name>file/param-name>
       param-value>filename/param-value>
           /init-param>
        /filter>

        filter-mapping>
     filter-name>Filtername/filter-name>
    url-pattern>/*/url-pattern>
       /filter-mapping>

    下面是示例:

    使用过滤器解决中文编码问题:
    由于java的默认编码方式是ISO-8859-1,而通常编写中文应用程序的时候都是使用GB2312或gbk编码方式。在这种情况下,应在页面的首部通过%@ page contentType="text/html;charset=gbk"%>命令来指定页面的编码方式。这样中文页面就可以正常地显示了。但是如果页面中村中表单。如一个input输入框,如果访问者在其中输入中文,又提交到某个servlet进行处理的话,java会首先按ISO-5589-1的默认方式对这段文本进行编码,然后交给servet处理,处理后的文本将还是以ISO-5589-1编码方式村中,如果这个时候这个文本返回一个按GBK编码来显示的页面,由于编码格式的不同,很显然得不到正确的显示结果。
    对于编码方式的解决方法有很多种,这里主要介绍用过滤器来解决中文编码问题:

    复制代码 代码如下:

    public class CharacterEncodingFilter implements Filter {
    private FilterConfig config;
    private String encoding = "ISO8859_1";
    public void destroy() {

      config = null;

    }

    public void doFilter(ServletRequest request, ServletResponse response ,

       FilterChain chain) throws IOException, ServletException {

      request.setCharacterEncoding(encoding);

      chain.doFilter(request, response);

    }

    public void init(FilterConfig config) throws ServletException {

      this.config  = config;

      String s = config.getInitParameter("encoding");

      if(s!=null){

       encoding = s;

      }

    }

    }

     然后在是XML的配置:

     

    复制代码 代码如下:

     filter>

        filter-name>encodingFilter/filter-name>

        filter-class>com.filter.CharacterEncodingFilter/filter-class>

        init-param>

          param-name>encoding/param-name>

          param-value>utf-8/param-value>

        /init-param>

      /filter>

      filter-mapping>

        filter-name>encodingFilter/filter-name>

        url-pattern>/*/url-pattern>

      /filter-mapping>
     

     最后是encoding.jsp的编写?

     

    复制代码 代码如下:

     用户名:c:out value="${param.username}" default="none">/c:out>br>

          密码:c:out value="${param.userpassword}" default="none">/c:out>br>

          form action="MyJsp.jsp" method="post">

            用户名:input type="test" name="username"> br>

            密码:input type="password" name="userpassword">br>

            input type="submit" value="提交">

          /form>
     

    启动tomcat,访问encoding.jsp,输入“张山”就可以看到,经过过滤器后,页面可以正常显示服务器传出的信息。。。

    使用过滤器记录用户访问日志
    对于有些项目,它对于用户的每次访问都要有详细的记录。那么这是使用记录日志是一个非常好的解决方法,使用过滤器就可以很轻松地对每次用户的访问进行记录。但是由于同一个访问者在同一个时段访问站点不同的页面时,不能重复记录日志,否则日志将会在很短的时间内塞满服务器的硬盘空间。于是这里可以利用session对象来判断用户的每次会话,在一次会话中,过滤器只会记录一次。
    下面编写LogFilter类,这个过滤器主要负责记录用户的访问记录:

    复制代码 代码如下:

    package com.filter;

    import java.io.File;
    import java.io.IOException;
    import java.io.RandomAccessFile;

    import java.text.SimpleDateFormat;
    import java.util.Date;
    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.HttpSession;

    import com.sun.org.apache.bcel.internal.generic.NEW;

    public class LoginFilter implements Filter{

      private FilterConfig config =null;
      private String filename = null;
      private String filtername = null;
      public void destroy() {
        this.config = null;
        this.filename = null;
        this.filtername = null;
      }

      public void doFilter(ServletRequest request , ServletResponse response,
          FilterChain chain ) throws IOException, ServletException {
        HttpServletRequest hRequest = (HttpServletRequest) request;
        // 获取session对象
        HttpSession session = hRequest.getSession();
        // 先判断session中的LOGGED是否有值,如没有则说明是新的请求
        if(null==session.getAttribute("LOGGED")){
          session.setAttribute("LOGGED", "yes");    // 设置LOGGED的值为yes,防止同一会话重复记录
          File file = new File(this.filename);
          if(!file.exists())
            file.createNewFile();        // 判断文件是否存在,如果不存在,就建立一个新的

          /*
           * 创建日志记录内容logContent包括访问者的IP, 访问的页面URL和访问的时间以及日志过滤器的名字
           */
          String logContent = hRequest.getRemoteHost()+"->"+hRequest.getRequestURI()+" Logged "+getTime()+" By s"+this.filtername+"\r\n";
          RandomAccessFile rf = new RandomAccessFile(this.filename,"rw");   // 建立一个随机文件操作对象
          rf.seek(rf.length());   // 将写入指针指向文件的尾部,rf.length()获得文件的长度,seek文件长度这么长得距离正好是文件的尾部
          rf.writeBytes(logContent);   // 将日志写入到文件中去
          rf.close();   // 关闭文件
        }
        chain.doFilter(request, response);
      }

      public void init(FilterConfig config) throws ServletException {
        this.config = config;
        this.filename = this.config.getInitParameter("file");
        this.filtername = this.config.getFilterName();
      }

      // 获取时间
      private String getTime(){
        SimpleDateFormat sdf  = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
        return sdf.format(new Date());
      }

    }

    这里利用session来限制同一个会话只会记录一次日志,而不管这个会话中的访问者访问了多少个页面,在第一次访问的时候,由于session的LOGGED是空的,所以这个时候记录日志并把LOGGED设置为yes,这样第二次判断的时候将不会执行记录日志。
    然后在来配置XML:

    复制代码 代码如下:

    filter>
        filter-name>LogFilter/filter-name>
        filter-class>com.filter.LoginFilter/filter-class>
        init-param>
          param-name>file/param-name>
          param-value>D:/log.txt/param-value>
        /init-param>
      /filter>

      filter-mapping>
        filter-name>LogFilter/filter-name>
        url-pattern>/*/url-pattern>
      /filter-mapping>

    配置好XML后,访问跟目录下地任何文件,都会可以在D:/log.txt文件中得到访问者的记录。

    您可能感兴趣的文章:
    • Spring Security如何在Servlet中执行
    • servlet+jsp实现过滤器 防止用户未登录访问
    • 基于java servlet过滤器和监听器(详解)
    • 深入解析Java的Servlet过滤器的原理及其应用
    • Spring Security中的Servlet过滤器体系代码分析
    上一篇:jsp实现文件上传下载的程序示例
    下一篇:Jsp中response对象的所有属性详细介绍
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    java servlet过滤器使用示例 java,servlet,过滤器,使用,