开发者社区> 铁锚> 正文

检查HTTP 的 Digest 认证代码示例-JSP

简介: 检查HTTP 的 Digest  认证. since http1.1 代码如下所示:(此代码还不完善, RFC2617算法未实现).
+关注继续查看

检查HTTP 的 Digest  认证. since http1.1

代码如下所示:(此代码还不完善, RFC2617算法未实现).

<%@ page pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
<%@ page import="sun.misc.BASE64Decoder" %>
<%@ page import="java.io.IOException" %>
<%@ page import="java.util.UUID" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%!
  // 检查HTTP 的 Basic认证. since http1.0
  public static boolean checkAuth(HttpServletRequest request, String _username, String _password){
    boolean authOK = false;
    // 认证后每次HTTP请求都会附带上 Authorization 头信息
    String Authorization = request.getHeader("Authorization");
    if(null == Authorization || Authorization.trim().isEmpty()){
      // 需要认证
      return authOK;
    }
    // 示例数据, 没有换行,有逗号,也有空格
    // Digest username="admin", realm="DIGEST tiemao",
    // nonce="227c89449fd644a3b9df12e7cb8b0e33", uri="/digest.jsp",
    // algorithm=MD5, response="a8bc07c1d6dc38802ce538247e22f773",
    // qop=auth, nc=00000001, cnonce="f337ac5d88670ef5"

    String[] digestArray = Authorization.split("\\s+");
    if(null == digestArray || digestArray.length < 2){
      return authOK;
    }
    //
    Map<String,String> authMap = new HashMap<String,String>();
    for(int i = 0; i < digestArray.length; i++){
      String paraAndValue = digestArray[i];
      //
      String[] pvArray = paraAndValue.split("=");
      if(null == pvArray || 2 != pvArray.length){
        continue; // 不处理0
      }
      String key = pvArray[0];
      String value = pvArray[1];
      //
      if(null==key || null == value){

      }
      //
      value = value.replace("'","");
      value = value.replace(",","");
      value = value.replace("\"","");
      value = value.trim();
      authMap.put(key, value);
    }
    //
    String username = authMap.get("username");
    String nonce = authMap.get("nonce");
    String response = authMap.get("response");
    // 这里应该有个 RFC2617 算法,与客户端一致,即计算用户密码
    if(_username.equalsIgnoreCase(username) && checkAuth_RFC2617(_username, _password, response)){
      authOK = true;// 认证成功,
    }

    //
    return authOK;
  }


  // RFC2617 运算,这算法比较复杂,暂时未实现
  // 参考地址: http://www.faqs.org/rfcs/rfc2617.html
  public static boolean checkAuth_RFC2617(String _username,String _password, String response){
    boolean authOK = false;
    if(null != _username || null !=_password || response.equalsIgnoreCase(response)){
      authOK = true;// 认证成功,
    }
    return true;
  }

  // 不依赖 this 状态的方法,其实都应该设置为 static
  public static void requireDigestAuth(HttpServletResponse response, String nonce){
    // 发送状态码 401, 不能使用 sendError,坑
    response.setStatus(401,"Authentication Required");
    //
    String authHeader = "Digest realm=\"DIGEST tiemao\"";
    authHeader += ",nonce=\""+ nonce +"\"";
    authHeader += ",algorithm=MD5";
    authHeader += ",qop=\""+ "auth" +"\"";
    // 发送要求输入认证信息,则浏览器会弹出输入框
    response.addHeader("WWW-Authenticate", authHeader);
    return;
  }
%>
<%
  //
  String Authorization = request.getHeader("Authorization");
  //
  String _username = "admin";
  String pwd = "11111111";
  boolean authOK = checkAuth(request, _username, pwd);
  //
  if (!authOK) {
    //
    String nonce = UUID.randomUUID().toString().replace("-","");
    // 如果认证失败,则要求认证
    requireDigestAuth(response, nonce);
    return;
  }
%>
<html>
<head>
  <title>DIGEST认证示例</title>
</head>
<body>
R U OK? <%=_username %>. Your Password is <%="********"%>
</body>
</html>
代码如上所述,.


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【OkHttp】Android 项目导入 OkHttp ( 配置依赖 | 配置 networkSecurityConfig | 配置 ViewBinding | 代码示例 )(二)
【OkHttp】Android 项目导入 OkHttp ( 配置依赖 | 配置 networkSecurityConfig | 配置 ViewBinding | 代码示例 )(二)
20 0
从 pingcap tidb 学习使用静态检查工具提升代码质量
今天想跟大家简单介绍一下如何使用一些 golang 的静态代码检查工具来提升代码质量! 此博客在 GitHub 上公开发布. 如果您有任何问题或疑问,请在此处打开一个 issue。 简介 从去年接触到 TiDB 就开始尝试在社区帮忙修复一些简单的 Bug。最近,我在阅读代码的过程中发现 TiDB 的代码库中有大量的没有必要的类型转换,我就用 GoLand 分析检查出大部分的无效的类型转化, 然后提了一个 PR (CEO 半夜 review 代码,哈哈哈)修复。在这个 PR 中 zz-jason 大神 评论希望能够通过静态检查工具来检测无效的类型转换。 我经过一些研究,决定使用 uncon
43 0
SAP的代码向www发送http请求的过程
SAP的代码向www发送http请求,这句话像是在搞笑一样。但是仔细想想我们随便打开个浏览器访问个网址,就是在向www发送http请求,这有什么搞笑的呢?SAP既是应用也是开发环境,对外发送个http请求是很正常的。
2031 0
【OkHttp】Android 项目导入 OkHttp ( 配置依赖 | 配置 networkSecurityConfig | 配置 ViewBinding | 代码示例 )(一)
【OkHttp】Android 项目导入 OkHttp ( 配置依赖 | 配置 networkSecurityConfig | 配置 ViewBinding | 代码示例 )(一)
38 0
检查HTTP 的 Basic认证代码示例-JSP
检查HTTP 的 Basic认证. since http1.0 代码如下所示: R U OK? R U OK? . Your Password is 请参考代码中的注释,具体信息,还可以参考《图解HTTP》。
789 0
使用阿里云Serverless函数计算实现HTTP健康检查+故障短信通知
定时对网站/API进行请求,根据请求响应判断服务是否可用,网站是否存在宕机,当发生宕机时,发送短信通知管理员.
1148 0
检查HTTP 的 Digest 认证代码示例-JSP
检查HTTP 的 Digest  认证. since http1.1 代码如下所示:(此代码还不完善, RFC2617算法未实现).
791 0
asp.net mvc应用架构的思考--Unity的应用及三层代码
最近要做一个项目,和国外的架构师聊过之后。对方提到了他准备采用asp.net mvc, jquery, Unity 等技术来代替老的技术: 如asp.net web form. 他请我帮他想一些关于架构的东西。
726 0
SpringBoot 整合 Security(一)实现用户认证并判断返回json还是view
看这篇文章的我默认都认为是有security基本基础的,因为封装的缘故,没有基础的话很容易被绕晕。但是只要认真看,我相信没什么大问题,如果仅仅是会用,该教程让你更熟悉底层实现,更优雅的写代码。
1042 0
+关注
铁锚
Java与数据库开发
271
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载