大家在登录网站的时候,大部分时候是通过一个表单提交登录信息。

但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证。

下面来看看一看这个认证的工作过程:

第一步: 客户端发送http request 给服务器,服务器验证该用户是否已经登录验证过了,如果没有的话,

服务器会返回一个401 Unauthozied给客户端,并且在Response 的 header "WWW-Authenticate" 中添加信息。

如下图。

第三步: 服务器将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. if (!BasicAuthenticationUtil.checkUserAuth(request, "basicAuth")) {
  12. if (!BasicAuthenticationUtil.checkHeaderAuth(request, "basicAuth")) {
  13. response.setStatus();
  14. response.setHeader("Cache-Control", "no-store");
  15. response.setDateHeader("Expires", );
  16. response.setHeader("WWW-authenticate", "Basic Realm=\"test\"");
  17. return null;
  18. }
  19. }
  20.  
  21. // 验证通过后
  22. String client = request.getParameter("client");if (StringUtils.isBlank(client)) {
  23. //......
  24. }
  25.  
  26. // 其他操作....
  27. }
  28.  
  29. public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
  30. doGet(request, response);
  31. }
  32.  
  33. }

BasicAuthenticationUtil 帮助类

  1. import java.io.IOException;
  2. import java.io.UnsupportedEncodingException;
  3.  
  4. import javax.servlet.http.HttpServletRequest;
  5.  
  6. import org.jfree.util.Log;
  7. import sun.misc.*;
  8.  
  9. /**
  10. * basic Auth 认证方式
  11. *
  12. * @author Geely
  13. *
  14. */
  15. public class BasicAuthenticationUtil {
  16.  
  17. /**
  18. *
  19. * @param request
  20. * @param response
  21. * @param sessionName
  22. * @return
  23. */
  24. public static boolean checkHeaderAuth(HttpServletRequest request, String sessionName) {
  25. String authorization = request.getHeader("Authorization");
  26. if ((authorization != null) && (authorization.length() > )) {
  27. authorization = authorization.substring(, authorization.length());
  28. String decodedAuth = base64Decode(authorization);
  29. if (StringUtil.isNotBlank(sessionName)) {
  30. request.getSession().setAttribute(sessionName, decodedAuth);
  31. }
  32. return true;
  33. }
  34. return false;
  35. }
  36.  
  37. /**
  38. *
  39. * @param request
  40. * @param response
  41. * @param sessionName
  42. * @return
  43. */
  44. public static boolean checkUserAuth(HttpServletRequest request, String sessionName) {
  45. String sessionAuth = null;
  46. if (StringUtil.isNotBlank(sessionName)) {
  47. sessionAuth = (String) request.getSession().getAttribute(sessionName);
  48. }
  49. if (sessionAuth != null) {
  50. Log.info("this is next step");
  51. return true;
  52. }
  53. return false;
  54. }
  55.  
  56. /**
  57. * 编码
  58. *
  59. * @param bstr
  60. * @return String
  61. */
  62. @SuppressWarnings("restriction")
  63. public static String base64Encode(byte[] bstr) {
  64. String strEncode = new BASE64Encoder().encode(bstr);
  65. return strEncode;
  66. }
  67.  
  68. /**
  69. * 解码
  70. *
  71. * @param str
  72. * @return
  73. */
  74. @SuppressWarnings("restriction")
  75. public static String base64Decode(String str) {
  76. if (StringUtil.isBlank(str)) {
  77. return null;
  78. }
  79. String s = null;
  80. try {
  81. BASE64Decoder decoder = new BASE64Decoder();
  82. byte[] b = decoder.decodeBuffer(str);
  83. s = new String(b, "UTF8");
  84. } catch (UnsupportedEncodingException e) {
  85. // TODO Auto-generated catch block
  86. s = null;
  87. } catch (IOException e) {
  88. // TODO Auto-generated catch block
  89. s = null;
  90. }
  91. return s;
  92. }
  93.  
  94. }

当request第一次到达服务器时,服务器没有认证的信息,服务器会返回一个401 Unauthozied给客户端。

认证之后将认证信息放在session,以后在session有效期内就不用再认证了。

以上就是HTTP基本认证(Basic Authentication)的JAVA实例代码全部内容

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

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

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

  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. java 发送带Basic Auth认证的http post请求实例代码

    构造http header private static final String URL = "url"; private static final String APP_KEY ...

  6. 【Window】Tor(洋葱头路由)+Privoxy 网络实践(附带Java实例代码)

    1.背景 平时我们需要访问onion后缀的网站,需要通过Tor(The Onion Router,洋葱路由器).一般来说安装Tor Broswer就可以满足需要.但是项目我要做的是通过程序来获取oni ...

  7. RSA非对称加密(java实例代码)

    使用RSA对WebService传递的信息加密解密的基本思想是:服务器端提供一个WebService方法String getServerPublicKey(),客户端可以以此得到服务器端的公钥,然后使 ...

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

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

  9. HTTP Basic Authentication认证

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

随机推荐

  1. 【java】LIst切割----划分 List为几个LIst的几种工具类 1.按照目标份数划分 2.按照目标容量划分 【适用场景:mybatis分批次In查询,放置In拼接sql过长】

    如题,示例代码如下: /** * 1> 按照份数---划分list * @param source * @param num 想要划分成多少份 * @return */ public stati ...

  2. 【shiro】使用shiro,点击页面请求总是302状态码

    解决方法: 配置shiro中,将要求放过的地址后面加上后缀,这里是.htmls 因为web.xml中配置所有的页面都是放过的

  3. nodejs第一个练习:用Node.js建HTTP服务器

    这是官方的一个例子, 在F盘建立一个tinyphp.js文件,内容: var http = require('http'); http.createServer(function (req, res) ...

  4. 如何优雅的编写Objective-C语言?

    ① 减少缩写 命名缩写只用于通用专业术语,如URL,不可自创命名缩写,如Ctr.Msg.命名宁可长一些,也不要难于理解. ② 过程化 动作发生之前用Will,发生之后用Did,询问是否发生用Shoul ...

  5. 客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值。

    客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值.     无论是什么的html控件,只要加上了runat="server" ...

  6. hdu1227 Fast Food

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1227 #include <iostream> #include <cstdio&g ...

  7. 强大实用的jQuery幻灯片插件Owl Carousel

    演 示 下 载 简介 Owl Carousel 是一个强大.实用但小巧的 jQuery 幻灯片插件,它具有一下特点: 兼容所有浏览器 支持响应式 支持 CSS3 过度 支持触摸事件 支持 JSON 及 ...

  8. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何实现开平方的Pow函数

    使用函数EXPT即可(输入的两个参数都可以是LREAL类型),注意跟计算器对比是Xy,所以4的0.123次方结果是1.18     4的0.5次方是2     更多教学视频和资料下载,欢迎关注以下信息 ...

  9. java中Queue接口

    Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Queue接 口.Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类 ...

  10. js 终止 forEach 循环

    1.因为 forEach() 无法通过正常流程终止,所以可以通过抛出异常的方式实现终止. try{ var array = ["first","second", ...