大家在登录网站的时候,大部分时候是通过一个表单提交登录信息。
但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用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有效期内就不用再认证了。

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

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

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

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

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

  3. HTTP基础认证Basic Authentication

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

  4. Nancy 学习-身份认证(Basic Authentication) 继续跨平台

    开源 示例代码:https://github.com/linezero/NancyDemo 前面讲解Nancy的进阶部分,现在来学习Nancy 的身份认证. 本篇主要讲解Basic Authentic ...

  5. Atitit HTTP 认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结

    Atitit HTTP认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结 1.1. 最广泛使用的是基本验证 ( ...

  6. HTTP Basic Authentication

    Client端发送请求, 要在发送请求的时候添加HTTP Basic Authentication认证信息到请求中,有两种方法:1. 在请求头中添加Authorization:    Authoriz ...

  7. HTTP Basic Authentication认证

    http://smalltalllong.iteye.com/blog/912046 ******************************************** 什么是HTTP Basi ...

  8. PYTHON实现HTTP基本认证(BASIC AUTHENTICATION)

    参考: http://www.voidspace.org.uk/python/articles/authentication.shtml#id20 http://zh.wikipedia.org/wi ...

  9. HTTP Basic Authentication认证的各种语言 后台用的

    访问需要HTTP Basic Authentication认证的资源的各种语言的实现 无聊想调用下嘀咕的api的时候,发现需要HTTP Basic Authentication,就看了下. 什么是HT ...

随机推荐

  1. 拾遗:『Linux Capability』

    『Linux Capability』 For the purpose of performing permission checks, traditional UNIX implementations ...

  2. css3的学习笔记1

    一.   边框 1.  border-color border-color是设置边框的颜色.包括border-top-color,border-left-color,border-right-colo ...

  3. TreeView树形控件递归绑定数据库里的数据

    TreeView树形控件递归绑定数据库里的数据. 第一种:性能不好 第一步:数据库中查出来的表,字段名分别为UNAME(显示名称),DID(关联数据),UTYPE(类型) 第二步:前台代码 <% ...

  4. webstorm与SAE的svn仓库链接进行版本控制

    这里把我使用webstorm与SAE的svn仓库链接: 1.先得设置webstorm中的版本控制,File->Settings->Version Control->Subversio ...

  5. Educational Codeforces Round 10

    A:Gabriel and Caterpillar 题意:蜗牛爬树问题:值得一提的是在第n天如果恰好在天黑时爬到END,则恰好整除,不用再+1: day = (End - Begin - day0)/ ...

  6. [PHP] php实现文件下载

    1. 设置超链接的href属性 <a href="文件地址"></a> 如果浏览器不能解析该文件,浏览器会自动下载.而如果文件是图片或者txt,会直接在浏览 ...

  7. web浏览器工作原理

    HTML在浏览器里的渲染原理 我们打开的页面(Web页面)在各种不同的浏览器中运行,浏览器载入.渲染页面的速度直接影响着用户体验,简单地说下页面渲染,页面渲染就是浏览器将html代码根据CSS定义的规 ...

  8. Linux 查杀进程

    ps -eaf |grep "stoporder.php" | grep -v "grep"| awk '{print $2}'|xargs kill -9 # ...

  9. Unix常用指令

    pwd 表示获取自己当前所在位置 ls 表示查看当前文件夹中的内容 cd 进入指定目录 mkdir  文件夹1 创建一个文件夹名为文件夹1的文件夹 rmdir  文件夹2 删除一个文件夹名为文件夹2的 ...

  10. 不均匀的Windows处理器编组

    不均匀的Windows处理器编组 之前写过一篇文章,关于SQLSERVER能识别多少个逻辑CPU的,前些天在论坛里有人问Windows处理器编组是如何划分的?? SQLSERVER到底能识别多少个逻辑 ...