大家在登入網站的時候,大部分時候是通過一個表單送出登入資訊。
但是有時候浏覽器會彈出一個登入驗證的對話框,如下圖,這就是使用HTTP基本認證。
下面來看看一看這個認證的工作過程:
第一步: 用戶端發送http request 給伺服器,伺服器驗證該使用者是否已經登入驗證過了,如果沒有的話,
伺服器會傳回一個401 Unauthozied給用戶端,并且在Response 的 header "WWW-Authenticate" 中添加資訊。
如下圖。
第三步: 伺服器将Authorization header中的使用者名密碼取出,進行驗證, 如果驗證通過,将根據請求,發送資源給用戶端。
下面來看一個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 {
if (!BasicAuthenticationUtil.checkUserAuth(request, "basicAuth")) {
if (!BasicAuthenticationUtil.checkHeaderAuth(request, "basicAuth")) {
response.setStatus(401);
response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires", 0);
response.setHeader("WWW-authenticate", "Basic Realm=\"test\"");
return null;
}
}
// 驗證通過後
String client = request.getParameter("client");if (StringUtils.isBlank(client)) {
//......
}
// 其他操作....
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
doGet(request, response);
}
}
BasicAuthenticationUtil 幫助類
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import org.jfree.util.Log;
import sun.misc.*;
/**
* basic Auth 認證方式
*
* @author Geely
*
*/
public class BasicAuthenticationUtil {
/**
*
* @param request
* @param response
* @param sessionName
* @return
*/
public static boolean checkHeaderAuth(HttpServletRequest request, String sessionName) {
String authorization = request.getHeader("Authorization");
if ((authorization != null) && (authorization.length() > 6)) {
authorization = authorization.substring(6, authorization.length());
String decodedAuth = base64Decode(authorization);
if (StringUtil.isNotBlank(sessionName)) {
request.getSession().setAttribute(sessionName, decodedAuth);
}
return true;
}
return false;
}
/**
*
* @param request
* @param response
* @param sessionName
* @return
*/
public static boolean checkUserAuth(HttpServletRequest request, String sessionName) {
String sessionAuth = null;
if (StringUtil.isNotBlank(sessionName)) {
sessionAuth = (String) request.getSession().getAttribute(sessionName);
}
if (sessionAuth != null) {
Log.info("this is next step");
return true;
}
return false;
}
/**
* 編碼
*
* @param bstr
* @return String
*/
@SuppressWarnings("restriction")
public static String base64Encode(byte[] bstr) {
String strEncode = new BASE64Encoder().encode(bstr);
return strEncode;
}
/**
* 解碼
*
* @param str
* @return
*/
@SuppressWarnings("restriction")
public static String base64Decode(String str) {
if (StringUtil.isBlank(str)) {
return null;
}
String s = null;
try {
BASE64Decoder decoder = new BASE64Decoder();
byte[] b = decoder.decodeBuffer(str);
s = new String(b, "UTF8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
s = null;
} catch (IOException e) {
// TODO Auto-generated catch block
s = null;
}
return s;
}
}
當request第一次到達伺服器時,伺服器沒有認證的資訊,伺服器會傳回一個401 Unauthozied給用戶端。
認證之後将認證資訊放在session,以後在session有效期内就不用再認證了。
以上就是HTTP基本認證(Basic Authentication)的JAVA執行個體代碼全部内容