日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Servlet——简单用户登录实例+http协议解析

發布時間:2025/7/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Servlet——简单用户登录实例+http协议解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

編寫項目。用戶登錄系統1.0版本號

登錄界面Servlet:

package com.gavin.view;import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class LoginServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println(" <HEAD><TITLE>用戶登錄</TITLE></HEAD>");out.println(" <BODY>");out.println("<h1>用戶登錄</h1>");//action應該這樣寫:/web應用名/servlet的urlout.println("<form action='/UsersManager/LoginCLServlet' method='post'>");out.println("用戶名:<input type='text' name='username'/><br/>");out.println("密????碼:<input type='password' name='password'/><br/>");out.print("<input type='submit' value='登錄'/>");out.println("<input type='reset' value='重置'/><br/>");out.println("</form>");out.println(" </BODY>");out.println("</HTML>");out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}} 執行結果例如以下:

對登錄處理的Servlet:

package com.gavin.controller;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class LoginCLServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// response.setContentType("text/html;charset=utf-8");String username = request.getParameter("username");String password = request.getParameter("password");//這里看看接到沒有System.out.println(username +" "+password);//這里我們先簡單驗證if("Gavin".equals(username)&&"123".equals(password)){//跳轉到下一個頁面//servlet提供了兩種,sendRedirect轉向 、forward轉發//sendRedirect的url應該這樣寫 : /web應用名稱/servlet的urlresponse.sendRedirect("/UsersManager/MainFrame");}else{//跳回response.sendRedirect("/UsersManager/LoginServlet");}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}} 主界面Servlet:

package com.gavin.view;import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class MainFrame extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println(" <BODY>");out.print(" <h1>主界面</h1> ");out.println(" </BODY>");out.println("</HTML>");out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);} }
流程是這種:登錄界面Servlet將數據提交給登錄處理Servlet,該Servlet推斷username和password是否正確,假設正確,則跳轉至主界面,假設不對,則又一次跳轉回登錄界面。

==========================================================================================

Http協議深度剖析

Http協議是做web開發的基礎。

-------------------------------------------------------------------------------------------------------------------------------------------------------------

1、什么是Http協議?

超文本傳輸協議(HTTP,HyperText TransferProtocol)是互聯網上應用最為廣泛的一種網絡協議。是工作在tcp/ip協議基礎上的。全部的WWW文件都必須遵守這個標準。設計HTTP最初的目的是為了提供一種公布和接收HTML頁面的方法。

(1) 能夠通過httpwatch插件來抓取http請求內容

(2)http1.0短連接,http1.1長連接,這里的長短是指持續的時間,http1.1會保留連接一段時間,持續約30s,http1.0在發送完數據后會立刻斷掉。

(3)http是Tcp/ip協議的一個應用層協議。http也是我們web開發的基礎。

-------------------------------------------------------------------------------------------------------------------------------------------------------------

一個問題

一個test.html頁面例如以下:

<h1>abc</h1> <img src=”news.jpg”/> <img src=”news2.jpg”/> 問瀏覽器會發出幾次請求?

答案:3次!

第一次請求html文本。第二次請求news.jpg圖片,第三次請求news2.jpg圖片。

這里能夠看到,每一個圖片源都要請求server的,所以一個站點的圖片越多,訪問速度越慢。
-------------------------------------------------------------------------------------------------------------------------------------------------------------

2、http請求

client連上server后。向server請求某個web資源,稱之為client向server發送了一個Http請求。

一個完整的Http請求包括例如以下內容:

一個請求行、若干消息頭、以及實體內容。當中的一些消息頭和實體內容都是可選的,消息頭和實體內容之間要用空行隔開

例如以下所看到的:


消息頭格式 :消息名:消息內容。消息頭并非每次都是一樣的。要看詳細的情況。

-------------------------------------------------------------------------------------------------------------------------------------------------------------

3、http請求消息頭具體解釋

Accept用于告訴server,客戶機所支持的數據類型(文本、網頁、圖片)
Accept-Charset用于告訴server,客戶機所採用的碼表(如ISO-8859-1)
Accept-Encoding用于告訴server,客戶機所支持的數據壓縮格式
Accept-Language用于告訴server,客戶機的語法環境(一般支持中英文)
Host用于告訴server。客戶機想訪問server哪臺主機
If-Modified-Since用于告訴server,客戶機對于資源的最后緩存時間
Referer用于告訴server,客戶機是從哪個頁面去訪問server的? (防盜鏈
User-Agent用于告訴server,客戶機的機器環境(比如所使用的操作系統,瀏覽器版本)
Cookieclient通過這個頭字段,能夠帶一些數據給server
Connectionclient通過這個頭字段告訴server。請求完畢后,是保持鏈接還是關閉鏈接
Date客戶機發送該Http請求的時間
在Servlet中能夠通過request對象的getHeader()方法通過消息頭得到消息內容

String referer = request.getHeader("Referer");Referer能夠應用在防盜鏈方面!
//獲取用戶瀏覽器的RefereString referer = request.getHeader("Referer");out.println("refere:"+referer+"<br>");//沒有鏈接。則重定向到Error頁面//即僅僅能從自己的站點訪問,比方從我們的goto.html中的超鏈接訪問if(referer==null||!referer.startsWith("http://localhost:8080/servletPro")){response.sendRedirect("/servletPro/Error");}server能夠得到訪問該頁面的Referer,假設為空或者不是從本站點訪問的,則重定向至錯誤頁面。


-------------------------------------------------------------------------------------------------------------------------------------------------------------

4、http響應頭

Location這個頭通常配合302狀態碼使用,server使用這個頭告訴瀏覽器去找誰
Serverserver通過這個頭告訴瀏覽器,server的類型
Content-Encodingserver通過這個頭告訴瀏覽器,數據的壓縮格式(gzip)
Content-Lengthserver通過這個頭告訴瀏覽器,回送數據的長度
Content-Languageserver通過這個頭告訴瀏覽器,數據的語言類型
Content-Typeserver通過這個頭告訴瀏覽器,回送數據的類型
Last-Modifiedserver通過這個頭告訴瀏覽器,數據的最后改動時間
Refreshserver通過這個頭告訴瀏覽器,多長時間定時刷新
Content-Disposition控制瀏覽器下面載方式打開回送的數據
Transfer-Encodingserver通過這個頭告訴瀏覽器,數據是以塊方式回送的
Expires控制瀏覽器緩存數據的時間(-1或0,代表控制瀏覽器不要緩存)
Cache-Controlno-cache
Pragmano-cache
【最后三個頭一起用,就能夠控制全部的瀏覽器不要緩存數據】

【為什么有三個響應頭都是控制瀏覽器的緩存時間呢。由于不同的瀏覽器可以識別的響應頭不同】
-------------------------------------------------------------------------------------------------------------------------------------------------------------

5.請求結果

200:請求成功

302 向別處請求資源。即重定向

304或307???? 向緩存請求

404 請求的資源不存在

500server端出現錯誤

==========================================================================================

關于http響應頭的一些樣例

-------------------------------------------------------------------------------------------------------------------------------------------------------------

跳轉舉例

response.setstatus(302); response.setHeader(“Location”,”/servletPro/Servlet2”);

上面兩句話等價于:

response.sendRedirect(“/servletPro/Servlet2”);-------------------------------------------------------------------------------------------------------------------------------------------------------------
Refresh舉例
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");response.setHeader("Refresh", "5;url=/servletPro/goto.html");}

Refresh能夠設置n秒后跳轉到url指定的頁面,假設url指定的是自己本身,則能夠實現定時刷新本頁面!

-------------------------------------------------------------------------------------------------------------------------------------------------------------

Content-Disposition舉例

// 演示下載文件response.setHeader("Content-Disposition", "attachment;filename=hello.jpg");//打開文件// 1.獲取到要下載文件的全路徑,也就是絕對路徑String path = this.getServletContext().getRealPath("/images/test.jpg");System.out.println("path:"+path);//2.創建文件輸入流FileInputStream fis = new FileInputStream(new File(path));//做一個緩沖字節數組byte[] buff = new byte[1024];int len = 0;OutputStream os = response.getOutputStream();// 這里的len表示實際讀取到了多少字節while((len=fis.read(buff))>0){os.write(buff, 0, len);}//關閉os.close();fis.close();

文件下載的步驟:

【1】? response設置Header:Content-Disposition

【2】??? 依據相對文件路徑得到文件的全路徑。也就是絕對路徑

【3】依照字節流輸入。并通過response的字節流輸出到瀏覽器
-------------------------------------------------------------------------------------------------------------------------------------------------------------

緩存頁面舉例說明:

提示問題:我們的瀏覽器在默認的情況下。會緩存我們的頁面,這樣會出現一個小問題:假設我們的用戶習慣把光標停在地址欄。然后回車去取頁面。就會默認從cache中取數據。

(1)有些站點對及時性要求比較高。因此要求我們不緩存頁面。

// 指定該頁面不緩存response.setDateHeader("Expires", -1);// 為了保證兼容性,上面的一句話適用于IE瀏覽器response.setHeader("Cache-Control", "no-cache");response.setHeader("Pragma", "no-cache");

(2)有些站點要求網頁緩存一定的時間。比方緩存一個小時:

response.setDateHeader("Expires", System.currentTimeMillis()+3600*1000);【注意:有些方法對不同的瀏覽器可能不起作用。

比方僅僅有IE瀏覽器才干識別Expires響應標頭。所以上面的控制網頁緩存時間僅僅對IE瀏覽器有效】

如上所看到的,http的響應頭的作用還是很大的。


總結

以上是生活随笔為你收集整理的Servlet——简单用户登录实例+http协议解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。