大家在登錄網站的時候,大部分時候是通過一個表單提交登錄信息。
但是有時候瀏覽器會彈出一個登錄驗證的對話框,如下圖,這就是使用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
8 public class HTTPAuthServlet
extends HttpServlet {
9
10 public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
11 String sessionAuth = (String) request.getSession().getAttribute("auth"
);
12
13 if (sessionAuth !=
null) {
14 System.out.println("this is next step"
);
15 nextStep(request, response);
16
17 }
else {
18
19 if(!
checkHeaderAuth(request, response)){
20 response.setStatus(401
);
21 response.setHeader("Cache-Control", "no-store"
);
22 response.setDateHeader("Expires", 0
);
23 response.setHeader("WWW-authenticate", "Basic Realm=\"test\""
);
24 }
25
26 }
27
28 }
29
30 private boolean checkHeaderAuth(HttpServletRequest request, HttpServletResponse response)
throws IOException {
31
32 String auth = request.getHeader("Authorization"
);
33 System.out.println("auth encoded in base64 is " +
getFromBASE64(auth));
34
35 if ((auth !=
null) && (auth.length() > 6
)) {
36 auth = auth.substring(6
, auth.length());
37
38 String decodedAuth =
getFromBASE64(auth);
39 System.out.println("auth decoded from base64 is " +
decodedAuth);
40
41 request.getSession().setAttribute("auth"
, decodedAuth);
42 return true;
43 }
else{
44 return false;
45 }
46
47 }
48
49 private String getFromBASE64(String s) {
50 if (s ==
null)
51 return null;
52 BASE64Decoder decoder =
new BASE64Decoder();
53 try {
54 byte[] b =
decoder.decodeBuffer(s);
55 return new String(b);
56 }
catch (Exception e) {
57 return null;
58 }
59 }
60
61 public void nextStep(HttpServletRequest request, HttpServletResponse response)
throws IOException {
62 PrintWriter pw =
response.getWriter();
63 pw.println("<html> next step, authentication is : " + request.getSession().getAttribute("auth") + "<br>"
);
64 pw.println("<br></html>"
);
65 }
66
67 public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
68 doGet(request, response);
69 }
70
71 }
?
當request第一次到達服務器時,服務器沒有認證的信息,服務器會返回一個401 Unauthozied給客戶端。
認證之后將認證信息放在session,以后在session有效期內就不用再認證了。
轉載于:https://www.cnblogs.com/azhqiang/p/5944697.html
總結
以上是生活随笔為你收集整理的HTTP基本认证(Basic Authentication)的JAVA示例的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。