日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

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

編寫項目。用戶登錄系統(tǒng)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應(yīng)該這樣寫:/web應(yīng)用名/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);}} 執(zhí)行結(jié)果例如以下:

對登錄處理的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");//這里看看接到?jīng)]有System.out.println(username +" "+password);//這里我們先簡單驗證if("Gavin".equals(username)&&"123".equals(password)){//跳轉(zhuǎn)到下一個頁面//servlet提供了兩種,sendRedirect轉(zhuǎn)向 、forward轉(zhuǎn)發(fā)//sendRedirect的url應(yīng)該這樣寫 : /web應(yīng)用名稱/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將數(shù)據(jù)提交給登錄處理Servlet,該Servlet推斷username和password是否正確,假設(shè)正確,則跳轉(zhuǎn)至主界面,假設(shè)不對,則又一次跳轉(zhuǎn)回登錄界面。

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

Http協(xié)議深度剖析

Http協(xié)議是做web開發(fā)的基礎(chǔ)。

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

1、什么是Http協(xié)議?

超文本傳輸協(xié)議(HTTP,HyperText TransferProtocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。是工作在tcp/ip協(xié)議基礎(chǔ)上的。全部的WWW文件都必須遵守這個標(biāo)準(zhǔn)。設(shè)計HTTP最初的目的是為了提供一種公布和接收HTML頁面的方法。

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

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

(3)http是Tcp/ip協(xié)議的一個應(yīng)用層協(xié)議。http也是我們web開發(fā)的基礎(chǔ)。

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

一個問題

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

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

答案:3次!

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

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

2、http請求

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

一個完整的Http請求包括例如以下內(nèi)容:

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

例如以下所看到的:


消息頭格式 :消息名:消息內(nèi)容。消息頭并非每次都是一樣的。要看詳細(xì)的情況。

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

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

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

String referer = request.getHeader("Referer");Referer能夠應(yīng)用在防盜鏈方面!
//獲取用戶瀏覽器的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,假設(shè)為空或者不是從本站點訪問的,則重定向至錯誤頁面。


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

4、http響應(yīng)頭

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

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

5.請求結(jié)果

200:請求成功

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

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

404 請求的資源不存在

500server端出現(xiàn)錯誤

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

關(guān)于http響應(yīng)頭的一些樣例

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

跳轉(zhuǎn)舉例

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能夠設(shè)置n秒后跳轉(zhuǎn)到url指定的頁面,假設(shè)url指定的是自己本身,則能夠?qū)崿F(xiàn)定時刷新本頁面!

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

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.創(chuàng)建文件輸入流FileInputStream fis = new FileInputStream(new File(path));//做一個緩沖字節(jié)數(shù)組byte[] buff = new byte[1024];int len = 0;OutputStream os = response.getOutputStream();// 這里的len表示實際讀取到了多少字節(jié)while((len=fis.read(buff))>0){os.write(buff, 0, len);}//關(guān)閉os.close();fis.close();

文件下載的步驟:

【1】? response設(shè)置Header:Content-Disposition

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

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

緩存頁面舉例說明:

提示問題:我們的瀏覽器在默認(rèn)的情況下。會緩存我們的頁面,這樣會出現(xiàn)一個小問題:假設(shè)我們的用戶習(xí)慣把光標(biāo)停在地址欄。然后回車去取頁面。就會默認(rèn)從cache中取數(shù)據(jù)。

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

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

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

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

比方僅僅有IE瀏覽器才干識別Expires響應(yīng)標(biāo)頭。所以上面的控制網(wǎng)頁緩存時間僅僅對IE瀏覽器有效】

如上所看到的,http的響應(yīng)頭的作用還是很大的。


總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。