HTTP基本認(rèn)證(Basic Authentication)的JAVA實(shí)例代碼
大家在登錄網(wǎng)站的時(shí)候,大部分時(shí)候是通過一個(gè)表單提交登錄信息。
但是有時(shí)候?yàn)g覽器會(huì)彈出一個(gè)登錄驗(yàn)證的對(duì)話框,如下圖,這就是使用HTTP基本認(rèn)證。
下面來看看一看這個(gè)認(rèn)證的工作過程:
第一步: 客戶端發(fā)送http request 給服務(wù)器,服務(wù)器驗(yàn)證該用戶是否已經(jīng)登錄驗(yàn)證過了,如果沒有的話,
服務(wù)器會(huì)返回一個(gè)401 Unauthozied給客戶端,并且在Response 的 header "WWW-Authenticate" 中添加信息。
如下圖。
第三步: 服務(wù)器將Authorization header中的用戶名密碼取出,進(jìn)行驗(yàn)證, 如果驗(yàn)證通過,將根據(jù)請(qǐng)求,發(fā)送資源給客戶端。
下面來看一個(gè)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); } }
當(dāng)request第一次到達(dá)服務(wù)器時(shí),服務(wù)器沒有認(rèn)證的信息,服務(wù)器會(huì)返回一個(gè)401 Unauthozied給客戶端。
認(rèn)證之后將認(rèn)證信息放在session,以后在session有效期內(nèi)就不用再認(rèn)證了。
以上就是小編為大家?guī)淼腍TTP基本認(rèn)證(Basic Authentication)的JAVA實(shí)例代碼全部內(nèi)容了,希望大家多多支持腳本之家~
- Python使用QQ郵箱發(fā)送郵件報(bào)錯(cuò)smtplib.SMTPAuthenticationError
- mysql 8.0 錯(cuò)誤The server requested authentication method unknown to the client解決方法
- django認(rèn)證系統(tǒng) Authentication使用詳解
- Java Jedis NOAUTH Authentication required問題解決方法
- 如何解決redis的NOAUTH Authentication required異常
- springboot+Oauth2實(shí)現(xiàn)自定義AuthenticationManager和認(rèn)證path
- form身份驗(yàn)證通過后,只能用FormsAuthentication.RedirectFromLoginPage
- Spring Security如何基于Authentication獲取用戶信息
相關(guān)文章
Java pom.xml parent引用報(bào)錯(cuò)問題解決方案
這篇文章主要介紹了Java pom.xml parent引用報(bào)錯(cuò)問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08詳解Spring bean的注解注入之@Autowired的原理及使用
之前講過bean注入是什么,也使用了xml的配置文件進(jìn)行bean注入,這也是Spring的最原始的注入方式(xml注入).本文主要講解的注解有以下幾個(gè):@Autowired、 @Service、@Repository、@Controller 、@Component、@Bean、@Configuration、@Resource ,需要的朋友可以參考下2021-06-06Java操作minio刪除文件夾及其文件方法(MinIO基本使用)
MinIO是一個(gè)高性能、無限擴(kuò)展的開源對(duì)象存儲(chǔ)服務(wù)器,它以對(duì)象的形式存儲(chǔ)數(shù)據(jù),并兼容Amazon S3接口,它適用于大規(guī)模數(shù)據(jù)存儲(chǔ)、大數(shù)據(jù)分析、文件共享和備份等應(yīng)用場景,這篇文章主要介紹了java操作minio刪除文件夾及其文件方法,需要的朋友可以參考下2024-02-02jboss( WildFly)上運(yùn)行 springboot程序的步驟詳解
這篇文章主要介紹了jboss( WildFly)上運(yùn)行 springboot程序的步驟詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02淺談Java內(nèi)部類——靜態(tài)內(nèi)部類
這篇文章主要介紹了Java靜態(tài)內(nèi)部類的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java內(nèi)部類的相關(guān)知識(shí),感興趣的朋友可以了解下2020-08-08關(guān)于使用swagger整合springMVC的方法
在平時(shí)開發(fā)寫接口文檔的工作時(shí),一般都是word文檔,帶來書寫麻煩、維護(hù)麻煩的問題,比如改了源代碼忘了更新文檔、解釋不明確帶來歧義、無法在線嘗試等等,swagger可以有效解決這類問題,需要的朋友可以參考下2023-04-04Android應(yīng)用開發(fā)的一般文件組織結(jié)構(gòu)講解
這篇文章主要介紹了Android應(yīng)用開發(fā)的一般文件組織結(jié)構(gòu)講解,同時(shí)附帶介紹了一個(gè)獲取Android的文件列表的方法,需要的朋友可以參考下2015-12-12