Java EE做業(三)

1.分析Filter語句:

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

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

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

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

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

package com.drp.util.filter;服務器

import java.io.IOException;cookie

import javax.servlet.Filter;網絡

import javax.servlet.FilterChain;session

import javax.servlet.FilterConfig;app

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進程在後臺計算結束後調用。後臺計算的結果會被做爲參數傳遞給這一步驟。

相關文章
相關標籤/搜索