HTTP基本认证(Basic Authentication)的JAVA示例

大家在登录网站的时候,大部分时候是通过一个表单提交登录信息。
但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用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://www.mzph.cn/news/394920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python能print中文吗_python怎么print汉字

今天就为大家分享一篇python中使用print输出中文的方法&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。看Python简明教程&#xff0c;学习使用print打印字符串&#xff0c;试了下打印中文&#xff0c;不行。&#xff08;推荐学习&#xff1a;Python视频教程&a…

oracle 11gogg,【OGG】Oracle GoldenGate 11g (二) GoldenGate 11g 单向同步配置 上

Oracle GoldenGate 11g (二)GoldenGate 11g 单向同步配置 上ItemSource SystemTarget SystemPlatformRHEL6.4 - 64bitRHEL6.4 - 64bitHostnamerhel64.oracle.comora11g.oracle.comDatabaseOracle 11.2.0.3Oracle 11.2.0.3Character SetAL32UTF8AL32UTF8ORACLE_SIDPRODEMREPList…

Centos7-卸载自带的jdk 安装jdk8

卸载JDK Centos7一般都会带有自己的openjdk,我们一般都回用oracle的jdk,所以要卸载 步骤一&#xff1a;查询系统是否以安装jdk #rpm -qa|grep java 或 #rpm -qa|grep jdk 或 #rpm -qa|grep gcj 步骤二&#xff1a;卸载已安装的jdk #rpm -e --nodeps java-1.8.0-openjdk…

iOS开发UIScrollView的底层实现

起始 做开发也有一段时间了&#xff0c;经历了第一次完成项目的激动&#xff0c;也经历了天天调用系统的API的枯燥&#xff0c;于是就有了探索底层实现的想法。 关于scrollView的思考 在iOS开发中我们会大量用到scrollView这个控件&#xff0c;我们使用的tableView/collectionv…

oracle查看登录时间黑屏,oracle 11g默认用户名、密码解锁 以及安装后重启黑屏问题.doc...

oracle 11g默认用户名、密码解锁 以及安装后重启黑屏问题.doc还剩3页未读&#xff0c;继续阅读下载文档到电脑&#xff0c;马上远离加班熬夜&#xff01;亲&#xff0c;喜欢就下载吧&#xff0c;价低环保&#xff01;内容要点&#xff1a;遇的同学&#xff0c;参考一下解决办法…

第六十二节,html分组元素

html分组元素 学习要点&#xff1a; 1.分组元素总汇 2.分组元素解析 本章主要探讨HTML5中分组元素的用法。所谓分组&#xff0c;就是用来组织相关内容的HTML5元素&#xff0c;清晰有效的进行归类。 一&#xff0e;分组元素总汇 为了页面的排版需要&#xff0c;HTML5提供了几种语…

WebSocket 实战--转

原文地址&#xff1a;http://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/ WebSocket 前世今生 众所周知&#xff0c;Web 应用的交互过程通常是客户端通过浏览器发出一个请求&#xff0c;服务器端接收请求后进行处理并返回结果给客户端&#xff0c;客户端浏览器将信息呈…

mongodb 安装、启动

MongoDB 之 你得知道MongoDB是个什么鬼 MongoDB - 1 最近有太多的同学向我提起MongoDB,想要学习MongoDB,还不知道MongoDB到底是什么鬼,或者说,知道是数据库,知道是文件型数据库,但是不知道怎么来用 那么好,所谓千呼万唤始出来,现在我就拉给你们看: 一.初识MongoDB 之 什么东西都…

[转载]PSCAD调用MATLAB/SIMULINK之接口元件设计

原文地址&#xff1a;PSCAD调用MATLAB/SIMULINK之接口元件设计作者&#xff1a;luckyhappier1)接口元件 接口元件包括Graphics&#xff0c;Parameters和Script。注意&#xff1a;变量要与DSDYN要一致&#xff08;PSCAD根据变量名区别变量&#xff09;。 2&#xff09;Circuit 定…

oracle数字类型ef映射,Entity Framework 学习中级篇5—使EF支持Oracle9i - ♂风车车.Net - 博客园...

从Code MSDN上下载下来的EFOracleProvider不支持Oracle9i.但是,目前我所使用的还是Oracle9i。为此,对EFOracleProvider修改了以下&#xff0c;以便使其支持Oracle9i.下面说说具体修改地方.(红色部分为添加或修改的代码部分)一&#xff0c;修改EFOracleProvider1,修改EFOraclePr…

Oracle 数据库之最:你见过最高的 SQL Version 是多少?

Oracle数据库中执行的SQL&#xff0c;很多时候会因为种种原因产生多个不同的执行版本&#xff0c;一个游标的版本过多很容易引起数据库的性能问题&#xff0c;甚至故障。 有时候一个SQL的版本数量可能多达数万个&#xff0c;以下是我之前在"云和恩墨大讲堂”分享过的一个案…

C 怎么读取Cpp文件_opencv从yaml文件中读取矩阵(c++)

PS:由于我是新手&#xff0c;因此记录的比较罗里吧嗦&#xff0c;本文也属于一个没有任何技术的编程积累。在SLAM系统中&#xff0c;经常需要从配置文件中读取参数文件&#xff0c;读取整型&#xff0c;浮点型都是比较常见的操作&#xff0c;在读取矩阵卡了一下&#xff0c;记录…

3.SFB标准版前端安装

SFB服务器准备部分&#xff1a;1.修改服务器名称&#xff0c;sfb加入域&#xff0c;用域管理员账户登录2.配置服务器IP地址&#xff0c;DNS3.安装Windows组件Add-WindowsFeature NET-Framework-Core, RSAT-ADDS, Windows-Identity-Foundation, Web-Server, Web-Static-Content,…

向spark standalone集群提交任务

文档链接 #切换到spark安装目录,执行下面一条命令,192.168.0.10是master的ip, examples/src/main/python/pi.py 是python 文件的路径 ./bin/spark-submit --master spark://192.168.0.106:7077 examples/src/main/python/pi.py任务已经执行完毕,耗时10秒 转载于:https://www.c…

python excelwriter保存路径_Python和Excel 终于可以互通了!!

点击“开发者技术前线”&#xff0c;选择“星标&#x1f51d;”在看|星标|留言, 真爱作者&#xff1a;小天真_5eed 链接&#xff1a;https://www.jianshu.com/p/6ecf414f3372今天为大家分享一篇使用python将大量数据导出到Excel中的技巧心得&#xff0c;可以让Python和Excel…

MySQL 导出数据

2019独角兽企业重金招聘Python工程师标准>>> 1、导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 存放位置比如&#xff1a; mysqldump -u root -p project > c:/a.sql 2.导出一个表的结构&#xff0c;并且带表中的数据 mysqldump -u 用户名 -p 数据库名 …

单片机STM8S测量电压电路_单片机电路设计中的10个难点

单片机是嵌入式系统的核心元件&#xff0c;使用单片机的电路要复杂得多&#xff0c;但在更改和添加新功能时&#xff0c;带有单片机的电路更加容易实现&#xff0c;这也正是电器设备使用单片机的原因。那么在单片机电路的设计中需要注意的难点有哪些&#xff1f;嵌入式ARM开发 …

oracle ebs 数据源,Oracle EBS环境下查找数据源(Form篇)

关于在Oracle EBS环境下如何查找数据源的文章几年前就已经开始整理&#xff0c;但是其中关于OAF方面的一直没有整理&#xff0c;导致这份文档一直残缺不全&#xff0c;有很多次同事都向我索要相关文档都未能如愿以偿&#xff0c;新的一届培训工作再次启动&#xff0c;为了自己也…

linux 实用指令

通过init 来制定/切换不同的运行指令 查看linux 系统下&#xff0c;电脑的运行级别 vim /etc/inittab 如何找回丢失的root密码&#xff1f; 进入到单用户模式&#xff0c;然后修改root密码 进入到单用户模式&#xff0c;root不需要密码也可以登录 如果开机就是init 0 办法&…

chrome控制台如何把vw显示成px_【CSS】rem,em,px的区别和使用场景

前端潮咖点击上面蓝字&#xff0c;关注我们&#xff01;关注关注前端潮咖&#xff0c;每日精选好文作者&#xff1a;大前端小菜鸟来源&#xff1a;cnblogs.com/hyns/p/12380944.html作rem布局原理深度理解(以及em/vw/vh)一、前言我们h5项目终端适配采用的是淘宝那套《Flexible实…