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,客戶機的機器環境(比如所使用的操作系統,瀏覽器版本) |
| Cookie | client通過這個頭字段,能夠帶一些數據給server |
| Connection | client通過這個頭字段告訴server。請求完畢后,是保持鏈接還是關閉鏈接 |
| Date | 客戶機發送該Http請求的時間 |
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使用這個頭告訴瀏覽器去找誰 |
| Server | server通過這個頭告訴瀏覽器,server的類型 |
| Content-Encoding | server通過這個頭告訴瀏覽器,數據的壓縮格式(gzip) |
| Content-Length | server通過這個頭告訴瀏覽器,回送數據的長度 |
| Content-Language | server通過這個頭告訴瀏覽器,數據的語言類型 |
| Content-Type | server通過這個頭告訴瀏覽器,回送數據的類型 |
| Last-Modified | server通過這個頭告訴瀏覽器,數據的最后改動時間 |
| Refresh | server通過這個頭告訴瀏覽器,多長時間定時刷新 |
| Content-Disposition | 控制瀏覽器下面載方式打開回送的數據 |
| Transfer-Encoding | server通過這個頭告訴瀏覽器,數據是以塊方式回送的 |
| Expires | 控制瀏覽器緩存數據的時間(-1或0,代表控制瀏覽器不要緩存) |
| Cache-Control | no-cache |
| Pragma | no-cache |
【為什么有三個響應頭都是控制瀏覽器的緩存時間呢。由于不同的瀏覽器可以識別的響應頭不同】
-------------------------------------------------------------------------------------------------------------------------------------------------------------
5.請求結果
200:請求成功
302 向別處請求資源。即重定向
304或307???? 向緩存請求
404 請求的資源不存在
500server端出現錯誤==========================================================================================
關于http響應頭的一些樣例
-------------------------------------------------------------------------------------------------------------------------------------------------------------
跳轉舉例
上面兩句話等價于:
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舉例
文件下載的步驟:
【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协议解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跨域理解及服务器端解决跨域问题
- 下一篇: Docker容器固定IP分配