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有效期内就不用再认证了。
HTTP基本认证(Basic Authentication)的JAVA演示样例的更多相关文章
- HTTP基本认证(Basic Authentication)的JAVA实例代码
大家在登录网站的时候,大部分时候是通过一个表单提交登录信息. 但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证. 下面来看看一看这个认证的工作过程: 第一步: 客户端发送 ...
- HTTP基本认证(Basic Authentication)的JAVA示例
大家在登录网站的时候,大部分时候是通过一个表单提交登录信息.但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证.下面来看看一看这个认证的工作过程:第一步: 客户端发送ht ...
- HTTP基础认证Basic Authentication
HTTP基础认证Basic Authentication Basic Authentication是一种HTTP访问控制方式,用于限制对网站资源的访问.这种方式不需要Cookie和Session,只需 ...
- java 覆盖hashCode()深入探讨 代码演示样例
java 翻盖hashCode()深入探讨 代码演示样例 package org.rui.collection2.hashcode; /** * 覆盖hashcode * 设计HashCode时最重要 ...
- java并行调度框架封装及演示样例
參考资料: 阿里巴巴开源项目 CobarClient 源代码实现. 分享作者:闫建忠 分享时间:2014年5月7日 ---------------------------------------- ...
- Java连接redis的使用演示样例
Java连接redis的使用演示样例 Redis是开源的key-value存储工具,redis通经常使用来存储结构化的数据,由于redis的key能够包括String.hash.listset和sor ...
- java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨
java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类.内部类应用于泛型探讨 //Sets.java package org.rui.generics.set; import j ...
- java 状态模式 解说演示样例代码
package org.rui.pattern; import junit.framework.*; /** * 为了使同一个方法调用能够产生不同的行为,State 模式在代理(surrogate)的 ...
- java 线程、线程池基本应用演示样例代码回想
java 线程.线程池基本应用演示样例代码回想 package org.rui.thread; /** * 定义任务 * * @author lenovo * */ public class Lift ...
随机推荐
- runC爆严重安全漏洞,主机可被攻击!使用容器的快打补丁
runC 是 Docker,Kubernetes 等依赖容器的应用程序的底层容器运行时.此次爆出的严重安全漏洞可使攻击者以 root 身份在主机上执行任何命令. 容器的安全性一直是容器技术的一个短板. ...
- Gym - 101981A The 2018 ICPC Asia Nanjing Regional Contest A.Adrien and Austin 简单博弈
题面 题意:一堆有n个石子,编号从1⋯N排成一列,两个人Adrien 和Austin玩游戏,每次可以取1⋯K个连续编号的石子,Adrien先手,谁不能取了则输 题解:k==1时,显然和n奇偶相关,当k ...
- LocalDateTime相关处理,得到零点以及24点值,最近五分钟点位,与Date互转,时间格式
最近一直使用LocalDateTime,老是忘记怎么转换,仅此记录一下 import java.time.Instant; import java.time.LocalDateTime; import ...
- 5.7 Maven通俗讲解
好的东西只适合ctry+c+v 原文地址:https://blog.csdn.net/shuzhe66/article/details/45009175 Maven通俗讲解 也许是本人不才,初识Mav ...
- mvc3结合spring.net-依赖注入
namespace Tuzi.Models.IService { public interface IPersonService { string say(string words); } names ...
- 精确获取对象的类型:Object.prototype.toString()
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
- P3709 大爷的字符串题(50分)
题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...
- 【SQL】CASE与DECODE
1. case..when case..when语句用于按照条件返回查询结果,如当我们想把emp表的工资按照多少分成几个不同的级别,并分别统计各个级别的员工数.SQL语句如下: select (cas ...
- C# Datetime 使用详解
获得当前系统时间: DateTime dt = DateTime.Now; Environment.TickCount可以得到“系统启动到现在”的毫秒值 DateTime now = DateTime ...
- 【剑指Offer】64、滑动窗口的最大值
题目描述: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{ ...