HTTP基本認證(Basic Authentication)的JAVA演示樣例


大家在登錄站點的時候。大部分時候是通過一個表單提交登錄信息。
可是有時候瀏覽器會彈出一個登錄驗證的對話框。例如以下圖,這就是使用HTTP基本認證。

以下來看看一看這個認證的工作過程:
第一步:  client發送http request 給server,server驗證該用戶是否已經登錄驗證過了,假設沒有的話,
server會返回一個401 Unauthozied給client,而且在Response 的 header "WWW-Authenticate" 中加入信息。


例如以下圖。



第二步:瀏覽器在接受到401 Unauthozied后,會彈出登錄驗證的對話框。用戶輸入username和password后,
瀏覽器用BASE64編碼后。放在Authorization header中發送給server。例如以下圖:

第三步: server將Authorization header中的usernamepassword取出,進行驗證, 假設驗證通過,將依據請求,發送資源給client。



以下來看一個JAVA的演示樣例代碼:

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.BASE64Decoder;

public class HTTPAuthServlet extends HttpServlet {
	
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String sessionAuth = (String) request.getSession().getAttribute("auth");

		if (sessionAuth != null) {
			System.out.println("this is next step");
			nextStep(request, response);

		} else {

			if(!checkHeaderAuth(request, response)){
				response.setStatus(401);
				response.setHeader("Cache-Control", "no-store");
				response.setDateHeader("Expires", 0);
				response.setHeader("WWW-authenticate", "Basic Realm=\"test\"");
			}			

		}

	}

	private boolean checkHeaderAuth(HttpServletRequest request, HttpServletResponse response) throws IOException {

		String auth = request.getHeader("Authorization");
		System.out.println("auth encoded in base64 is " + getFromBASE64(auth));
		
		if ((auth != null) && (auth.length() > 6)) {
			auth = auth.substring(6, auth.length());

			String decodedAuth = getFromBASE64(auth);
			System.out.println("auth decoded from base64 is " + decodedAuth);

			request.getSession().setAttribute("auth", decodedAuth);
			return true;
		}else{
			return false;
		}

	}

	private String getFromBASE64(String s) {
		if (s == null)
			return null;
		BASE64Decoder decoder = new BASE64Decoder();
		try {
			byte[] b = decoder.decodeBuffer(s);
			return new String(b);
		} catch (Exception e) {
			return null;
		}
	}

	public void nextStep(HttpServletRequest request, HttpServletResponse response) throws IOException {
		PrintWriter pw = response.getWriter();
		pw.println("<html> next step, authentication is : " + request.getSession().getAttribute("auth") + "<br>");
		pw.println("<br></html>");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
		doGet(request, response);
	}

}
當request第一次到達server時。server沒有認證的信息,server會返回一個401 Unauthozied給client。
認證之后將認證信息放在session,以后在session有效期內就不用再認證了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM