主頁(yè) > 知識(shí)庫(kù) > java servlet過(guò)濾器使用示例

java servlet過(guò)濾器使用示例

熱門(mén)標(biāo)簽:地圖標(biāo)注線上教程 電銷(xiāo)機(jī)器人好賣(mài)么 電銷(xiāo)機(jī)器人是有一些什么技術(shù) 杭州ai語(yǔ)音電銷(xiāo)機(jī)器人功能 北票市地圖標(biāo)注 商洛電銷(xiāo) 杭州語(yǔ)音電銷(xiāo)機(jī)器人軟件 四川保險(xiǎn)智能外呼系統(tǒng)商家 高德地圖標(biāo)注樣式

Servlet過(guò)濾器簡(jiǎn)介     
Servlet過(guò)濾器實(shí)際上就是一個(gè)標(biāo)準(zhǔn)的java類(lèi),這個(gè)類(lèi)通過(guò)實(shí)現(xiàn)Filter接口獲得過(guò)濾器的功能。它在jsp容器啟動(dòng)的時(shí)候通過(guò)web.xml配置文件被系統(tǒng)加載。
Servlet過(guò)濾器在接收到用戶(hù)請(qǐng)求的時(shí)候被調(diào)用,當(dāng)服務(wù)器接收到用戶(hù)的請(qǐng)求的時(shí)候,依次調(diào)用配置好的過(guò)濾器,完成后將執(zhí)行請(qǐng)求所要求的servlet,而servlet執(zhí)行后的響應(yīng),則先通過(guò)配置好的過(guò)濾器后再發(fā)送給用戶(hù)。

過(guò)濾器的用途:
1、用戶(hù)認(rèn)證和授權(quán)管理。
2、統(tǒng)計(jì)web應(yīng)用的訪問(wèn)量和訪問(wèn)命中率,生成訪問(wèn)報(bào)告。
3、實(shí)現(xiàn)web應(yīng)用的日志處理功能。
4、實(shí)現(xiàn)數(shù)據(jù)壓縮功能。
5、對(duì)傳輸?shù)臄?shù)據(jù)進(jìn)行加密。
6、實(shí)現(xiàn)xml文件的XSLT的轉(zhuǎn)換。
一個(gè)servlet過(guò)濾器其實(shí)是一個(gè)java類(lèi),它的實(shí)現(xiàn)需要分為兩個(gè)部分,java類(lèi)自身以及在web.xml文件中的XML描述。對(duì)于filter接口,該接口由一對(duì)描述的生命周期的方法init(),destroy(),init方法在服務(wù)器初始化過(guò)濾器的時(shí)候會(huì)調(diào)用,而destory方法在服務(wù)器關(guān)閉的時(shí)候會(huì)調(diào)用,還有一個(gè)行為方法doFilter方法會(huì)在執(zhí)行過(guò)濾操作的時(shí)候調(diào)用.

Servlet過(guò)濾器的配置
Servet過(guò)濾器需要通過(guò)web應(yīng)用程序部署描述符文件web.xml來(lái)部署到應(yīng)用中。配置如下

復(fù)制代碼 代碼如下:

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>

下面是示例:

使用過(guò)濾器解決中文編碼問(wèn)題:
由于java的默認(rèn)編碼方式是ISO-8859-1,而通常編寫(xiě)中文應(yīng)用程序的時(shí)候都是使用GB2312或gbk編碼方式。在這種情況下,應(yīng)在頁(yè)面的首部通過(guò)%@ page contentType="text/html;charset=gbk"%>命令來(lái)指定頁(yè)面的編碼方式。這樣中文頁(yè)面就可以正常地顯示了。但是如果頁(yè)面中村中表單。如一個(gè)input輸入框,如果訪問(wèn)者在其中輸入中文,又提交到某個(gè)servlet進(jìn)行處理的話(huà),java會(huì)首先按ISO-5589-1的默認(rèn)方式對(duì)這段文本進(jìn)行編碼,然后交給servet處理,處理后的文本將還是以ISO-5589-1編碼方式村中,如果這個(gè)時(shí)候這個(gè)文本返回一個(gè)按GBK編碼來(lái)顯示的頁(yè)面,由于編碼格式的不同,很顯然得不到正確的顯示結(jié)果。
對(duì)于編碼方式的解決方法有很多種,這里主要介紹用過(guò)濾器來(lái)解決中文編碼問(wèn)題:

復(fù)制代碼 代碼如下:

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的配置:

 

復(fù)制代碼 代碼如下:

 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的編寫(xiě)?

 

復(fù)制代碼 代碼如下:

 用戶(hù)名: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">

        用戶(hù)名:input type="test" name="username"> br>

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

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

      /form>
 

啟動(dòng)tomcat,訪問(wèn)encoding.jsp,輸入“張山”就可以看到,經(jīng)過(guò)過(guò)濾器后,頁(yè)面可以正常顯示服務(wù)器傳出的信息。。。

使用過(guò)濾器記錄用戶(hù)訪問(wèn)日志
對(duì)于有些項(xiàng)目,它對(duì)于用戶(hù)的每次訪問(wèn)都要有詳細(xì)的記錄。那么這是使用記錄日志是一個(gè)非常好的解決方法,使用過(guò)濾器就可以很輕松地對(duì)每次用戶(hù)的訪問(wèn)進(jìn)行記錄。但是由于同一個(gè)訪問(wèn)者在同一個(gè)時(shí)段訪問(wèn)站點(diǎn)不同的頁(yè)面時(shí),不能重復(fù)記錄日志,否則日志將會(huì)在很短的時(shí)間內(nèi)塞滿(mǎn)服務(wù)器的硬盤(pán)空間。于是這里可以利用session對(duì)象來(lái)判斷用戶(hù)的每次會(huì)話(huà),在一次會(huì)話(huà)中,過(guò)濾器只會(huì)記錄一次。
下面編寫(xiě)LogFilter類(lèi),這個(gè)過(guò)濾器主要負(fù)責(zé)記錄用戶(hù)的訪問(wèn)記錄:

復(fù)制代碼 代碼如下:

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對(duì)象
    HttpSession session = hRequest.getSession();
    // 先判斷session中的LOGGED是否有值,如沒(méi)有則說(shuō)明是新的請(qǐng)求
    if(null==session.getAttribute("LOGGED")){
      session.setAttribute("LOGGED", "yes");    // 設(shè)置LOGGED的值為yes,防止同一會(huì)話(huà)重復(fù)記錄
      File file = new File(this.filename);
      if(!file.exists())
        file.createNewFile();        // 判斷文件是否存在,如果不存在,就建立一個(gè)新的

      /*
       * 創(chuàng)建日志記錄內(nèi)容logContent包括訪問(wèn)者的IP, 訪問(wèn)的頁(yè)面URL和訪問(wèn)的時(shí)間以及日志過(guò)濾器的名字
       */
      String logContent = hRequest.getRemoteHost()+"->"+hRequest.getRequestURI()+" Logged "+getTime()+" By s"+this.filtername+"\r\n";
      RandomAccessFile rf = new RandomAccessFile(this.filename,"rw");   // 建立一個(gè)隨機(jī)文件操作對(duì)象
      rf.seek(rf.length());   // 將寫(xiě)入指針指向文件的尾部,rf.length()獲得文件的長(zhǎng)度,seek文件長(zhǎng)度這么長(zhǎng)得距離正好是文件的尾部
      rf.writeBytes(logContent);   // 將日志寫(xiě)入到文件中去
      rf.close();   // 關(guān)閉文件
    }
    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();
  }

  // 獲取時(shí)間
  private String getTime(){
    SimpleDateFormat sdf  = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
    return sdf.format(new Date());
  }

}

這里利用session來(lái)限制同一個(gè)會(huì)話(huà)只會(huì)記錄一次日志,而不管這個(gè)會(huì)話(huà)中的訪問(wèn)者訪問(wèn)了多少個(gè)頁(yè)面,在第一次訪問(wèn)的時(shí)候,由于session的LOGGED是空的,所以這個(gè)時(shí)候記錄日志并把LOGGED設(shè)置為yes,這樣第二次判斷的時(shí)候?qū)⒉粫?huì)執(zhí)行記錄日志。
然后在來(lái)配置XML:

復(fù)制代碼 代碼如下:

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后,訪問(wèn)跟目錄下地任何文件,都會(huì)可以在D:/log.txt文件中得到訪問(wèn)者的記錄。

您可能感興趣的文章:
  • Spring Security如何在Servlet中執(zhí)行
  • servlet+jsp實(shí)現(xiàn)過(guò)濾器 防止用戶(hù)未登錄訪問(wèn)
  • 基于java servlet過(guò)濾器和監(jiān)聽(tīng)器(詳解)
  • 深入解析Java的Servlet過(guò)濾器的原理及其應(yīng)用
  • Spring Security中的Servlet過(guò)濾器體系代碼分析

標(biāo)簽:江西 青島 宿州 云浮 紅河 丹東 西藏 貴州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《java servlet過(guò)濾器使用示例》,本文關(guān)鍵詞  java,servlet,過(guò)濾器,使用,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《java servlet過(guò)濾器使用示例》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于java servlet過(guò)濾器使用示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章