Java服务器授权+授权工具部分代码及思路

2023-11-15

目标:

项目部署到服务器上,需要当前服务器授权后才能正常访问,控制项目授权日期、(某终端/通道)授权数量、用户登录访问菜单权限

注:

授权端:授权工具在自己手里,控制授权,在此我称之为授权工具

被授权端:jar包部署的服务器端,在此我称之为服务器

思路:

使用RSA-2048非对称加密方式,生成两对公钥私钥,公钥加密、私钥解密。

A公钥加密服务器的硬件信息生成机器码,

授权工具端通过上传A私钥文件解密服务器机器码。

获取到服务器硬件信息,再拼接有效日期、终端授权数量、菜单权限,授权工具端通过B公钥加密拼接内容生成授权License文件和授权记录(日志)文件。

服务器通过上传授权License文件,获取授权,使用时,通过B私钥解密并解析服务器硬件信息、有效日期、终端授权数量、菜单权限

步骤:

生成公钥私钥:

import sun.misc.BASE64Encoder;

import java.io.File;
import java.io.IOException;
import java.security.*;

/**
 * @Author: Ocean
 * @Date: 2021/4/7 15:27
 */
public class KeyPairGenarete {
    /** 算法名称 */
    private static final String ALGORITHM = "RSA";
    /** 密钥长度 */
    private static final int KEY_SIZE = 2048;

    public static void main(String[] args) throws Exception {
        // 随机生成一对密钥(包含公钥和私钥)
        KeyPair keyPair = KeyPairGenarete.generateKeyPair();
        // 获取 公钥 和 私钥
        PublicKey pubKey = keyPair.getPublic();
        PrivateKey priKey = keyPair.getPrivate();

        // 保存 公钥 和 私钥
        KeyPairGenarete.saveKeyForEncodedBase64(pubKey, Constants.CLIENTPUBLICKEY_FILEPATH);
        KeyPairGenarete.saveKeyForEncodedBase64(priKey, Constants.CLIENTPRIVATEKEY_FILEPATH);
    }
    /**
     * 随机生成密钥对(包含公钥和私钥)
     * @return
     */
    public static KeyPair generateKeyPair() throws Exception {
        // 获取指定算法的密钥对生成器
        KeyPairGenerator gen = KeyPairGenerator.getInstance(ALGORITHM);

        // 初始化密钥对生成器(指定密钥长度, 使用默认的安全随机数源)
        gen.initialize(KEY_SIZE);

        // 随机生成一对密钥(包含公钥和私钥)
        return gen.generateKeyPair();
    }

    /**
     * 将 公钥/私钥 编码后以 Base64 的格式保存到指定文件
     * @param key
     * @param keyFile
     * @throws IOException
     */
    public static void saveKeyForEncodedBase64(Key key, String keyFile) throws IOException {
        // 获取密钥编码后的格式
        byte[] encBytes = key.getEncoded();

        // 转换为 Base64 文本
        String encBase64 = new BASE64Encoder().encode(encBytes);

        // 保存到文件
        IOUtils.writeFile(encBase64, new File(keyFile));
    }


}

A公钥加密服务器的硬件信息生成机器码、前端通过接口复制机器码:

提供四种硬件信息可以随意选取拼接

package com.vikor.gateway.utils.license;

import org.springframework.beans.factory.annotation.Value;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;

import static com.vikor.gateway.utils.license.Constants.CTClientPublicKey;
import static com.vikor.gateway.utils.license.Constants.CTServerPrivateKey;

/**
 * @Author: Ocean
 * @Date: 2021/3/30 14:54
 */
public class LicenseCode {

    /**
     * 获取机器码
     * @param no 硬件信息
     * @return 加密后的硬件信息
     */
    public static String getApplyCode(String no){
        try {//通过硬件信息+A公钥=加密后的硬件信息
            return RsaKey.Encrypt(no,CTClientPublicKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "缺少生成机器码相关文件";
    }

    /**
     * 拼接硬件信息字符串,用其他方式拼接也可以

     * @return
     */
    public static String getBaseCode(){
        //cpu
        String CPU = getCPUSerial();
        //主板
        String boardSN = getMotherboardSN();

        StringBuilder sb = new StringBuilder(100);
        //硬件信息
        sb.append(CPU).append(",")
                .append(boardSN);
        return sb.toString();
    }

    /**
     * 获取主板序列号
     *
     * @return
     */
    public static String getMotherboardSN() {
        String result = "";
        try {
            File file = File.createTempFile("realhowto", ".vbs");
            file.deleteOnExit();
            FileWriter fw = new FileWriter(file);
            String vbs = "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
                    + "Set colItems = objWMIService.ExecQuery _ \n"
                    + "   (\"Select * from Win32_BaseBoard\") \n"
                    + "For Each objItem in colItems \n"
                    + "    Wscript.Echo objItem.SerialNumber \n"
                    + "    exit for  ' do the first cpu only! \n" + "Next \n";

            fw.write(vbs);
            fw.close();
            Process p = Runtime.getRuntime().exec(
                    "cscript //NoLogo " + file.getPath());
            BufferedReader input = new BufferedReader(new InputStreamReader(p
                    .getInputStream()));
            String line;
            while ((line = input.readLine()) != null) {
                result += line;
            }
            input.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result.trim();
    }

    /**
     * 获取CPU序列号
     *
     * @return
     */
    public static String getCPUSerial() {
        String result = "";
        try {
            File file = File.createTempFile("tmp", ".vbs");
            file.deleteOnExit();
            FileWriter fw = new FileWriter(file);
            String vbs = "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
                    + "Set colItems = objWMIService.ExecQuery _ \n"
                    + "   (\"Select * from Win32_Processor\") \n"
                    + "For Each objItem in colItems \n"
                    + "    Wscript.Echo objItem.ProcessorId \n"
                    + "    exit for  ' do the first cpu only! \n" + "Next \n";
            fw.write(vbs);
            fw.close();
            Process p = Runtime.getRuntime().exec(
                    "cscript //NoLogo " + file.getPath());
            BufferedReader input = new BufferedReader(new InputStreamReader(p
                    .getInputStream()));
            String line;
            while ((line = input.readLine()) != null) {
                result += line;
            }
            input.close();
            file.delete();
        } catch (Exception e) {
            e.fillInStackTrace();
        }
        if (result.trim().length() < 1 || result == null) {
            result = "无CPU_ID被读取";
        }
        return result.trim();
    }
 /**
     * 获取硬盘序列号
     *
     * @param drive
     *            盘符
     * @return
     */
    public synchronized static String getHardDiskSN(String drive) {
        String result = "";
        try {
            File file = File.createTempFile("realhowto", ".vbs");
            file.deleteOnExit();
            FileWriter fw = new FileWriter(file);

            String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n"
                    + "Set colDrives = objFSO.Drives\n"
                    + "Set objDrive = colDrives.item(\""
                    + drive
                    + "\")\n"
                    + "Wscript.Echo objDrive.SerialNumber"; // see note
            fw.write(vbs);
            fw.close();
            Process p = Runtime.getRuntime().exec(
                    "cscript //NoLogo " + file.getPath());
            BufferedReader input = new BufferedReader(new InputStreamReader(p
                    .getInputStream()));
            String line;
            while ((line = input.readLine()) != null) {
                result += line;
            }
            input.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result.trim();
    }
    /**
     * 获取MAC地址
     */
    public static String getMac() {
        try {
            byte[] mac = NetworkInterface.getByInetAddress(InetAddress.getLocalHost()).getHardwareAddress();
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < mac.length; i++) {
                if (i != 0) {
                    sb.append("-");
                }
                String s = Integer.toHexString(mac[i] & 0xFF);
                sb.append(s.length() == 1 ? 0 + s : s);
            }
            return sb.toString().toUpperCase();
        } catch (Exception e) {
            return "";
        }

    }
}

API接口:


import java.io.UnsupportedEncodingException;

import static com.vikor.gateway.utils.license.CheckAuthorizeCode.*;
import static com.vikor.gateway.utils.license.Constants.*;
import static com.vikor.gateway.utils.license.LicenseCode.getApplyCode;
import static com.vikor.gateway.utils.license.LicenseCode.getBaseCode;

/**
 * @Author: Ocean
 * @Date: 2021/3/30 14:54
 */
@Component
@RestController
@Api(tags = "授权")
@RequestMapping(value = "license")
public class LicenseController extends BaseController {

    @Resource
    private LicenseService licenseService;

    //获取硬件信息
    private String code = getBaseCode();

    @GetMapping(value = "/license")
    @ApiOperation(value = "机器码", tags = "授权")
    public AjaxResult applyCode() {
        return success(getApplyCode(code));
    }

用户登录验证授权

系统设置页面展示

 授权工具端通过上传A私钥文件解密服务器机器码

注:用java swing写的小工具代码太多了,就不展示了

 获取到服务器硬件信息,再拼接有效日期、终端授权数量、菜单权限,授权工具端通过B公钥加密拼接内容生成授权License文件和授权记录(日志)文件。

package com.company.java;

import org.apache.commons.codec.digest.DigestUtils;

import java.io.*;
import java.util.Date;

import static com.company.java.Constants.CONF;
import static com.company.java.RsaKey.toHexString;


/**
 * @Author: Ocean
 * @Date: 2021/3/30 14:54
 * 服务端
 */
public class EncoderFile {
    public static Boolean licenseWrite( String applyCode,String licenseDate,int channelNum,String path,String projectName,String projectId,String menuPermission,String isMenuPermission) throws Exception {
        boolean flag = true;
        String filePath = Constants.PATH +"license/"+ projectName +"/"+ Constants.DateFormat.format(new Date());
        //授权文件
        File licenseFile = FileWrite(filePath, Constants.LICENSE_NAME);
        //日志
        File logFile = FileWrite(filePath, Constants.LOG_NAME);
        String Content =
                "项目编码 = "+projectName+",\n" +
                "项目名称 = "+projectId+",\n" +
                "有效日期 = "+licenseDate+",\n" +//2校验日期
                "终端授权数量 = "+channelNum+",\n" + //日期采用yyyy-MM-dd日期
                "菜单权限 = "+menuPermission+",\n" +
                "加密菜单权限文件 = "+isMenuPermission+",\n" +
                "机器码 = "+applyCode;

        //保存授权记录
        mywrite(logFile,Content);

        String string = RsaKey.Decrypt(applyCode,path)+","+licenseDate+","+channelNum+","+menuPermission;
        try {
            string = RsaKey.Encrypt(string, Constants.SERVERPUBLICKEY_FILEPATH);
        } catch (Exception e) {
            flag = false;
            System.out.println("flag"+flag);
            e.printStackTrace();
        }
        mywrite(licenseFile,string);

        if (isMenuPermission.equals("是")){
            byte[] configByte = IOUtils.readFile(new File(CONF)).getBytes("UTF-8");
            String hexString = toHexString(configByte).toUpperCase();
            //配置文件
            File menuFile = FileWrite(filePath, Constants.CONFNAME);
            IOUtils.writeFile(hexString,menuFile);
        }

        System.out.println("flag"+flag);
        return flag;

    }
    
    public static void mywrite(File licenseFile , String write){
        File file = licenseFile;    //1、建立连接
        OutputStream os = null;
        try {
            //2、选择输出流,以追加形式(在原有内容上追加) 写出文件 必须为true 否则为覆盖
            os = new FileOutputStream(file);
            byte[] data = write.getBytes();    //将字符串转换为字节数组,方便下面写入

            os.write(data, 0, data.length);    //3、写入文件
            os.flush();    //将存储在管道中的数据强制刷新出去
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("文件没有找到!");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("写入文件失败!");
        }finally {
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("关闭输出流失败!");
                }
            }
        }
    }

    public static String myread(File licenseFile ){

        StringBuilder sb = new StringBuilder();
        try {
            // 读取字符文件
            BufferedReader in = new BufferedReader(new FileReader(licenseFile));
            try {
                String s;
                while ((s = in.readLine()) != null) {
                    sb.append(s + "\n");
                }
            }finally{
                in.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

    /**
     * 
     * @param filePath
     * @param filename
     * @return
     * @throws Exception
     */
    public static File FileWrite(String filePath,String filename) throws Exception {
        File file = new File(filePath+filename);
        if (!file.exists()) {
            file.getParentFile().mkdirs();
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return file;
    }
}

服务器通过上传授权License文件,获取授权,使用时,通过B私钥解密并解析服务器硬件信息、有效日期、终端授权数量、菜单权限

package com.vikor.gateway.utils.license;

import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;


/**
 * @Author: Ocean
 * @Date: 2021/3/30 14:54
 */
public class CheckAuthorizeCode {
    /**
     * 验证授权方法
     * @param licensePath
     * @return
     * @throws Exception
     */
    public static boolean AuthorizeCode(String licensePath) throws Exception {
        File file = new File(licensePath);
        //获取硬盘信息
        String code = LicenseCode.getBaseCode();
        //读取授权码文件,获取授权码
        String encoder = myread(file).trim();

        //解析授权码,与本机的硬件信息进行比较,这里仅仅只是用的字符串contains方法
        String en = LicenseCode.getPlaintext(encoder);
        String[] split = en.split(",");

        if(!file.exists()){
            return false;
        }

        if(StringUtils.isEmpty(encoder)){
            return false;
        }

        if (!en.contains(code)) {
            return false;
        }

        if (!LicenseDateUtils.authorize_date(split[2])) {
            return false;
        }
        return true;
    }


    public static String myread(File licenseFile ){

        StringBuilder sb = new StringBuilder();
        try {
            // 读取字符文件
            BufferedReader in = new BufferedReader(new FileReader(licenseFile));
            // 为什么单独在这里加上try块而不是直接使用外边的try块?
            // 需要考虑这么一种情况,如果文件没有成功打开,则finally关闭文件会出问题
            try {
                String s;
                while ((s = in.readLine()) != null) {
                    sb.append(s + "\n");
                }
            }finally{
                in.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }
    public static void FileWrite(MultipartFile file, String path) throws Exception {
        File fileW = new File(path);
        if (!fileW.exists()) {
            fileW.getParentFile().mkdirs();
            try {
                fileW.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //获取文件字节数组
        byte [] bytes = file.getBytes();
        //写入指定文件夹
        OutputStream out = new FileOutputStream(fileW);
        out.write(bytes);
    }
}

controll层

    /**
     * 验证授权
     */
    @GetMapping(value = "/checkLicense")
    @ApiOperation(value = "验证授权", tags = "授权")
    public AjaxResult checkLicense() throws Exception {
        if (AuthorizeCode(fileRootPath+LICENSEPATH))
            return success("授权成功");
        return error("授权已到期");
    }

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

Java服务器授权+授权工具部分代码及思路 的相关文章

  • 如何在 Spring Data 中选择不同的结果

    我在使用简单的 Spring Data 查询或 Query 或 QueryDSL 在 Spring Data 中构建查询时遇到问题 如何选择三列 研究 国家 登录 不同的行 并且查询结果将是用户对象类型的列表 Table User Id S
  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • 是否有任何简单(且最新)的 Java 框架可用于在 Swing 应用程序中嵌入电影?

    我正在构建一个小型 Swing 应用程序 我想在其中嵌入一部电影 重要的是 这个应用程序是一个 WebStart 应用程序 并且该库应该能够打包在我启动的 jnlp 中 即 不依赖于本机库 我知道并尝试过 JMF 但我认为与其他框架相比 其
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • ConcurrentHashMap 内部是如何工作的?

    我正在阅读有关 Java 并发性的 Oracle 官方文档 我想知道Collection由返回 public static
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 如何在 Java 中创建接受多个值的单个注释

    我有一个名为 Retention RetentionPolicy SOURCE Target ElementType METHOD public interface JIRA The Key Bug number JIRA referenc
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐

  • 华为云云耀云服务器L实例评测|Linux系统之安装Tomcat

    华为云云耀云服务器L实例评测 Linux系统之安装Tomcat 一 云耀云服务器L实例介绍 1 1 云耀云服务器L实例简介 1 2 云耀云服务器L实例特点 二 Tomcat介绍 2 1 Tomcat简介 2 2 Tomcat特点 三 本次实
  • 可视化技巧:分类问题中的决策面画法 (直观理解plt.contour的用法)

    摘要 通过分类问题中决策面的绘制过程直观理解matplotlib中contour的用法 主要包括对 np meshgrid 和plt contour的直观理解 前言 分类问题中 我们习惯用2维的dmeo做例子 验证算法的有效性 直观的评价方
  • css实现随机颜色,CSS3 一个显示随机颜色的动画

    CSS 语言 CSSSCSS 确定 html body background webkit linear gradient top fff dcf background linear gradient to bottom fff dcf h
  • upload-labs-master靶场 Pass06-10通关秘诀(详解版)

    关数 通关特征 PASS 06 大小写绕过上传 关卡分析 有些程序编写上传点过滤时会过滤常见后缀 黑名单 如php asp aspx jsp phtml等 如果为对上传 后缀进行小写转换 那么我们即可通过文件后缀名大小写方式进行绕过上传we
  • 数据结构之线性结构

    数据结构是计算机存储 组织数据的方式 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合 通常情况下 精心选择的数据结构可以带来更高的运行或者存储效率 数据结构往往同高效的检索算法和索引技术有关 常见的数据结构可分为 线性结构 树形
  • 用docker借助deepo镜像训练深度学习模型

    这里写自定义目录标题 用docker借助deepo镜像训练深度学习模型 Deepo简介 docker hub 地址 安装步骤 运行 用docker借助deepo镜像训练深度学习模型 Deepo简介 deepo是我从网上了解的一个比较全的深度
  • 回想过去几年的编程生活

    17年 我从一所普通的二本学校毕业 抱着对未来无限憧憬的希望踏上社会 3年初中 3年高中 4年大学 一步一步 努力奋斗 终于要开始挣钱了 终于可以独立了 仿佛美好的一切都会来的 记得是16年的是12月 大四上学期 结束 我迫不及待的找了一份
  • (实习)基线检测时遇到的问题

    首先要先清楚什么是基线检测 安全基线其实是系统最低安全要求的配置 常见的安全基线配置标准有ISO270001 等级保护2 0等 企业也可以建立自己的标准 检测的内容 分为三个方面 1 系统存在的安全漏洞 2 系统配置的脆弱性 3 系统状态的
  • ★动态规划(DP算法)详解

    什么是动态规划 动态规划 百度百科 内容太多了不作介绍 重点部分是无后效性 重叠子问题 最优子结构 问S gt P1和S gt P2有多少种路径数 毫无疑问可以先从S开始深搜两次 S gt P1和S gt P2找出所有路径数 但是当这个图足
  • linux上使用libreoffice对文件类型转换

    目录 libreoffice下载与安装 使用 常见问题 libreoffice下载与安装 1 手动下载 https www libreoffice org download download libreoffice type deb x86
  • JVM类加载机制以及类缓存问题的处理

    当一个java项目启动的时候 JVM会找到main方法 根据对象之间的调用来对class文件和所引用的jar包中的class文件进行加载 其步骤分为加载 验证 准备 解析 初始化 使用和卸载 方法区中开辟内存来存储类的运行时数据结构 包括静
  • 安装cvxpy之后,报错The solver GLPK_MI is not installed

    安装cvxpy之后用的时候 报错The solver GLPK MI is not installed 这边我们可以用以下代码查看已经安装的下载器 print cvxpy installed solvers 在安装个cvxopt即可 pip
  • 基于SpringBoot的财务管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SpringBoot 前端 Vue 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mav
  • 解决:com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure(真实有效)

    数据库连接失败 一 例如我在SpringBoot项目中使用了阿里的数据库连接池Driud 有次在启动的时候 会报这样的错 Caused by com mysql cj exceptions CJCommunicationsException
  • 艺术品拍卖爬虫:使用Python抓取艺术品拍卖网站上的拍卖信息与成交价格

    目录 第2部分 爬取艺术品拍卖网站数据 2 1 确定目标网站 2 2 获取页面内容 2 3 解析网页内容
  • 学习编程有必要做笔记吗?

    小编发现W3Cschool的程序员很喜欢记笔记 桌面永远挂着个笔记软件 笔记本也写的密密麻麻的 那么做编程真的有必要做笔记吗 怎么记呢 一起来看下知乎网友怎么说 花生PeA 记不记笔记看情况 比如题主学的HTML CSS PHP 已经有十分
  • 行内元素的默认的横向边距与纵向边距

    行内元素在渲染是会默认添加右侧和底部边距 如果在多个图片排列时这种情况就比较明显 当我们需要在布局上完全无边距的时候就需要去除这些编剧 去除方法就是 在单元元素上添加下面对应的属性去除边距 去除横向边距 x noSpace font siz
  • 梯度下降法解决线性回归

    用梯度下降的优化方法来快速解决线性回归问题 import tensorflow as tf import numpy as np import matplotlib pyplot as plt import os os environ TF
  • 560. Subarray Sum Equals K

    Given an array of integers and an integer k you need to find the total number of continuous subarrays whose sum equals t
  • Java服务器授权+授权工具部分代码及思路

    目标 项目部署到服务器上 需要当前服务器授权后才能正常访问 控制项目授权日期 某终端 通道 授权数量 用户登录访问菜单权限 注 授权端 授权工具在自己手里 控制授权 在此我称之为授权工具 被授权端 jar包部署的服务器端 在此我称之为服务器