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()
{}
} 

?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 注:版權所有,未經本人同意不得轉載

轉載于:https://www.cnblogs.com/A0926/p/5529661.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395889.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395889.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395889.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

tar命令速查

tar -c: 建立壓縮檔案-x&#xff1a;解壓-t&#xff1a;查看內容-r&#xff1a;向壓縮歸檔文件末尾追加文件-u&#xff1a;更新原壓縮包中的文件 這五個是獨立的命令&#xff0c;壓縮解壓都要用到其中一個&#xff0c;可以和別的命令連用但只能用其中一個。下面的參數是根據需要…

附005.Docker Compose文件詳解

一 Docker Compose文件簡介 compose文件使用yml格式&#xff0c;主要分為了四個區域&#xff1a;version&#xff1a;用于指定當前docker-compose.yml語法遵循哪個版本services&#xff1a;服務&#xff0c;在它下面可以定義應用需要的一些服務&#xff0c;每個服務都有自己的名…

如何使用TensorFlow構建簡單的圖像識別系統(第2部分)

by Wolfgang Beyer沃爾夫岡拜爾(Wolfgang Beyer) 如何使用TensorFlow構建簡單的圖像識別系統(第2部分) (How to Build a Simple Image Recognition System with TensorFlow (Part 2)) This is the second part of my introduction to building an image recognition system wi…

網站 服務器 用sqlite,sqlite服務器數據庫

sqlite服務器數據庫 內容精選換一換簡要介紹SQLite是一款輕量級的關系型數據庫&#xff0c;它的運算速度非常快&#xff0c;占用資源很少&#xff0c;不僅支持標準的SQL語法&#xff0c;還遵循了數據庫的ACID事務。編寫語言&#xff1a;C一句話概述&#xff1a;輕量級的關系型數…

type-c接口圖片_TypeC接口除了充電還能干嗎?這些功能都不知道,簡直是在浪費...

Type C手機接口相信每個使用智能手機的朋友都很熟悉&#xff0c;目前已經廣泛使用在智能手機領域&#xff0c;并且得到用戶一致好評。但是對于Type C接口真正的用處很少有人知道&#xff0c;大部分用戶只了解正反面都可充電&#xff0c;其他方面一概不知&#xff0c;對于這一點…

Zookeeper的api的簡單使用(轉載)

轉載自: http://www.cnblogs.com/sunddenly/p/4031881.html 1.API 2.API 示例 ZooKeeper中的組成員關系 理解ZooKeeper的一種方法就是將其看作一個具有高可用性的文件系統。但這個文件系統中沒有文件和目錄&#xff0c;而是統一使用“節點”(node)的概念&#xff0c;稱為znode…

必須使用301重定向的運用場景

必須使用301重定向的運用場景

1.1好素數

題目 題意&#xff1a;一個好素數的定義是&#xff0c;他是一個素數&#xff0c;然后他的左右兩邊10區間內存在素數&#xff0c;那么他就是好素數&#xff0c;現在讓你輸入一個數字&#xff0c;這個數字以內的好素數的數量。 解題方法&#xff1a;先把每一個數字是不是素數判斷…

jquery.vue.js_一個Vue.js簡介,面向只了解jQuery的人

jquery.vue.jsby Matt Rothenberg馬特羅森伯格(Matt Rothenberg) 一個Vue.js簡介&#xff0c;面向只了解jQuery的人 (A Vue.js introduction for people who know just enough jQuery to get by) I’ve had a love-hate relationship with JavaScript for years.我與JavaScrip…

python 矩陣獲取行數_4個最佳項目創意的代碼片段和示例,旨在為Python和機器學習構建出色的簡歷!...

點擊上方“小白學視覺”&#xff0c;選擇加"星標"或“置頂”重磅干貨&#xff0c;第一時間送達一篇文章帶你了解4個最佳項目創意的代碼片段和示例Python是一種特殊的編程語言&#xff0c;適用于從初學者到中級用戶。由于它的靈活性&#xff0c;它正逐漸成為一種非常流…

Android 多狀態加載布局的開發 Tips

2019獨角獸企業重金招聘Python工程師標準>>> 什么是多狀態 Layout 對于大多數 App 而言&#xff0c;項目中都有多狀態加載 View 這種需求&#xff0c;如下圖所示。 對應到開發中&#xff0c;我們通常會開發一個對應的自定義 layout 用于根據頁面不同的狀態來顯示不同…

XML解析之JAXP案例詳解

根據一個CRUD的案例&#xff0c;對JAXP解析xml技術&#xff0c;進行詳細的解釋&#xff1a; 首先&#xff0c;已知一個xml文件中的數據如下&#xff1a; <?xml version"1.0" encoding"UTF-8" standalone"no"?> <書架><書 出版社…

隨機梯度下降

1.SGD 代價函數通常可以分解成每個樣本的代價函數的總和轉載于:https://www.cnblogs.com/bigcome/p/10042800.html

iis mysql5.7_手動配置網站環境 IIS 10+PHP 7.1+MySQL 5.7

之前配置環境一直用的一鍵安裝包&#xff0c;不管是phpStudy還是lnmp&#xff0c;昨天嘗試在自己電腦配置一下iis的環境&#xff0c;也踩了一些坑&#xff0c;整理了一下。測試電腦是Windows10&#xff0c;理論上Win7和IIS7.5都支持的。安裝 IIS1&#xff1a;控制面板 > 程序…

如何使用Apache的Prediction IO Machine Learning Server構建推薦引擎

by Vaghawan Ojha通過瓦哈萬歐哈(Vaghawan Ojha) 如何使用Apache的Prediction IO Machine Learning Server構建推薦引擎 (How to build a recommendation engine using Apache’s Prediction IO Machine Learning Server) This post will guide you through installing Apache…

JavaScript DOM編程藝術第二版學習(1/4)

接下來項目需要網頁相關知識&#xff0c;故在大牛的指引下前來閱讀本書。 記錄方式&#xff1a;本書分四部分閱讀&#xff0c;完成閱讀之后會多寫一篇包括思維導圖的算是閱讀指南的東西&#xff0c;瀏覽的童鞋看著指南可以跳過一些不必要的坑~ 當前水平&#xff1a;HTML&CS…

github開源大項目_GitHub剛剛發布了一份大規模的開源指南

github開源大項目Here are three links worth your time:這是三個值得您花費時間的鏈接&#xff1a; GitHub just released a massive guide to contributing to open source (5 to 60 minute read) GitHub剛剛發布了一份有關開源的大型指南( 閱讀5至60分鐘 ) A new way to br…

mysql中where條件判斷語句_MySQL Where 條件語句介紹和運算符小結

WHERE 條件有時候操作數據庫時&#xff0c;只操作一些有條件限制的數據&#xff0c;這時可以在SQL語句中添加WHERE子句來規定數據操作的條件。語法&#xff1a;SELECT column,… FROM tb_name WHERE definitionWHERE 關鍵字后面接有效的表達式(definition)&#xff0c;該表達式…

node webkit(nw.js) 設置自動更新

原理&#xff1a;把更新的文件放在服務器上&#xff0c;設置一個客戶端版本號&#xff0c;每次打開客戶端的時候&#xff0c;通過接口獲取服務器上的版本&#xff0c;如果高于本地的版本就下載服務器上的代碼&#xff0c;低于或等于就不更新 1 <script>2 var htt…

個人工作總結04(沖刺二)

今天是團隊第二次沖刺階段開始的第04天&#xff0c;我的工作總結如下&#xff1a; 一、昨天干了什么&#xff1f; 知識圈查詢功能 基本實現數據庫查詢 (未完成) 二、今天準備做什么&#xff1f; 知識圈查詢功能 基本實現數據庫查詢 三、遇到了什么困難&#xff1f; 數據庫訪問出…