亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

再談通過 Java 執行 POST 操作

2019-11-18 13:15:24
字體:
來源:轉載
供稿:網友

  我的上一篇關于 從 applet 中執行 POST 操作的技巧在讀者中引出了許多問題。其中最突出的問題是:“如何顯示由 Web 服務器上的 POST CGI-bin 處理程序返回的 Html 文檔?”。在這篇技巧中,我們將探索這一問題的解決方法,并深入研究幾個很棒的服務器端的 java 問題。
  注重:本技巧假定您知道讀者提出的有關通過 Java 執行 POST 操作的一些基本問題。假如您還不熟悉這些概念,請參考“Java 技巧 34”。
  
  那么,我們如何顯示來自 applet 的 POST 的結果呢?這一問題有四個答案。按照難易程度遞增的順序排列,依次為:
  
  無法顯示。
  別執行 POST 操作。
  使用 bean。
  作弊。
  正如在“Java 技巧 34”中討論的那樣,瀏覽器目前所用的安全性治理器不答應在瀏覽器中顯示由 applet 生成的 HTML;瀏覽器僅答應我們將它指向 URL,URL 將代表我們將它顯示出來。這種情況難以令人滿足!
  
  我們通過 -- 難以置信! -- 不使用 POST 就可以避開顯示 POST 結果的這種限制。我們可以將一些信息編碼在 URL 中,然后再將編碼后的 URL 提供給 showDocument() 方法。這些信息可作為 GET 請求的參數傳遞給 Web 服務器。不幸的是,這存在一些缺陷:只能傳輸數量有限的數據 -- 此外,在這個過程中 URL 被更改。這樣做相當笨拙。稍后我們會看到采用這種編碼方式的一個示例。
  
  最近,Sun 的 JavaSoft 分公司發布了 HTML renderer bean。(還有幾個別的商用軟件。)這樣,將這個 bean 作為 applet 的一部分并用它來顯示網頁就成為可能。有什么缺點?大小、兼容性和成本。這個 bean 當然不小,它需要支持 bean 的瀏覽器,而且不是免費的。當然,我們完全可以花時間來編寫自己的翻譯組件,但那是一種愚蠢的做法。
  
  這個問題的一種有趣而有建設性的解決方案就是作弊。在這個特例中,我們讓服務器端的代碼(例如, CGI-bin 腳本)與我們的 applet 共同作弊。基本思想很簡單:將 POST 與隨后的 GET 結合起來使用。這個過程如下所示:
  
  applet 仍然通過 POST 操作將信息發送給服務器。
  服務器利用 POST 信息生成 HTML。
  服務器將 HTML 保存到 Web 服務器上的文件中。
  服務器向 applet 返回一個魔力鍵。
  applet 將這個鍵編碼在 URL 中并返回給服務器。
  applet 通過在 showDocument() 調用中使用生成的 URL 來通知瀏覽器顯示網頁。
  服務器接收 GET 請求并提取魔力鍵參數。
  服務器檢索與此魔力鍵相關的文件。
  服務器將文件中的 HTML 內容返回給瀏覽器。
  瀏覽器將 HTML 內容顯示出來。
  這種返回處理無疑比其他解決方案更復雜,但現在這種處理適用于客戶機和服務器的廣泛組合方式。這種處理的缺點在于,完成一個完整的事務必須執行多個 HTTP 請求。我們必須在多個請求的之間維護“狀態”信息,以便能跟蹤正在進行的事務(回憶一下,HTTP 是一種無狀態的請求/響應協議)。穩健地處理這些必要的狀態信息可能相當具有挑戰性。Tcl 腳本語言及 SPRite 分布式操作系統之父 John Ousterhout 曾經說過:“在分布式計算中,狀態是第二麻煩的問題。不,它是最麻煩的問題?!?br />  
  服務器部分最復雜,所以讓我們先來看一下 applet。:-) 這個 applet 與以前的“Java 技巧 34”中所用的 Happy applet 僅有幾點區別。到服務器的 POST 操作是相同的,但我們必須修改讀取服務器響應的的部分:input = new DataInputStream (urlConn.getInputStream ());
  
  String str = null;
  String firstLine = null;
  while (null != ((str = input.readLine())))
  {
  if (null == firstLine)
  firstLine = str;
  
  System.out.println (str);
  textArea.appendText (str + "/n");
  }
  
  input.close ();
  經過許可,服務器返回魔力鍵作為第一行。魔力鍵是一段狀態信息,此信息用來唯一標識 applet 所涉及的、與此服務器有關的事務。 假如在處理 POST 請求的過程中碰到任何問題,服務器通過以下方式將這一情況通知 applet:返回 "nil" 字符串,并緊接著返回這一問題的文本描述。applet 現在所要做的唯一操作就是構建 URL,并調用 showDocument() 來顯示 HTML:if (null != firstLine)
  {
  url = new URL ("http://" +
  ((getCodeBase()).getHost()).toString() +
  "/poster?" + firstLine);
  (getAppletContext()).showDocument (url, "_blank");
  }
  一定要注重,URL 參數必須是 URL 編碼的。在上面的代碼段中,因為來自服務器的魔力鍵已被安全編碼,所以我們只需添加問號將基準 URL 與所傳遞的參數分隔開。
  
  現在我們已討論了 applet 部分,下面該研究服務器了。在以前有關 POST 的一篇 Java 技巧中,服務器端的代碼是用 Perl 編寫的傳統 CGI-bin 腳本。Perl 是一種不錯的解決方案,但是您難道不想用 Java 編寫服務器端的代碼嗎?我們可以用 Java 編寫 CGI-bin 腳本(請參閱參考資源部分),但還有更好的解決辦法:那就是作為 Web 服務器本身一部分的 Java。這種服務器端的 Java 稱為 servlet。本文所提供的解決方案將是一個 servlet,是按照 Java Servlet API 編寫的 -- 盡管通過 CGI-bin 腳本(用 Perl、Tcl、Java 或其他語言編寫)也能實現同樣的解決方案。
  
  請注重,對 servlet 編程和治理的介紹不屬于本文的討論范圍;我們僅討論與 POST 解決方案有直接關系的主要問題。
  
  PosterServlet 代碼包含大量的注釋,以便指導您閱讀代碼。代碼包含大量的錯誤處理和額外檢查,用來處理過多的可能出現的問題、拒絕服務攻擊等。但是多數時候您可以忽略這些代碼。(稍后我會更深入地討論安全性問題。)這個 servlet 是針對 Java 1.1.x API 編寫的(而 applet 代碼是針對 Java 1.0.2 編寫的)。
  
  doPost() 方法處理 POST 請求 -- 即,doPost() 負責前三種服務器職責:它根據通過 POST 發送來信息生成 HTML 文檔,然后將文檔保存到一個臨時的磁盤文件中,并將魔力鍵返回給 applet,魔力鍵用來標識 HTML 文檔,并適合直接嵌入隨后的 GET 請求中。
  
  下面是代碼的核心部分。(要查看完整的代碼,請參閱實際的源文件。)實現說明:魔力鍵實際上是為此事務生成的 HTML 文檔的文件名。 文件名是使用 java.util.Random 類生成的一個 Long 值。 protected void doPost (HttpServletRequest request,
  HttpServletResponse response)
  throws ServletException, IOException
  {
  response.setContentType ("text/plain");
  
  // 構建輸出文件名。
  String fileName = (new Long (randomizer.nextLong())).toString();
  File file = null;
  try
  {
  file = new File (posterTempDir + File.separator +
  fileName + posterTempExt);
  }
  catch (Exception e)
  {
  sendPostFailure (response,
  "Unable to build output file path!");
  return;
  }
  
  // 打開輸出文件。
  PrintWriter output = null;
  try
  {
  output = new PrintWriter
  ( new BufferedWriter
  ( new FileWriter (file)));
  }
  catch (IOException e)
  {
  sendPostFailure (response, "Unable to open output file!");
  return;
  }
  
  output.println ("< html>");
  output.print ("< head>< title>Poster Servlet Generated Output");
  output.println ("< /title>< /head>");
  output.println ("< body>");
  
  
  // 現在,循環檢查請求標頭并將它們寫入文件中。
  String headerName = null;
  Enumeration headers = request.getHeaderNames();
  if (headers.hasMoreElements())
  {
  output.println ("< h1>CGI headers:< /h1>< hr>");
  output.println ("< ul>");
  while (headers.hasMoreElements())
  {
  headerName = (String) headers.nextElement();
  output.print ("< li>< b>");
  output.print (headerName);
  output.print (" = ");
  output.print (request.getHeader (headerName));
  output.println ("< /b>< /li>< br>");
  }
  output.println ("< /ul>< hr>< br>");
  }
  
  // 處理 POST 內容。
  if (0 < request.getContentLength())
  {
  String line = null;
  
  // 將所有輸入字節轉換為字符。
  BufferedReader in = new BufferedReader
  ( new InputStreamReader (request.getInputStream()));
  
  output.println ("< h1>POST contents:< h1>< hr>");
  output.println ("< p>< pre>");
  
  
  // 讀取輸入的每一行,并將其寫入輸出文件中。
  HttpUtils httpUtils = new HttpUtils();
  try
  {
  while (null != (line = in.readLine()))
  {
  try
  {
  Hashtable data = httpUtils.parseQueryString (line);
  String keyName = null;
  Enumeration keys = data.keys();
  
  while (keys.hasMoreElements())
  {
  String[] values = null;
  
  keyName = (String) keys.nextElement();
  output.print (keyName);
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欲色天天网综合久久| 91国产中文字幕| 欧美在线www| 国产成人精品在线观看| 红桃视频成人在线观看| 亚洲第一天堂无码专区| 成人午夜激情免费视频| 国产亚洲aⅴaaaaaa毛片| 北条麻妃一区二区在线观看| 大伊人狠狠躁夜夜躁av一区| 欧美寡妇偷汉性猛交| 欧美影院在线播放| 91爱爱小视频k| 欧美大片网站在线观看| 国产欧美日韩精品专区| 91精品国产91久久久久久最新| 久久亚洲成人精品| 国内精品视频一区| 日本中文字幕久久看| 国产精品美女视频网站| 69久久夜色精品国产69乱青草| 国产一区二区三区毛片| 日韩在线视频国产| 国产亚洲a∨片在线观看| 久久久精品美女| 欧美资源在线观看| 日韩成人av一区| 亚洲成色777777在线观看影院| 亚洲人成啪啪网站| 日韩电影免费在线观看| 亚州av一区二区| 亚洲精品国精品久久99热| 亚洲成人a级网| 亚洲天堂免费观看| 亚洲精品自拍视频| 日韩av色在线| 欧美日韩第一页| 欧美日韩国产中文字幕| 88国产精品欧美一区二区三区| 成人国产精品色哟哟| 亚洲一区二区三区毛片| 亚洲天堂av在线免费观看| 色综合久久久久久中文网| 日韩一二三在线视频播| 国产精品一区二区三区成人| 国产日韩一区在线| 久久6精品影院| 欧美激情精品久久久久久久变态| 午夜精品国产精品大乳美女| 精品国产999| 最近中文字幕mv在线一区二区三区四区| 国产日韩在线看片| 亚洲欧洲午夜一线一品| 亚洲v日韩v综合v精品v| 91精品久久久久久久久中文字幕| 91在线视频成人| 欧美日本中文字幕| 亚洲精品自在久久| 亚洲乱亚洲乱妇无码| 国产在线视频一区| 精品久久久一区| 精品国产999| 色琪琪综合男人的天堂aⅴ视频| 国产精品久久久久久久久免费| 国产精品第一第二| 日韩高清av一区二区三区| 亚洲成人精品av| 亚洲欧美一区二区激情| 亚洲福利小视频| 91久久久精品| 国产成人精品网站| 国产亚洲精品久久久久动| 久久成人这里只有精品| 成人a在线视频| 欧美成人精品xxx| 久久久国产在线视频| 久久久成人av| 国产精品久久久精品| 日韩精品欧美国产精品忘忧草| 国产999精品久久久影片官网| 清纯唯美亚洲综合| 精品国产一区二区三区在线观看| 亚洲韩国青草视频| 日韩免费视频在线观看| 国产91在线播放九色快色| 亚洲最大激情中文字幕| 国产精品福利在线观看| 国产在线播放不卡| 国产精品国产自产拍高清av水多| 欧美在线视频一区| www高清在线视频日韩欧美| 欧美大片在线免费观看| 久久久久久久久久国产| 亚洲精品在线91| 欧洲成人在线视频| 亚洲国产精品成人av| 青青草原一区二区| 欧美精品18videos性欧| 美女国内精品自产拍在线播放| 亚洲男人的天堂在线播放| 国内精品一区二区三区| 欧美性在线视频| 国产亚洲精品91在线| 精品美女久久久久久免费| 欧美日韩亚洲国产一区| 久久精品电影网站| 亚洲成年网站在线观看| 欧美一区视频在线| 国产精品色悠悠| 亚洲美女精品久久| 日韩中文字幕网站| 欧美日韩精品在线| 亚洲美女视频网站| 精品一区二区三区四区| 国产精品美女主播在线观看纯欲| 国产亚洲美女久久| 亚洲第一精品自拍| 成人久久精品视频| 欧美成人精品不卡视频在线观看| 欧美孕妇性xx| 精品视频—区二区三区免费| 欧美日韩国内自拍| 精品久久久久久久久久| 欧美国产视频日韩| 成人伊人精品色xxxx视频| 亚洲精品自拍视频| 久久99久国产精品黄毛片入口| 日本午夜精品理论片a级appf发布| 亚洲综合在线小说| 4p变态网欧美系列| 亚洲午夜激情免费视频| 亚洲无av在线中文字幕| 国产精品一区二区在线| 亚洲第一网站男人都懂| 久久精品视频网站| 91老司机在线| 亚洲风情亚aⅴ在线发布| 一区二区三区日韩在线| 日韩高清电影免费观看完整版| 国产精品美女主播| 成人国产在线激情| 亚洲国产又黄又爽女人高潮的| 亚洲综合成人婷婷小说| 欧美xxxx综合视频| 欧美激情啊啊啊| 欧美日韩亚洲精品一区二区三区| 97国产一区二区精品久久呦| 日本精品久久电影| 狠狠做深爱婷婷久久综合一区| 一个人看的www欧美| 日韩国产在线看| 日本成熟性欧美| 国产一区二区三区在线播放免费观看| 国产精品第三页| 综合网中文字幕| 中文一区二区视频| 成人欧美在线观看| 欧美美女操人视频| 亚洲人成在线观| 日韩一区二区三区在线播放| 国产亚洲人成a一在线v站| 亚洲午夜av电影| 免费av在线一区| 国产精品久久久|