authentication java_HTTP基本認證(Basic Authentication)的JAVA實例代碼

大家在登錄網站的時候,大部分時候是通過一個表單提交登錄信息。

但是有時候瀏覽器會彈出一個登錄驗證的對話框,如下圖,這就是使用HTTP基本認證。

6908a886f0d8b3035d2ce7cc8c13cdb9.png

下面來看看一看這個認證的工作過程:

第一步:客戶端發送http request 給服務器,服務器驗證該用戶是否已經登錄驗證過了,如果沒有的話,

服務器會返回一個401 Unauthozied給客戶端,并且在Response 的 header "WWW-Authenticate" 中添加信息。

如下圖。

935ec5479bcd2da4f379cb156aa83f84.png

65e6eddeb182ca5fec0ca54f2513507f.png

第三步: 服務器將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 classHTTPAuthServlet extends HttpServlet {public voiddoGet(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 voiddoPost(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 classBasicAuthenticationUtil {/**

*

* @param request

* @param response

* @param sessionName

* @return*/

public staticboolean 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 staticboolean 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= newBASE64Encoder().encode(bstr);returnstrEncode;

}/**

* 解碼

*

* @param str

* @return*/@SuppressWarnings("restriction")public staticString base64Decode(String str) {if(StringUtil.isBlank(str)) {return null;

}

String s= null;try{

BASE64Decoder decoder= newBASE64Decoder();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;

}returns;

}

}

當request第一次到達服務器時,服務器沒有認證的信息,服務器會返回一個401 Unauthozied給客戶端。

認證之后將認證信息放在session,以后在session有效期內就不用再認證了。

以上就是HTTP基本認證(Basic Authentication)的JAVA實例代碼全部內容

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537994.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537994.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537994.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python數據分析入門(四)

前言上期給大家分享了關于豆瓣5500部電視劇的分析,那么這次我們就給吃貨們帶來一些福利,此次我們的主題為“尋找最好吃的火鍋”。進入主題之前,先給所有的吃貨們帶來一桌美味的火鍋,作為各位看官的前菜。數據采集此次我們采集的是…

微信開發者工具下載

https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

java continue goto_Java中goto和break、continue實現區別

goto 關鍵字很早就在程序設計語言中出現。事實上,goto 是匯編語言的程序控制結構的始祖:“若條件 A,則跳到這里;否則跳到那里”。若閱讀由幾乎所有編譯器生成的匯編代碼,就會發現程序控制里包含了許多跳轉。然而&#…

Linux VirtualBox安裝及使用指南

2019獨角獸企業重金招聘Python工程師標準>>> VirtualBox是一款虛擬機軟件。雖然它的功能并不及VMware Workstation Pro,但它對開源精神的堅持使得它在Linux中依然深受歡迎。 唯一難以令人接受的是,VirtualBox的安裝步驟較為復雜。不過&#x…

java web vm_java web .vm文件??

在JavaWeb項目中有很多.vm文件,打開以后是類似于.NETMVC項目中的.cshtml文件的形式#if($linkList)#set($itemsOnLine0)#foreach($linkin...在Java Web項目中有很多.vm文件,打開以后是類似于.NET MVC項目中的.cshtml文件的形式#if($linkList)#set ($items…

Android studio gradle 無法獲取 pom文件

Android studio 3.1 導入app項目后,gradle無法獲取 pom文件 具體保存內容如下: Could not GET https://dl.google.com/dl/android/maven2/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-g…

生產環境linux下安裝兩個及兩個以上tomcat實踐

前言: 在生產環境部署程序項目中,有時候由于服務器緊張或缺少服務器等原因,往往都需要安裝兩個及兩個以上tomcat。我們需要在/etc/profile中增加tomcat的環境變量,然后在新增加的tomcat的bin目錄下的catalina.sh中引用自己在/etc/profile中配置的環境變量…

java 內存 四_java最終化的內存保留問題(4)

四、一種代替最終化的選擇在前面一節中的示例還存在一種不確定性可能:JVM并不能保證它在最終化隊列中調用對象的終結器的順序。而來自于所有類(應用程序,庫,等等)的終結器都是被同等對待的。因此,一個占有大量內存或一種稀有的本地…

基于Spring Boot不同的環境使用不同的配置方法

原文路徑:http://www.jb51.net/article/132589.htm ---------------------------------------- 默認是profile為dev,可以修改 spring 多文件配置: 1、properties文件 2、YAML文件 一、properties文件 在 Spring Boot 中, 多環境配…

java set方法賦值_java方面:private屬性,沒有set方法,只有get方法,如何給這個屬性賦值?...

富國滬深用反射吧,然后設置setAccessible為true就可以了,如下:public class Test {private String readOnly;public String getReadOnly() {return readOnly;}public static void main(String[] args) throws SecurityException, NoSuchField…

SpringBoot項目在IntelliJ IDEA中實現熱部署

spring-boot項目熱部署idea工具&#xff1a; &#xff08;1&#xff09;、pom文件引入&#xff1a;都需要為true<!-- 熱部署模塊 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId…

java nio 對消息分片_Java NIO:應用

Java NIO 是一種非阻塞的、面向塊而非字節的 IO 方式。雖然 Java 的傳統 IO 也進行了一些基于 NIO 的改造&#xff0c;NIO 仍然能夠帶來許多優勢。面向流的 IO 方便我們一個字節一個字節地處理數據&#xff0c;有利于實現過濾等功能&#xff0c;更加優雅和簡單。相應地&#xf…

使用Notepad++來比較文件

原文連接&#xff1a;https://blog.csdn.net/sanqima/article/details/50467154 -----------------------------------------------------------------------------Notepad&#xff0c;也叫npp&#xff0c;是一款類似于記事本的開源小軟件。它運行便攜&#xff0c;體積小、資源…

利用lamda函數 的函數式編程 實現scrapy審計外網安全問題

2019獨角獸企業重金招聘Python工程師標準>>> import scrapy from scrapy.spiders import Spiderdef parse_response(response, ip_in):title response.xpath("/html/head/title").extract()[0]filename quotes.txtwith open(filename, a) as f:f.write(…

Linux服務器上新增開放端口號

原文連接&#xff1a; https://blog.csdn.net/u012562106/article/details/52882666 ---------------------------------------開放端口的方法&#xff1a; 方法一&#xff1a;命令行方式 1. 開放端口命令&#xff1a; /sbin/iptables -I INPUT -p tcp --dport 8…

return ,continue,break的用法與區別總結

1、return 語句的作用 (1) return 從當前的方法中退出,返回到該調用的方法的語句處,繼續執行。 (2) return 返回一個值給調用該方法的語句&#xff0c;返回值的數據類型必須與方法的聲明中的返回值的類型一致&#xff0c;可以使用強制類型轉換來是數據類型一致。 (…

linux java -xms_為什么JVM比指定的-Xms消耗更少的內存?

我的問題是 Headers &#xff0c;我通過搜索獲得了一些知識&#xff1a;但還是不知道為什么&#xff0c;有些可以提供一些幫助嗎&#xff1f;這是我在Ubuntu12.04(64位)上的測試運行JDK 1.7.0_04 . 和頂部顯示如下&#xff1a;PID USER PR NI VIRT RES SHR S %CPU %MEM TIME CO…

Jquery的一些方法

$.trim(str);說明&#xff1a;去掉字符串首尾空格。轉載于:https://www.cnblogs.com/gygtech/p/9552538.html

清除nginx服務器網站緩存數據

原文連接&#xff1a;https://blog.csdn.net/Crabime/article/details/51883028?locationNum2&fps1 -------------------------------------公司網站上線之后后面老是出現一些小的bug&#xff0c;但是這些bug在vi上改了之后打開更改的網頁卻發現并沒有更改&#xff0c;goo…

linux安裝指定版本python_ubuntu多版本python為指定版本python安裝庫

當安裝了多個版本的Python時&#xff0c;比如一個python2.7&#xff0c;一個python3.5&#xff0c;需要為某個python版本安裝庫時如何精準的指定python版本呢。網上多數回答都是用到pyenv、virtualenv之類&#xff0c;看了下感覺跟我的預期不一致。因為PyCharm已經可以管理多個…