大家在登录站点的时候。大部分时候是通过一个表单提交登录信息。
可是有时候浏览器会弹出一个登录验证的对话框。例如以下图,这就是使用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的演示样例代码:

  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第一次到达server时。server没有认证的信息,server会返回一个401 Unauthozied给client。
认证之后将认证信息放在session,以后在session有效期内就不用再认证了。

HTTP基本认证(Basic Authentication)的JAVA演示样例的更多相关文章

  1. HTTP基本认证(Basic Authentication)的JAVA实例代码

    大家在登录网站的时候,大部分时候是通过一个表单提交登录信息. 但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证. 下面来看看一看这个认证的工作过程: 第一步: 客户端发送 ...

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

    大家在登录网站的时候,大部分时候是通过一个表单提交登录信息.但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证.下面来看看一看这个认证的工作过程:第一步:  客户端发送ht ...

  3. HTTP基础认证Basic Authentication

    HTTP基础认证Basic Authentication Basic Authentication是一种HTTP访问控制方式,用于限制对网站资源的访问.这种方式不需要Cookie和Session,只需 ...

  4. java 覆盖hashCode()深入探讨 代码演示样例

    java 翻盖hashCode()深入探讨 代码演示样例 package org.rui.collection2.hashcode; /** * 覆盖hashcode * 设计HashCode时最重要 ...

  5. java并行调度框架封装及演示样例

    參考资料:  阿里巴巴开源项目 CobarClient  源代码实现. 分享作者:闫建忠 分享时间:2014年5月7日 ---------------------------------------- ...

  6. Java连接redis的使用演示样例

    Java连接redis的使用演示样例 Redis是开源的key-value存储工具,redis通经常使用来存储结构化的数据,由于redis的key能够包括String.hash.listset和sor ...

  7. java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨

    java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类.内部类应用于泛型探讨 //Sets.java package org.rui.generics.set; import j ...

  8. java 状态模式 解说演示样例代码

    package org.rui.pattern; import junit.framework.*; /** * 为了使同一个方法调用能够产生不同的行为,State 模式在代理(surrogate)的 ...

  9. java 线程、线程池基本应用演示样例代码回想

    java 线程.线程池基本应用演示样例代码回想 package org.rui.thread; /** * 定义任务 * * @author lenovo * */ public class Lift ...

随机推荐

  1. runC爆严重安全漏洞,主机可被攻击!使用容器的快打补丁

    runC 是 Docker,Kubernetes 等依赖容器的应用程序的底层容器运行时.此次爆出的严重安全漏洞可使攻击者以 root 身份在主机上执行任何命令. 容器的安全性一直是容器技术的一个短板. ...

  2. 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 ...

  3. LocalDateTime相关处理,得到零点以及24点值,最近五分钟点位,与Date互转,时间格式

    最近一直使用LocalDateTime,老是忘记怎么转换,仅此记录一下 import java.time.Instant; import java.time.LocalDateTime; import ...

  4. 5.7 Maven通俗讲解

    好的东西只适合ctry+c+v 原文地址:https://blog.csdn.net/shuzhe66/article/details/45009175 Maven通俗讲解 也许是本人不才,初识Mav ...

  5. mvc3结合spring.net-依赖注入

    namespace Tuzi.Models.IService { public interface IPersonService { string say(string words); } names ...

  6. 精确获取对象的类型:Object.prototype.toString()

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

  7. P3709 大爷的字符串题(50分)

    题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...

  8. 【SQL】CASE与DECODE

    1. case..when case..when语句用于按照条件返回查询结果,如当我们想把emp表的工资按照多少分成几个不同的级别,并分别统计各个级别的员工数.SQL语句如下: select (cas ...

  9. C# Datetime 使用详解

    获得当前系统时间: DateTime dt = DateTime.Now; Environment.TickCount可以得到“系统启动到现在”的毫秒值 DateTime now = DateTime ...

  10. 【剑指Offer】64、滑动窗口的最大值

      题目描述:   给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{ ...