1. 程式人生 > >HTTP基本認證 Basic Authentication 的JAVA示例

HTTP基本認證 Basic Authentication 的JAVA示例

                大家在登入網站的時候,大部分時候是通過一個表單提交登入資訊。
但是有時候瀏覽器會彈出一個登入驗證的對話方塊,如下圖,這就是使用HTTP基本認證。

下面來看看一看這個認證的工作過程:
第一步:  客戶端傳送http request 給伺服器,伺服器驗證該使用者是否已經登入驗證過了,如果沒有的話,
伺服器會返回一個401 Unauthozied給客戶端,並且在Response 的 header "WWW-Authenticate" 中新增資訊。
如下圖。

第二步:瀏覽器在接受到401 Unauthozied後,會彈出登入驗證的對話方塊。使用者輸入使用者名稱和密碼後,
瀏覽器用BASE64編碼後,放在Authorization header中傳送給伺服器。如下圖:


第三步: 伺服器將Authorization header中的使用者名稱密碼取出,進行驗證, 如果驗證通過,將根據請求,傳送資源給客戶端。

下面來看一個JAVA的示例程式碼:
  1. import java.io.IOException;  
  2. import java.io.PrintWriter;  
  3. import javax.servlet.http.HttpServlet;  
  4. import javax.servlet.http.HttpServletRequest;  
  5. import javax.servlet.http.HttpServletResponse;  
  6. import sun.misc.BASE64Decoder;  
  7. publicclass HTTPAuthServlet extends HttpServlet {  
  8.     publicvoid doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {  
  9.         String sessionAuth = (String) request.getSession().getAttribute("auth");  
  10.         if (sessionAuth != null) {  
  11.             System.out.println("this is next step"
    );  
  12.             nextStep(request, response);  
  13.         } else {  
  14.             if(!checkHeaderAuth(request, response)){  
  15.                 response.setStatus(401);  
  16.                 response.setHeader("Cache-Control""no-store");  
  17.                 response.setDateHeader("Expires"0);  
  18.                 response.setHeader("WWW-authenticate""Basic Realm=\"test\"");  
  19.             }             
  20.         }  
  21.     }  
  22.     privateboolean checkHeaderAuth(HttpServletRequest request, HttpServletResponse response) throws IOException {  
  23.         String auth = request.getHeader("Authorization");  
  24.         System.out.println("auth encoded in base64 is " + getFromBASE64(auth));  
  25.         if ((auth != null) && (auth.length() > 6)) {  
  26.             auth = auth.substring(6, auth.length());  
  27.             String decodedAuth = getFromBASE64(auth);  
  28.             System.out.println("auth decoded from base64 is " + decodedAuth);  
  29.             request.getSession().setAttribute("auth", decodedAuth);  
  30.             returntrue;  
  31.         }else{  
  32.             returnfalse;  
  33.         }  
  34.     }  
  35.     private String getFromBASE64(String s) {  
  36.         if (s == null)  
  37.             returnnull;  
  38.         BASE64Decoder decoder = new BASE64Decoder();  
  39.         try {  
  40.             byte[] b = decoder.decodeBuffer(s);  
  41.             returnnew String(b);  
  42.         } catch (Exception e) {  
  43.             returnnull;  
  44.         }  
  45.     }  
  46.     publicvoid nextStep(HttpServletRequest request, HttpServletResponse response) throws IOException {  
  47.         PrintWriter pw = response.getWriter();  
  48.         pw.println("<html> next step, authentication is : " + request.getSession().getAttribute("auth") + "<br>");  
  49.         pw.println("<br></html>");  
  50.     }  
  51.     publicvoid doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {  
  52.         doGet(request, response);  
  53.     }  
  54. }  
當request第一次到達伺服器時,伺服器沒有認證的資訊,伺服器會返回一個401 Unauthozied給客戶端。
認證之後將認證資訊放在session,以後在session有效期內就不用再認證了。