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文件中得到访问者的记录。

(0)

相关推荐

  • 深入解析Java的Servlet过滤器的原理及其应用

    1.Servlet过滤器 1.1 什么是过滤器 过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上.过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息.在这之后,过滤器可以作如下的选择: ①以常规的方式调用资源(即,调用servlet或JSP页面). ②利用修改过的请求信息调用资源. ③调用资源,但在发送响应到客户机前对其进行修改. ④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出.   1.2 Servl

  • servlet过滤器(Filter)详解(九)

    本文实例为大家分享了servlet过滤器的具体代码,供大家参考,具体内容如下 1.servlet过滤器产生背景 项目中我们会遇到这样一类的需求,对访问服务器的用户ip实施过滤,只有在允许名单中的ip才能访问服务,为了实现需求,每当有客户端请求时,我们都会写校验ip的代码,客户端能够访问到的servlet我们都需要这样做,很明显这样做有一个缺点,就是代码冗余,维护不方便,如果验证规则改变,修改起来也特别麻烦. 为了解决以上问题,Filter 技术应运而生. 2.servlet过滤器是什么? ser

  • 详解Servlet之过滤器(Filter)

    过滤器 1.为什么使用它? 有很多全站性的东西需要处理,例如乱码问题,通过过滤器统一进行过滤更简单 2.有什么用? 实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截.简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理. 3.怎么用? 步骤1:先写一个类实现javax.servlet.Filter接口 步骤2:重写抽象方法 步骤3:在doFilter()方法中写处理代码,最后用FilterChain调用FilterCha

  • JSP使用Servlet过滤器进行身份验证的方法

    本文实例讲述了JSP使用Servlet过滤器进行身份验证的方法.分享给大家供大家参考,具体如下: 1.Servlet过滤器的作用描述 (1)在HttpServletRequest到达Servlet 之前,拦截客户的HttpServletRequest. 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据. (2)在HttpServletResponse 到达客户端之前,拦截HttpServletResponse. 根据需要检查HttpServ

  • Servlet 过滤器详细介绍

    1. 建立一个实现Filter接口的类所有过滤器都必须实现javax.servlet.Filter.这个接口包含三个方法,分别为doFilter.init和destroy. 复制代码 代码如下: public void doFilter(ServletRequset request,                ServletResponse response,               FilterChain chain)    thows ServletException, IOExce

  • java servlet过滤器使用示例

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

  • 基于java servlet过滤器和监听器(详解)

    1 过滤器 1.过滤器是什么? servlet规范当中定义的一种特殊的组件,用于拦截容器的调用. 注:容器收到请求之后,如果有过滤器,会先调用过滤器,然后在调用servlet. 2.如何写一个过滤器? 1.写一个java类,实现Filter接口; 2.在接口方法中实现拦截方法; 3.配置过滤器(web.xml); 3.配置初始化参数 1.配置初始化参数.(init-param) 2.通过filterconfig提供的getinitparamenter方法读取初始化的值. 4.优先级: 当有多个过

  • Java servlet 使用 PrintWriter 时的编码与乱码的示例代码

    在前面的网页中的编码与乱码系列中,曾多次提到使用 servlet 方式构建的动态响应流,不过在那里都是直接使用字节流的方式,不过,更为常见的方式是使用字符流.而在前面,又谈到了 Java 字节流与字符流的话题. 有了前面的基础,现在来说下 Java servlet 中使用字符流,也即是 PrintWriter 时的编码与乱码问题. 回顾字节流的情形 先回顾一下,在之前的字节流响应中,我们使用 String.getBytes 方法,然后总是显式传入编码的参数,使它与 meta 中或者 header

  • java Servlet 实现动态验证码图片示例

    整理文档,搜刮出一个java Servlet 实现动态验证码图片的代码,稍微整理精简一下做下分享. package com.hacker; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; i

  • 浅析JAVA中过滤器、监听器、拦截器的区别

    1.过滤器:所谓过滤器顾名思义是用来过滤的,在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符(聊天室经常用到的,一些骂人的话).filter 流程是线性的, url传来之后,检查之后,可保持原来的流程

  • Java web过滤器验证登录防止未登录进入界面

    今天用ssh2写了个简单的系统,发现了一个问题,我这系统必须先登录成功才能进入主页,但我在浏览器里直接输入主页地址,发现也能进入,这个肯定不好,毫无安全性可言,后经查资料发现需要登录过滤器,就试了下,发现果然可以避免未经登录即可进入主页的危险,下面是我整理出的详细步骤: 1.首先写一个权限过滤filter类,实现Filter接口 import java.io.IOException; import javax.servlet.Filter; import javax.servlet.Filter

  • 传智播客java web 过滤器

    根本不利于使用,Servlet应该本是为简化工作而创造的啊!我当时觉得是我的设计框架产生了问题.第二天我便问方老师,确实是使用上有些问题.比如,显示访问计数,我把它单独写成了一个Servlet,什么地方需要它时,便由那个Servlet.include引用计数的Servlet.但这样总会产生一些问题和使用上的不便.比如include的Servlet必须使用相同的流,如果使用forward后任何输出都无效了. 方老师当时建议,把有些功能写到一起.但最后提到了过滤器,那时我便对过滤器产生了兴趣,今日也

  • Java Filter 过滤器详细介绍及实例代码

    Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 它主要用于对用户请求进行预处理,也可以对HttpServletResponse 进行后处理.使用Filter 的完整流程:Filter 对用户请求进行预处理,接着将

随机推荐