liu před 3 roky
rodič
revize
a089f53491

+ 79 - 0
src/main/java/com/example/faceverification/AutoCode.java

@@ -0,0 +1,79 @@
+package com.example.faceverification;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.PackageConfig;
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.po.TableFill;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+import java.util.ArrayList;
+
+/**
+ * @Author: binguo
+ * @Date: 2023/3/30 星期四 15:46
+ * @Description: com.video
+ * @Version: 1.0
+ */
+public class AutoCode {
+    public static void main(String[] args) {
+// 需要构建一个 代码自动生成器 对象
+        AutoGenerator mpg = new AutoGenerator();
+// 配置策略
+// 1、全局配置
+        GlobalConfig gc = new GlobalConfig();
+        String projectPath = System.getProperty("user.dir");
+        gc.setOutputDir(projectPath+"/src/main/java");
+        gc.setAuthor("Liu");
+        gc.setOpen(false);
+        gc.setFileOverride(false); // 是否覆盖
+        gc.setServiceName("%sService"); // 去Service的I前缀
+        gc.setIdType(IdType.ID_WORKER);
+        gc.setDateType(DateType.ONLY_DATE);
+        gc.setSwagger2(true);
+        mpg.setGlobalConfig(gc);
+//2、设置数据源
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://127.0.0.1/face_verification?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
+                dsc.setDriverName("com.mysql.cj.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("root");
+        dsc.setDbType(DbType.MYSQL);
+        mpg.setDataSource(dsc);
+//3、包的配置
+        PackageConfig pc = new PackageConfig();
+        pc.setModuleName("auto");
+        pc.setParent("com.example");
+        pc.setEntity("model");
+        pc.setMapper("mapper");
+        pc.setService("service");
+        pc.setController("controller");
+        mpg.setPackageInfo(pc);
+//4、策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        strategy.setInclude("identity_comparison_record"); // 设置要映射的表名
+                strategy.setNaming(NamingStrategy.underline_to_camel);
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+        strategy.setEntityLombokModel(true); // 自动lombok;
+        strategy.setLogicDeleteFieldName("deleted");
+        // 自动填充配置
+        TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
+        TableFill gmtModified = new TableFill("gmt_modified",
+                FieldFill.INSERT_UPDATE);
+        ArrayList<TableFill> tableFills = new ArrayList<>();
+        tableFills.add(gmtCreate);
+        tableFills.add(gmtModified);
+        strategy.setTableFillList(tableFills);
+        // 乐观锁
+        strategy.setVersionFieldName("version");
+        strategy.setRestControllerStyle(true);
+        strategy.setControllerMappingHyphenStyle(true); //localhost:8080/hello_id_2
+        mpg.setStrategy(strategy);
+        mpg.execute(); //执行
+    }
+}

+ 12 - 0
src/main/java/com/example/faceverification/api/IdentityComparisonRecordControllerAPI.java

@@ -0,0 +1,12 @@
+package com.example.faceverification.api;
+
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@RequestMapping("/api/identity-comparison-record")
+public interface IdentityComparisonRecordControllerAPI {
+
+    @PostMapping("/test")
+    void test(String name,String value);
+
+}

+ 129 - 0
src/main/java/com/example/faceverification/common/RequestWrapper.java

@@ -0,0 +1,129 @@
+package com.example.faceverification.common;
+ 
+import lombok.extern.slf4j.Slf4j;
+ 
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.*;
+import java.nio.charset.Charset;
+ 
+/**
+ *  自定义Request,实现请求体的多次读
+ *
+ * @author wang
+ * @since 2022-05-20
+ **/
+@Slf4j
+public class RequestWrapper extends HttpServletRequestWrapper {
+
+    /**
+     * 存储body数据
+     */
+    private byte[] body;
+ 
+    public RequestWrapper(HttpServletRequest request) throws IOException {
+        super(request);
+ 
+        // 将body数据存储起来
+        String bodyStr = getBodyString(request);
+        body = bodyStr.getBytes(Charset.defaultCharset());
+    }
+ 
+    /**
+     * 获取请求Body
+     *
+     * @param request request
+     * @return String
+     */
+    public String getBodyString(final ServletRequest request) {
+        try {
+            return inputStream2String(request.getInputStream());
+        } catch (IOException e) {
+            log.error("", e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    // 赋值给body字段
+    public void setBody(byte[] body) {
+        this.body = body;
+    }
+ 
+    /**
+     * 获取请求Body
+     *
+     * @return String
+     */
+    public String getBodyString() {
+        final InputStream inputStream = new ByteArrayInputStream(body);
+ 
+        return inputStream2String(inputStream);
+    }
+ 
+    /**
+     * 将inputStream里的数据读取出来并转换成字符串
+     *
+     * @param inputStream inputStream
+     * @return String
+     */
+    private String inputStream2String(InputStream inputStream) {
+        StringBuilder sb = new StringBuilder();
+        BufferedReader reader = null;
+ 
+        try {
+            reader = new BufferedReader(new InputStreamReader(inputStream, Charset.defaultCharset()));
+            String line;
+            while ((line = reader.readLine()) != null) {
+                sb.append(line);
+            }
+        } catch (IOException e) {
+            log.error("", e);
+            throw new RuntimeException(e);
+        } finally {
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (IOException e) {
+                    log.error("", e);
+                }
+            }
+        }
+ 
+        return sb.toString();
+    }
+ 
+    @Override
+    public BufferedReader getReader() throws IOException {
+        return new BufferedReader(new InputStreamReader(getInputStream()));
+    }
+ 
+    @Override
+    public ServletInputStream getInputStream() throws IOException {
+ 
+        final ByteArrayInputStream inputStream = new ByteArrayInputStream(body);
+ 
+        return new ServletInputStream() {
+            @Override
+            public int read() throws IOException {
+                return inputStream.read();
+            }
+ 
+            @Override
+            public boolean isFinished() {
+                return false;
+            }
+ 
+            @Override
+            public boolean isReady() {
+                return false;
+            }
+ 
+            @Override
+            public void setReadListener(ReadListener readListener) {
+            }
+        };
+    }
+}

+ 51 - 0
src/main/java/com/example/faceverification/config/MyBatisPlusConfig.java

@@ -0,0 +1,51 @@
+package com.example.faceverification.config;
+
+import com.baomidou.mybatisplus.core.injector.ISqlInjector;
+import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
+import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+
+@MapperScan("com.example.mapper")
+@EnableTransactionManagement
+@Configuration // 配置类
+public class MyBatisPlusConfig {
+
+    // 注册乐观锁插件
+    @Bean
+    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
+        return new OptimisticLockerInterceptor();
+    }
+
+    // 分页插件
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        return  new PaginationInterceptor();
+    }
+
+    // 逻辑删除组件!
+    @Bean
+    public ISqlInjector sqlInjector() {
+        return new LogicSqlInjector();
+    }
+
+
+    /**
+     * SQL执行效率插件
+     */
+    @Bean
+    public PerformanceInterceptor performanceInterceptor() {
+        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
+        performanceInterceptor.setMaxTime(3000); //ms 设置sql执行的最大时间,如果超过了则不执行
+        performanceInterceptor.setFormat(true);
+        return performanceInterceptor;
+    }
+
+}

+ 47 - 0
src/main/java/com/example/faceverification/config/MyMetaObjectHandlerConfig.java

@@ -0,0 +1,47 @@
+package com.example.faceverification.config;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.reflection.MetaObject;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+
+@Slf4j
+@Component // 一定不要忘记把处理器加到IOC容器中!
+@MapperScan("com.example.faceverification.mapper")
+public class MyMetaObjectHandlerConfig implements MetaObjectHandler {
+    // 插入时的填充策略
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        HttpServletRequest request = getHttpServletRequest();
+        Long user_id = 1L;//request.getHeader("user_id") == null ? "测试" : request.getHeader("user_id");
+        log.info("start insert fill.....");
+        // setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject
+        this.setFieldValByName("createTime",new Date(),metaObject);
+        this.setFieldValByName("updateTime",new Date(),metaObject);
+        this.setFieldValByName("createUser",user_id,metaObject);
+        this.setFieldValByName("updateUser",user_id,metaObject);
+    }
+
+    // 更新时的填充策略
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        HttpServletRequest request = getHttpServletRequest();
+        Long user_id = 1L;
+        log.info("start update fill.....");
+        this.setFieldValByName("updateTime",new Date(),metaObject);
+        this.setFieldValByName("updateUser",user_id,metaObject);
+    }
+
+    private HttpServletRequest getHttpServletRequest() {
+        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
+        ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes;
+        return attributes.getRequest();
+    }
+}

+ 45 - 0
src/main/java/com/example/faceverification/core/AuthHeaderSettingFilter.java

@@ -0,0 +1,45 @@
+package com.example.faceverification.core;
+
+import org.apache.commons.lang3.StringUtils;
+import javax.servlet.*;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.IOException;
+import java.util.Enumeration;
+
+@WebFilter
+public class AuthHeaderSettingFilter implements Filter{
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+        HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper((HttpServletRequest) request) {
+            /**
+             * 当调用request.getHeader("token")时,则获取请求参数中token值并当做Header的值返回
+             * @param name
+             * @return
+             */
+            @Override
+            public String getHeader(String name) {
+                // 先从原本的Request中获取头,如果为空且名字为token,则从参数中查找并返回
+                String superHeader = super.getHeader(name);
+                if("token".equals(name) && StringUtils.isEmpty(superHeader)){
+                    String token = request.getParameter("token");
+                    if (StringUtils.isNotEmpty(token)) {
+                        return token ;
+                    }
+                }
+                return superHeader;
+            }
+        };
+        chain.doFilter(requestWrapper,response);
+    }
+
+    @Override
+    public void destroy() {
+    }
+}

+ 78 - 0
src/main/java/com/example/faceverification/core/JwtAuthenticationInterceptor.java

@@ -0,0 +1,78 @@
+package com.example.faceverification.core;
+
+import org.springframework.boot.configurationprocessor.json.JSONObject;
+import org.springframework.util.StringUtils;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+public class JwtAuthenticationInterceptor implements HandlerInterceptor {
+
+    /**
+     * preHandle:进入到控制器方法之前执行的内容
+     *     boolean:
+     *         true:可以继续执行控制器方法
+     *         false:拦截
+     * posthandler:执行控制器方法之后执行的内容
+     * afterCompletion:响应结束之前执行的内容
+     *///说明
+
+    /**
+     * 解密进参
+     * @param request current HTTP request
+     * @param response current HTTP response
+     * @param handler chosen handler to execute, for type and/or instance evaluation
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        HashMap<Object, Object> map = new HashMap<>();
+
+//       获取所有参数的名字
+        Enumeration<String> parameterNames = request.getParameterNames();
+//      获取所有参数对应的Map,其中key为参数名,value为参数值
+        Map<String, String[]> parameterMap = request.getParameterMap();
+//通过Enumeration的hasMoreElements()方法遍历.再由nextElement()方法获得枚举的值
+        while(parameterNames.hasMoreElements()){
+            String name=parameterNames.nextElement();
+            String value=request.getParameter(name);
+            map.put(name,"666666");
+        }
+        Collections.unmodifiableMap(map);
+
+
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+
+    }
+
+    /**
+     * 加密出参
+     * @param request current HTTP request
+     * @param response current HTTP response
+     * @param handler the handler (or {@link HandlerMethod}) that started asynchronous
+     * execution, for type and/or instance examination
+     * @param ex any exception thrown on handler execution, if any; this does not
+     * include exceptions that have been handled through an exception resolver
+     * @throws Exception
+     */
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+
+    }
+}

+ 25 - 0
src/main/java/com/example/faceverification/core/JwtlnterceptorConfig.java

@@ -0,0 +1,25 @@
+package com.example.faceverification.core;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class JwtlnterceptorConfig implements WebMvcConfigurer {
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        //region
+        //目前测试下来 使用 /**所有的话,response.sendError浏览器获取不到响应的信息
+        //默认拦截所有路径
+        registry.addInterceptor(authenticationInterceptor())
+                .addPathPatterns("/api/**");
+        //endregion
+    }
+
+    @Bean
+    public HandlerInterceptor authenticationInterceptor() {
+        return new JwtAuthenticationInterceptor();
+    }
+}

+ 347 - 0
src/main/java/com/example/faceverification/utils/BaseClass.java

@@ -0,0 +1,347 @@
+package com.example.faceverification.utils;
+
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.ParseException;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.*;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.util.DigestUtils;
+
+import java.io.IOException;
+import java.text.DecimalFormat;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class BaseClass {
+
+    //NVR基本信息
+    //private static String nvrip = "192.168.0.101";//nvr 地址
+    private static String nvrip = "172.22.45.25";//nvr 地址
+
+    private static String nvrport = "80";//nvr端口
+    private static String nvruname = "admin";//登录用户名
+    private static String nvrpwd = "ncjtxy@2021";//登录密码
+    //登录NVR使用的url,三方所有接口调用都需要用到
+    private static String urlString = "/LAPI/V1.0/System/Security/Login";
+
+
+    //报文头相关字段默认值,目前这些值都是写死的,可不用关注;
+    private static String UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0";
+    private static String ContentType = "application/json";
+    private static String AcceptEncoding = "gzip, deflate";
+    private static String AcceptLanguage = "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3";
+    private static String Connection = "Close";
+
+
+    public static String getNvrUrl() {
+        return "http://" + nvrip + ":" + nvrport;
+    }
+
+
+    public static String getNvrName() {
+        return nvruname;
+    }
+
+    public static String getNvrPwd() {
+        return nvrpwd;
+    }
+
+    public static String getLoginUrl() {
+        return "http://" + nvrip + ":" + nvrport + urlString;
+    }
+
+    //拼装报文头,目前LAPI调用,报文头除鉴权信息外,其他都是写死的
+    public static Map getHeadInfo() {
+        Map<String, String> headinfo = new HashMap<String, String>();
+        headinfo.put("User-Agent", UserAgent);
+        headinfo.put("Content-Type", ContentType);
+        headinfo.put("Accept-Encoding", AcceptEncoding);
+        headinfo.put("Accept-Language", AcceptLanguage);
+        headinfo.put("Host", nvrip);
+        headinfo.put("Connection", Connection);
+
+        //三方登录时无需加cookie字段,只有web登录时,需要带
+        //headinfo.put("Cookie", "len=0; WebLoginHandle=10081124");
+
+        return headinfo;
+    }
+
+    //put方法,不带鉴权信息时Authorization参数使用“”(空字符串),不带body时jsonBody使用“”(空字符串)
+    public static CloseableHttpResponse doPut(CloseableHttpClient httpClient, String url, String Authorization, String jsonBody) {
+        //获取报文头,目前LAPI调用,报文头除鉴权信息外,其他都是写死的
+        Map<String, String> headinfo = getHeadInfo();
+
+        //如果有鉴权信息则放入报文头中
+        if (Authorization.indexOf("response") > 0) {
+            headinfo.put("Authorization", Authorization);
+        }
+
+        CloseableHttpResponse httpResponse = null;
+
+        HttpPut httpPut = new HttpPut(url);
+        for (String s : headinfo.keySet()) {
+            httpPut.addHeader(s, headinfo.get(s));
+        }
+        if (!jsonBody.equals("")) {
+            //给httppost对象设置json字符串参数
+            StringEntity httpEntity = new StringEntity(jsonBody, "utf-8");
+
+            //传参
+            httpPut.setEntity(httpEntity);
+        }
+
+        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(6000)// 连接主机服务超时时间
+                .setConnectionRequestTimeout(6000)// 请求超时时间
+                .setSocketTimeout(6000)// 数据读取超时时间
+                .build();
+        try {
+            // 为httpPut实例设置配置
+            httpPut.setConfig(requestConfig);
+            // 执行Put请求得到返回对象
+            httpResponse = httpClient.execute(httpPut);
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return httpResponse;
+    }
+
+
+    public static CloseableHttpResponse doDelete(CloseableHttpClient httpClient, String url, String Authorization, String jsonBody) {
+        //获取报文头,目前LAPI调用,报文头除鉴权信息外,其他都是写死的
+        Map<String, String> headinfo = getHeadInfo();
+
+        //如果有鉴权信息则放入报文头中
+        if (Authorization.indexOf("response") > 0) {
+            headinfo.put("Authorization", Authorization);
+        }
+
+        CloseableHttpResponse httpResponse = null;
+
+        HttpDelete httpDelete = new HttpDelete(url);
+        for (String s : headinfo.keySet()) {
+            httpDelete.addHeader(s, headinfo.get(s));
+        }
+
+        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(6000)// 连接主机服务超时时间
+                .setConnectionRequestTimeout(6000)// 请求超时时间
+                .setSocketTimeout(6000)// 数据读取超时时间
+                .build();
+        try {
+            // 为httpPut实例设置配置
+            httpDelete.setConfig(requestConfig);
+            // 执行Put请求得到返回对象
+            httpResponse = httpClient.execute(httpDelete);
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return httpResponse;
+    }
+
+
+
+    //post方法,Authorization必填
+    public static CloseableHttpResponse doPost(CloseableHttpClient httpClient, String url, String Authorization, String json) {
+        //获取报文头,目前LAPI调用,报文头除鉴权信息外,其他都是写死的
+        Map<String, String> headinfo = getHeadInfo();
+
+        //如果有鉴权信息则放入报文头中
+        if (Authorization.indexOf("response") > 0) {
+            headinfo.put("Authorization", Authorization);
+        }
+
+        CloseableHttpResponse httpResponse = null;
+
+        HttpPost httpPost = new HttpPost(url);
+        for (String s : headinfo.keySet()) {
+            httpPost.addHeader(s, headinfo.get(s));
+        }
+
+        //给httppost对象设置json字符串参数
+        StringEntity httpEntity = new StringEntity(json, "utf-8");
+
+        //传参
+        httpPost.setEntity(httpEntity);
+
+        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(6000)// 连接主机服务超时时间
+                .setConnectionRequestTimeout(6000)// 请求超时时间
+                .setSocketTimeout(6000)// 数据读取超时时间
+                .setConnectionRequestTimeout(10000)//设置连接池申请连接的超时时间,默认-1为无限时间
+                .setConnectTimeout(5000)//设置socket进行3次握手建立连接的超时时间
+                .setSocketTimeout(8000)//设置连接超时时间,即socket读写超时时间
+                .setMaxRedirects(50)//设置最大的redirect次数,默认为50
+                .build();
+        try {
+            // 为httpPost实例设置配置
+            httpPost.setConfig(requestConfig);
+            httpClient = HttpClients.custom()
+                    .setDefaultRequestConfig(requestConfig)
+                    .setMaxConnPerRoute(50)//设individual route连接池中最大的连接数,默认为2
+                    .setMaxConnTotal(500)// 设置global连接池中最大的连接数,默认为20
+                    .setConnectionTimeToLive(-1,TimeUnit.MICROSECONDS)//设置连接池中连接存活时间,默认-1代表无限
+                    .evictIdleConnections(60000,TimeUnit.MILLISECONDS)//开启空袭连接清理线程,设需连接池中连接最
+                    .evictExpiredConnections()//开启过期连接清理线程,过期时间默认为-1,连接使用后由response header
+                    // .setRetryHandler(retryHandler)//设置重试策略,默认3次重试
+                    // .setSSLContext(sslContext)//设需ssl请求上下文
+                    // .setSSLHostnameVerifier(hostnameVerifier)//设置ssl证书cn host name验证策略,默认为验证cn
+                    .build();
+            // 执行Post请求得到返回对象
+            httpResponse = httpClient.execute(httpPost);
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return httpResponse;
+    }
+
+    //get方法,Authorization必填
+    public static CloseableHttpResponse doGet(CloseableHttpClient httpClient, String url, String Authorization) {
+        //获取报文头,目前LAPI调用,报文头除鉴权信息外,其他都是写死的
+        Map<String, String> headinfo = getHeadInfo();
+
+        //如果有鉴权信息则放入报文头中
+        if (Authorization.indexOf("response") > 0) {
+            headinfo.put("Authorization", Authorization);
+        }
+
+        CloseableHttpResponse httpResponse = null;
+
+        HttpGet httpGet = new HttpGet(url);
+        for (String s : headinfo.keySet()) {
+            httpGet.addHeader(s, headinfo.get(s));
+        }
+        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(6000)// 连接主机服务超时时间
+                .setConnectionRequestTimeout(6000)// 请求超时时间
+                .setSocketTimeout(6000)// 数据读取超时时间
+                .build();
+        try {
+            // 为httpGet实例设置配置
+            httpGet.setConfig(requestConfig);
+            // 执行Get请求得到返回对象
+            httpResponse = httpClient.execute(httpGet);
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return httpResponse;
+    }
+
+    //计算cnonce值,cnonce用于鉴权
+    public static String getCnonce() {
+        double d = Math.random();
+//        double d1 = new Date().getTime() / 1000;
+        double d1 = System.currentTimeMillis()/ 1000;
+        double x = d * d1;
+        DecimalFormat df = new DecimalFormat("#");//四舍五入取整
+        return df.format(x);
+    }
+
+    //计算登录报文头中鉴权信息中的response值
+    public static String getAuthRespInfo(String uname, String upwd, String url, String nonce, String cnonce, String reqmode) {
+
+        //计算HA1
+        String str1 = uname + ":" + "NVRDVR" + ":" + upwd;
+        String ha1 = DigestUtils.md5DigestAsHex(str1.getBytes()).toLowerCase();
+        //String ha1 = md5.toMd5(str1).toLowerCase();
+        //计算HA2
+        String str2 = reqmode + ":" + url;
+        String ha2 = DigestUtils.md5DigestAsHex(str2.getBytes()).toLowerCase();
+        //String ha2 = md5.toMd5(str2).toLowerCase();
+        //计算HA3
+        String str3 = ha1 + ":" + nonce + ":" + "00000001" + ":" + cnonce + ":" + "auth" + ":" + ha2;
+        String ha3 = DigestUtils.md5DigestAsHex(str3.getBytes()).toLowerCase();
+        //String ha3 = md5.toMd5(str3).toLowerCase();
+
+        //拼接报文头中的鉴权信息
+        String Authorization = String.format("Digest username=\"%s\", realm=\"NVRDVR\", qop=auth,nonce=\"%s\""
+                + ",algorithm=MD5,cnonce=\"%s\", nc=00000001,uri=\"%s\", response=\"%s\"", uname, nonce, cnonce, url, ha3);
+        return Authorization;
+    }
+
+
+    //正则表达式提取字符串
+    public static String getMatch(String regex, String source) {
+        String rel = "";
+        Pattern pattern = Pattern.compile(regex);
+        Matcher matcher = pattern.matcher(source);
+        while (matcher.find()) {
+            rel = matcher.group(1);
+        }
+        return rel;
+    }
+
+    //获取response中header中字段的值,例如getHeaderinfo(resp,"WWW-Authenticate")从一个resp的报文头中获取WWW-Authenticate的值
+    public static String getHeaderinfo(HttpResponse resp, String keyword) {
+        return resp.getFirstHeader(keyword).getValue();
+
+    }
+
+    //运行,用于测试类正确行用,可以不用关注。
+    public static void main(String[] args) {
+        String cururl = getNvrUrl() + urlString;
+        CloseableHttpClient httpClient = HttpClients.custom().build();
+
+        //不带鉴权信息发送请求,获取nonce
+        CloseableHttpResponse resp = doPut(httpClient, cururl, "", "");
+
+        //从返回中获取nonce值
+        String nonce = getMatch("nonce=\"(.*)\",stale", getHeaderinfo(resp, "WWW-Authenticate"));
+
+        //生成cnonce
+        String cnonce = getCnonce();
+
+        //生成报文头中Authorization字段的值
+        String curAuthorization = getAuthRespInfo(nvruname, nvrpwd, urlString, nonce, cnonce, "PUT");
+        System.out.println("curAuthorization = " + curAuthorization);
+
+        //带鉴权信息再次调用接口
+        CloseableHttpResponse resp2 = doPut(httpClient, cururl, curAuthorization, "");
+        System.out.println("resp2 = " + resp2);
+        HttpEntity entity = resp2.getEntity();
+
+        try {
+            String responString = EntityUtils.toString(entity);
+            //body中返回信息为Succeed,code为0即为登录成功
+            System.out.println(responString);
+        } catch (ParseException | IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } finally {
+            // 关闭相关资源
+            if (null != resp) {
+                try {
+                    resp.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != resp2) {
+                try {
+                    resp2.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != httpClient) {
+                try {
+                    httpClient.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+
+        }
+
+    }
+
+
+}