1. 程式人生 > >servlet和jsp頁面過濾器Filter的作用及配置

servlet和jsp頁面過濾器Filter的作用及配置

剛剛有個朋友問我,Servlet的過濾器有什麼作用?
現在發個帖子說明一下,
           過濾器是一個物件,可以傳輸請求或修改響應。它可以在請求到達Servlet/JSP之前對其進行預處理,而且能夠在響應離開Servlet /JSP之後對其進行後處理。所以如果你有幾個Servlet/JSP需要執行同樣的資料轉換或頁面處理的話,你就可以寫一個過濾器類,然後在部署描述文 件(web.xml)中把該過濾器與對應的Servlet/JSP聯絡起來。你可以一個過濾器以作用於一個或一組servlet,零個或多個過濾器能過濾 一個或多個servlet。
         一個過濾器實現java.servlet.Filter介面並定義它的三個方法:
    1. void init(FilterConfig config) throws ServletException:在過濾器執行service前被呼叫,以設定過濾器的配置物件。
    2. void destroy();在過濾器執行service後被呼叫。
    3. Void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException;
       可能這麼說,大家還是不太理解。舉個例子來說,面嚮物件語言的特徵裡有個介面的概念,一個類實現該介面,就必須要實現介面的所有方法。那麼如果我寫了一個類,實現這個介面又不想實現所有方法,怎麼辦呢?
      寫個抽象類,實現這個介面的所有方法,然後我寫的類繼承這個抽象類。就可以不用實現所有方法了。看到這裡大家都懂了過濾器是幹什麼的吧
      
      既然懂了,那就直接上程式碼說明一下怎麼配置的。

開發EncodingFilter.java檔案,繼承自javax.servlet.Filter:
package bluemoon.crm.systemmanage.struts.Filter;

import java.io.*;
import javax.servlet.*;

public class EncodingFilter implements Filter
{
protected String encoding = null;
protected FilterConfig config;

public void init(FilterConfig filterConfig) throws
ServletException { this.config = filterConfig; //從web.xml配置檔案中獲取編碼配置 this.encoding = filterConfig.getInitParameter("Encoding"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if(request.getCharacterEncoding() == null) { String encode
= getEncoding(); if(encode != null) { //設定request的編碼方式 request.setCharacterEncoding(encode); } } chain.doFilter(request,response); } public String getEncoding() { return encoding; } public void destroy() { } }
在web.xml檔案中加入如下配置資訊:
<!-- 頁面請求編碼過濾器 注意每個頁面的pageEncoding="GB2312" -->
<filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>bluemoon.crm.systemmanage.struts.Filter.EncodingFilter</filter-class>
  <init-param>
  <param-name>Encoding</param-name>
  <param-value>GB2312</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <!-- 對全部的jsp頁面有效,比較鬱悶的是沒有太多的配置方式 -->
  <url-pattern>/*</url-pattern>
</filter-mapping> 

 使用者是否登陸過濾器:
1.首先增加一個Action、ActionForm & JSP: login.jsp中為一個登陸表單: UserActionForm.java為一個Struts的ActionForm。 UserAction.java將使用者登陸資訊新增到session中。

 開發UserLoginedFilter.java:
package bluemoon.crm.systemmanage.struts.Filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.*;

import bluemoon.crm.systemmanage.struts.forms.UserActionForm;

public class UserLoginedFilter extends HttpServlet implements Filter
{
protected FilterConfig config;

public void init(FilterConfig filterConfig) throws ServletException
{
this.config = filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
RequestDispatcher dispatcher = request.getRequestDispatcher("userLogin.jsp");
HttpServletRequest userRequest = (HttpServletRequest)request;
UserActionForm userActionForm = (UserActionForm)userRequest.getSession().getAttribute("userActionForm");
if(userActionForm == null || userActionForm.getUser_name() == null || userActionForm.getUser_name().trim().length()<1)
{
System.out.println("使用者未登入!");
dispatcher.forward(request,response);
return;
}
System.out.println("使用者已登入!");
chain.doFilter(request,response);
}
public void destroy()
{
}
}
在web.xml檔案中新增如下配置資訊:
<!—使用者是否登陸過濾器配置 注意只過慮jsp頁面,不過慮.do -->
<filter>
<filter-name>userLoginedFilter</filter-name>
<filter-class>bluemoon.crm.systemmanage.struts.Filter.UserLoginedFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>userLoginedFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<!—使用者是否登陸過濾器配置結束 --> 
使用者是否登陸過濾器在多模組中的應用:
1.修改上面的過濾器程式碼:
package bluemoon.crm.systemmanage.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.*;

import bluemoon.crm.systemmanage.struts.forms.UserForm;

//使用者未登陸過濾器
public class UserNoLoginedFilter extends HttpServlet implements Filter
{

protected FilterConfig config;

public void init(FilterConfig filterConfig) throws ServletException
{
this.config = filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
//首先預定義到要轉向的頁面,由此帶來的問題就是userLogin.jsp頁面的圖片必須要使用絕對路徑,方法見userLogin.jsp頁面
RequestDispatcher dispatcher = request.getRequestDispatcher("/toLogin.do?prefix=&page=/userLogin.jsp");
//注意在struts-config.xml中增加一個Action,如下:
/*
*<action
* attribute="userForm"
* name="userForm"
* path="/toLogin"
* scope="request"
* type="org.apache.struts.actions.SwitchAction" />
*/
// 從session中獲取使用者form
HttpServletRequest userRequest = (HttpServletRequest)request;
UserForm userForm = (UserForm)userRequest.getSession().getAttribute("userForm");

//如果未登陸則沒有userFrom資訊
if(userForm == null || userForm.getUser_name() == null || userForm.getUser_name().trim().length()<1)
{
System.out.println("使用者未登入!");

//分發到登陸頁面
dispatcher.forward(request,response);
//((HttpServletResponse)response).sendRedirect("toModule.do?prefix=&page=/userLogin.jsp");
return;
}


System.out.println("使用者"+userForm.getUser_name()+"已登入!");
chain.doFilter(request,response);
}
public void destroy()
{

}
}