1. 程式人生 > >Java EE作業(三)

Java EE作業(三)

原理 種類 例如 before session 情況下 絕對路徑 RR 2.3

1.分析Filter語句:

long before =System.currentTimeMills()   //是獲得當前時間距離1970-1-1 00:00:00經過的毫秒數,用於規定Filter負責攔截所有的用戶請求的過濾範圍

long after = System.currentTimeMills()    //是獲得當前時間距離1970-1-1 00:00:00經過的毫秒數,用於規定Filter負責攔截所有的用戶請求的過濾範圍

HttpServletRequest hrequest = (HttpServletRequest) request ;   //將請求強制轉換為HttpServletRequest型再賦給HttpServletRequest 請求對象hrequest

System.out,println("Filter已經截獲到用戶的請求的地址:"+hrequest.getServletPath())  //通過getServletPath()函數打印Filter 已經攔截到用戶的請求的地址

2.用Filter寫用戶授權的例子:  

package com.drp.util.filter;

import java.io.IOException;

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.HttpServletResponse;

import javax.servlet.http.HttpSession;

public class AuthFilter implements Filter {

public void destroy() {

}

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,

FilterChain filterChain) throws IOException, ServletException {

/** 1,doFilter方法的第一個參數為ServletRequest對象。此對象給過濾器提供了對進入的信息(包括

*  表單數據、cookie和HTTP請求頭)的完全訪問。第二個參數為ServletResponse,通常在簡單的過

*  濾器中忽略此參數。最後一個參數為FilterChain,此參數用來調用servlet或JSP頁。

*/

HttpServletRequest request = (HttpServletRequest)servletRequest;

/** 如果處理HTTP請求,並且需要訪問諸如getHeader或getCookies等在ServletRequest中

*  無法得到的方法,就要把此request對象構造成HttpServletRequest

*/

HttpServletResponse response = (HttpServletResponse)servletResponse;

String currentURL = request.getRequestURI(); //取得根目錄所對應的絕對路徑:

String targetURL = currentURL.substring(currentURL.indexOf("/", 1),

currentURL.length()); //截取到當前文件名用於比較

HttpSession session = request.getSession(false);

if (!"/login.jsp".equals(targetURL)) {

//判斷當前頁是否是重定向以後的登錄頁面頁面,如果是就不做session的判斷,防止出現死循環

if (session == null || session.getAttribute("user") == null) {

//*用戶登錄以後需手動添加session

System.out.println("request.getContextPath()=" + request.getContextPath());

response.sendRedirect(request.getContextPath() + "/login.jsp");

//如果session為空表示用戶沒有登錄就重定向到login.jsp頁面

return;

}

}

//加入filter鏈繼續向下執行

filterChain.doFilter(request, response);

/** 調用FilterChain對象的doFilter方法。Filter接口的doFilter方法取一個FilterChain對象作

*  為它 的一個參數。在調用此對象的doFilter方法時,激活下一個相關的過濾器。如果沒有另

*  一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被激活。

*/

}

public void init(FilterConfig filterConfig) throws ServletException {

}

}

  然後在配置文件web.xml裏添加: (請註意,過濾是在serlvet規範2.3版中初次引入的。因此,web.xml文件必須使用DTD的2.3以上版本。)

<filter>

<filter-name>AuthFilter</filter-name>

<filter-class>com.drp.util.filter.AuthFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>AuthFilter</filter-name>

<url-pattern>*.jsp</url-pattern>//表示對所有jsp文件有效

</filter-mapping>

  這樣用戶沒有登錄的情況下就會轉到登錄頁面。

3.session是什麽?工作原理?使用方法?

  Session是指一個終端用戶與交互系統進行通信的時間間隔,通常指從註冊進入系統到註銷退出系統之間所經過的時間以及如果需要的話,可能還有一定的操作空間。

  具體到Web中的Session指的就是用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉所經過的這段時間,也就是用戶瀏覽這個網站所花費的時間。因此從上述的定義中我們可以看到,Session實際上是一個特定的時間概念。

  需要註意的是,一個Session的概念需要包括特定的客戶端,特定的服務器端以及不中斷的操作時間。A用戶和C服務器建立連接時所處的Session同B用戶和C服務器建立連接時所處的Session是兩個不同的Session。

session的工作原理:

(1)當一個session第一次被啟用時,一個唯一的標識被存儲於本地的cookie中。

(2)首先使用session_start()函數,PHP從session倉庫中加載已經存儲的session變量。

(3)當執行PHP腳本時,通過使用session_register()函數註冊session變量。

(4)當PHP腳本執行結束時,未被銷毀的session變量會被自動保存在本地一定路徑下的session庫中,這個路徑可以通過php.ini文件中的session.save_path指定,下次瀏覽網頁時可以加載使用。

使用方法:

Session 是 用於保持狀態的基於 Web服務器的方法。Session 允許通過將對象存儲在 Web服務器的內存中在整個用戶會話過程中保持任何對象。

Session 通常用於執行以下操作

存儲需要在整個用戶會話過程中保持其狀態的信息,例如登錄信息或用戶瀏覽 Web應用程序時需要的其它信息。

存儲只需要在頁重新加載過程中或按功能分組的一組頁之間保持其狀態的對象。

Session 的作用就是它在 Web服務器上保持用戶的狀態信息供在任何時間從任何頁訪問。因為瀏覽器不需要存儲任何這種信息,所以可以使用任何瀏覽器,即使是像 PDA 或手機這樣的瀏覽器設備。

持久性方法的限制

隨著越來越多用戶登錄,Session 所需要的服務器內存量也會不斷增加。

訪問 Web應用程序的每個用戶都生成一個單獨的 Session 對象。每個 Session 對象的持續時間是用戶訪問的時間加上不活動的時間。

如果每個 Session 中保持許多對象,並且許多用戶同時使用 Web應用程序(創建許多 Session),則用於 Session 持久性的服務器內存量可能會很大,從而影響了可伸縮性。

認識Session: 

1,對於值類型的變量,Session中保存的是值類型的拷貝

Session["__test0"] = 1;

int i = (int)Session["__test0"]+1;

int j = (int)Session["__test0"];

結果:i=2,j=1

2,對於引用類新的變量,Session中保存的是引用

CDACommon cda = new CDACommon();

Session["__test"] = cda.GetDataSet("select top 1 * from tb_customer");

DataSet ds = (DataSet)Session["__test"];

DataSet ds2 = (DataSet)Session["__test"];

ds.Tables[0].Rows[0][0]="9999";

結果:

ds.Tables[0].Rows[0][0]=="9999"

ds2.Tables[0].Rows[0][0]=="9999";

3,Session周期

新的瀏覽器窗口啟動後,開始一個新的Session,觸發Global的Session_Start的調用,從第一個瀏覽器窗口打開的瀏覽器窗口不啟動新的Session。Session過期後,執行頁面的提交也會觸發Session_Start,等於是新的一個Session。

4,調用Session

對於Web Service,每個方法的調用都會啟動一個Session,可以用下面的方法來使多個調用在同一個Session裏  CWSSyscfg cwsCfg = new CWSSyscfg(); cwsCfg.CookieContainer = new System Net.CookieContainer(); CWSSyscfg是一個Web Service類,Web Service的給代理類設置CookieContainer屬性,只要多個代理的CookieContainer屬性是相同的值,則對這些Web Service的調用在同一個Session。可以用單例模式來實現。

5,Session數據有效期

只要頁面有提交活動,則Session的所有項都會保持,頁面在20分鐘(默認配置)內沒有任何提交活動時Session會失效。Session內存儲的多個數據項是整體失效的。

6,Session的保存

在Session中如果保存的是非序列化的類比如DataView,在用SQLServer保存Session的模式下,無法使用。查看一個類是否是序列化的方法是,需看是否用[Serializable]來標記了該類.

4.學習Async Task

即asynchronous task,異步任務。AsyncTask實際上是圍繞Thread和Handler設計的一個輔助類,在內部是對Thread和Handler的一種封裝。AsyncTask的異步體現在由後臺線程進行運算(訪問網絡等比較耗時的操作),然後將結果發布到用戶界面上來更新UI,使用AsyncTask使得我不用操作Thread和Handler。

AsyncTask必須繼承使用。子類至少必須重寫一個方法(doInBackground(Params...))。通常,還會重寫另一個方法(onPostExecute(Result))。

(1)異步任務使用如下3種類型:

1. Params,傳遞給任務的參數類型。

2. Progress,後臺計算執行過程中,進步單位(progress units)的類型。(就是後臺程序已經執行了百分之幾了。)

3. Result, 後臺執行返回的結果的類型。

AsyncTask並不總是需要使用上面的全部3種類型。標識不使用的類型很簡單,只需要使用Void類型即可。

(2)AsyncTask的4個步驟

一個異步任務需要執行下面4個步驟

1. onPreExecute(), 該步驟在任務被執行之後立即由UI線程調用。

這個步驟通常用來建立任務,在用戶接口(UI)上顯示進度條。

2. doInBackground(Params...), 該步驟由後臺線程在onPreExecute()方法執行結束後立即調用。該步驟通常被用來執行耗時的後臺計算。計算的結果必須由該步驟返回,並被傳遞到 最後一個步驟中。該步驟也可以使用publishProgress(Progress...)來發布一個或多個進度單位(units of progress)。這些值將會在onProgressUpdate(Progress...)步驟中被發布到UI線程。

3. onProgressUpdate(Progress...), 該步驟由UI線程在publishProgress(Progress...)方法調用完後被調用。

並未定義該方法執行的時機。該方法在後臺進程計算仍在執行的時候,在UI上顯示任何形式的進度。一般用於動態地顯示一個進度條或者在文本框中顯示log。

4. onPostExecute(Result), 由UI進程在後臺計算結束後調用。後臺計算的結果會被作為參數傳遞給這一步驟。

Java EE作業(三)