HttpClient 4.3 - 实现HTTP摘要认证(Digest authentication)

2023-05-16

HttpClient 4 - 实现HTTP摘要认证

  • HttpClient 4 - 实现HTTP摘要认证
    • 什么是摘要认证
    • 用DefaultHttpClient实现
    • HttpClient 4.3 实现

什么是摘要认证

说到摘要认证(Digest authentication)就不得不提基本认证(Basic authentication),在RFC2617中有关于它的描述,摘要认证是一种基于挑战-应答模式的认证模型,用于在HTTP报文交互中,服务端确认客户端身份。

两者具体表现形式是一样的,都是直接访问某个地址,会弹出一个要求用户输入用户名和密码的对话框,只有用户名和密码匹配才能继续访问,摘要认证比基本认证更加安全。

更多摘要认证和基本认证的信息:48.HTTP基本认证与摘要认证

用DefaultHttpClient实现

HttpClient 4.3以前,DefaultHttpClient还没有被Deprecated的时候是没有问题的,实现也很简单:

package com.xx.xx.utils;

import com.sun.istack.internal.Nullable;
import org.apache.commons.lang.StringUtils;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.AuthSchemes;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.auth.DigestSchemeFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import javax.validation.constraints.NotNull;
import java.util.Collections;

/**
 * Create by IntelliJ IDEA
 *
 * @Author chenlei
 * @DateTime 2018/7/11 17:00
 * @Description DigestHttpClientUtil
 */
public class DigestHttpClientUtil {

    public static void main(String[] args){

        HttpClient defaultHttpClient = httpClient();
        HttpClient digestHttpClient = digestHttpClient("stats","stats",null,null);

        HttpGet httpGet = new HttpGet("http://192.168.20.8:6080/");

        try {
            System.out.println("=============no auth=====================");
            System.out.println(EntityUtils.toString(defaultHttpClient.execute(httpGet).getEntity()));
            System.out.println();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            System.out.println("=============digest auth=====================");
            System.out.println(EntityUtils.toString(digestHttpClient.execute(httpGet).getEntity()));
            System.out.println();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static HttpClient digestHttpClient(@NotNull String username, @NotNull String password, @Nullable String host, @Nullable Integer port){
        DefaultHttpClient httpClient = new DefaultHttpClient();
        Credentials credentials = new UsernamePasswordCredentials(username,password);
        httpClient.getCredentialsProvider().setCredentials(
                new AuthScope(StringUtils.isBlank(host) ? AuthScope.ANY_HOST : host, port == null ? AuthScope.ANY_PORT : port),
                credentials
        );
        httpClient.getParams().setParameter(AuthSchemes.DIGEST, Collections.singleton(AuthSchemes.DIGEST));
        httpClient.getAuthSchemes().register(AuthSchemes.DIGEST,new DigestSchemeFactory());

        return httpClient;
    }

    public static HttpClient httpClient(){
        return new DefaultHttpClient();
    }

}

output:

=============no auth=====================
<html><head><title>ProxySQL status page</title></head><body>Access denied</body></html>

=============digest auth=====================
<!DOCTYPE html><head>
<title>ProxySQL Home</title>
...

HttpClient 4.3 实现

HttpClient 4.3以后,DefaultHttpClient已经被列为过时,所以有更好的实现方式:

package com.xx.xx.utils;

import com.sun.istack.internal.Nullable;
import org.apache.commons.lang.StringUtils;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.AuthSchemes;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.auth.DigestSchemeFactory;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import javax.validation.constraints.NotNull;
import java.util.Collections;

/**
 * Create by IntelliJ IDEA
 *
 * @Author chenlei
 * @DateTime 2018/7/11 17:00
 * @Description DigestHttpClientUtil
 */
public class DigestHttpClientUtil {

    public static void main(String[] args){

        HttpClient defaultHttpClient = httpClient();
        HttpClient digestHttpClient = digestHttpClient("stats","stats",null,null);

        HttpGet httpGet = new HttpGet("http://192.168.20.8:6080/");

        try {
            System.out.println("=============no auth=====================");
            System.out.println(EntityUtils.toString(defaultHttpClient.execute(httpGet).getEntity()));
            System.out.println();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            System.out.println("=============digest auth=====================");
            System.out.println(EntityUtils.toString(digestHttpClient.execute(httpGet).getEntity()));
            System.out.println();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static HttpClient digestHttpClient(@NotNull String username, @NotNull String password, @Nullable String host, @Nullable Integer port){
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(new AuthScope(StringUtils.isBlank(host) ? AuthScope.ANY_HOST : host, port == null ? AuthScope.ANY_PORT : port),
                new UsernamePasswordCredentials(username,password));
        return HttpClients.custom().setDefaultCredentialsProvider(credentialsProvider).build();
    }

    public static HttpClient httpClient(){
        return HttpClients.custom().build();
    }

}

output:

=============no auth=====================
<html><head><title>ProxySQL status page</title></head><body>Access denied</body></html>

=============digest auth=====================
<!DOCTYPE html><head>
<title>ProxySQL Home</title>
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HttpClient 4.3 - 实现HTTP摘要认证(Digest authentication) 的相关文章

随机推荐

  • 查看某个进程占用空间大小 VmHWM VmRSS终极总结

    cat proc pid status VmPeak 表示进程所占用最大虚拟内存大小 VmSize 表示进程当前虚拟内存大小 VmLck 表示被锁定的内存大小 VmHWM 表示进程所占用物理内存的峰值 VmRSS 表示进程当前占用物理内存的
  • 冯唐成事心法

    刻意练习 动力 43 技巧 43 清晰的目标 魅力值 聊天的框架思维 缺乏目标感 1 状态 感受 2 联想聊天法 3 问对方去聊自己 窗口 信号 她 自己 我们 聊她是为了聊自己 聊自己是 为了聊我们 状态 感受 边聊边感受 1 舒适感 2
  • edge 兼容性问题解决方案

    Edge浏览器出现兼容性问题且所有页面崩溃 xff0c 包括设置均无法打开并访问的解决方法 百度文库
  • 开core信息

    ulimit c unlimited
  • 制定通信协议

    制定通信协议 一 什么是制定通信协议 xff1f 客户端在和服务器进行通信的时候 xff0c 为了让双方都能辨别接收到的消息的内容 xff0c 由发送方和接收方而制定的相关约定 二 为什么制定通信协议 xff1f 在大型的网络游戏中 xff
  • C++ Primer Plus(嵌入式公开课)---1-3章

    1011 C 43 43 Primer Plus 名词解释数值范围 第1章 预备知识1 1 C 43 43 简介1 2 C 43 43 简史1 2 2 C语言编程原理1 2 3 面向对象编程1 2 4 C 43 43 和泛型编程1 2 5
  • Xilinx的Zynq系列,ARM和PL通过DMA通信时如何保证DDR数据的正确性。

    使用ZYNQ或者MPSoC的好处是可以通过PL逻辑设计硬件加速器 xff0c 对功能进行硬件加速 加速器和ARM之间的交互信息一般包含自定义加速指令传递 待计算数据以及计算结果 这三种交互信息为了实现高性能往往需要使用DMA进行通信 考虑两
  • vscode使用clangd开发c++,实现自动补全功能

    安装 在vscode中安装clangd插件 xff0c 如图所示安装插件 xff0c Enable插件clangd xff1b 如果之前安装过C C 43 43 插件的 xff0c 需要将Disable插件C C 43 43 在命令行安装c
  • 串口高波特率下如何稳定接收

    无论是蓝牙 WiFi xff0c 还是4G 5G xff0c 亦或是其它模组 xff0c 都支持AT指令 43 透传模式 AT指令模式下 xff0c 执行查询指令和操作 设置 指令 响应速度快 xff0c 逻辑交互明确 xff0c 不需要复
  • stm32 串口发送多字节数据(结构体版本)

    话不多说先上代码 typedef struct shuju u8 sj0 帧头 u8 sj1 u8 sj2 u8 sj3 u8 sj4 u8 sj5 u8 sj6 u8 sj7 u8 sj8 u8 sj9 帧尾 shuju 实际使用 shu
  • C++ Primer Plus(第六版)读书笔记

    文章目录 C 43 43 Primer Plus xff08 第六版 xff09 第1章 预备知识第2章 开始学习C 43 43 2 1 进入C 43 43 2 2 1 main 指令 2 2 C 43 43 语句2 2 2 赋值语句 第3
  • STM32 (5) 自己写库 构建库函数雏形1 寄存器结构体定义

    前面把基础部分讲得差不多 xff0c 比如说什么是寄存器 xff0c 寄存器映射 xff0c 怎么样来寄存器编程 xff0c 寄存器编程的时候应该参考官方的什么手册 xff0c 前面讲了什么是寄存器 怎么使用寄存器编程 寄存器编程的时候应该
  • 编译器优化对自定义延时程序的影响(volatile详解实验一)

    由此可见 xff08 C语言volatile关键字详解 xff09 xff0c 编译器优化会对自定义延时程序有影响 xff0c 我们深入汇编程序去探讨产生怎样的影响 xff01 首先是未加 volatie 使用和未使用编译器优化汇编程序的对
  • C语言之大小端转换

    include lt stdio h gt unsigned int reverse byte char c char num unsigned int r 61 0 int i for i 61 0 i lt num i 43 43 r
  • 世界坐标系、相机坐标系和图像坐标系的转换

    相机标定笔记 坐标系转换四个不同类型的坐标系1 世界坐标系2 相机坐标系3 图像物理坐标系4 图像像素坐标系 坐标转换世界坐标 相机坐标 xff08 刚性变换 xff09 绕 X X X 旋转
  • 【C++】strpbrk() 字符串检索函数

    strpbrk 字符串检索函数 需要包含头文件 string h xff1b 声明 span class token keyword char span span class token operator span span class t
  • 干货 | 手把手教你搭建一套OpenStack云平台

    1 前言 今天我们为一位朋友搭建一套OpenStack云平台 我们使用Kolla部署stein版本的OpenStack云平台 kolla是用于自动化部署OpenStack的一个项目 xff0c 它基于docker和ansible来实现 xf
  • 完全卸载nginx的详细步骤

    一个执着于技术的公众号 前言 在开局配置Nginx时有可能会配置错误 xff0c 报各种错误代码 看不懂或者懒得去看这个报错时 xff0c 其实最简单的方式是卸载并重装咯 今天就带大家一起学习下 xff0c 如何彻底卸载nginx程序 卸载
  • Windows 11的这19个新功能,你都知道吗?

    参考资料 xff1a https www windowslatest com 2021 10 06 windows 11 new features everything you need to know Windows 11 是 Windo
  • HttpClient 4.3 - 实现HTTP摘要认证(Digest authentication)

    HttpClient 4 实现HTTP摘要认证 HttpClient 4 实现HTTP摘要认证 什么是摘要认证用DefaultHttpClient实现HttpClient 4 3 实现 什么是摘要认证 说到摘要认证 Digest authe