单点登录——CAS服务端连接mysql自定义密码加密

2023-05-16

目录

1、自定义密码加密分析:

2、单纯密码加密:

(1)引入依赖:

(2)配置cas的jdbc连接信息:

(3)去掉配置的用户名和密码:

(4)定义实体类实现接口:

(5)重写encode方法:

(6)重写matches方法:

(7)启动访问测试:

3、复杂密码加密:

(1)引入依赖:

(2)配置spring的jdbc连接方式:

(3)定义实体类继承handler:

(4)重写authenticate方法:

(5)重写support方法:

(6)定义实体类实现接口:

(7)重写customAuthenticationHandler方法:

(8)配置spring-Boot扫描路径:

(9)启动访问测试:

(10)代码:


1、自定义密码加密分析:

一般真正生产环境使用的用户密码都是需要进行加密处理的,不同项目所用到的密码加密的算法和方式不同。针对自己项目中所用到的密码加密规则进行分析。

如果只是单纯对用户输入的明文密码进行一系列的各种算法加密,并且加密过程中设计的一些自定义变量字符串等都是唯一不变的,那么此方式的自定义密码解密,只需要自定义一个实体类实现PasswordEncode接口,重写encode、matches方法。

如果在对用户输入的明文密码进行加密的时候需要用户名、盐值等动态变化的值,每个用户对应的值不同,并且保存在数据库中的。这种情况如果还是按照上面那样实现PasswordEncode接口重写方法就不行了。需要自定义handler验证方法。这个针对不同的cas服务端版本,代码上差别很大,建议使用本人尝试的5.1.x系列的版本进行搭建服务端肯定没有问题。

2、单纯密码加密:

(1)引入依赖:

注意添加依赖包的位置,应该是在该位置下进行添加的:

开启cas server的rest支持的包:

<!--开启cas server的rest支持-->
				<dependency>
				    <groupId>org.apereo.cas</groupId>
				    <artifactId>cas-server-support-rest</artifactId>
				    <version>${cas.version}</version>
				</dependency>

数据库认证相关的包:

<!--数据库认证相关 start-->
                <dependency>
                    <groupId>org.apereo.cas</groupId>
                    <artifactId>cas-server-support-jdbc</artifactId>
                    <version>${cas.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.apereo.cas</groupId>
                    <artifactId>cas-server-support-jdbc-drivers</artifactId>
                    <version>${cas.version}</version>
                </dependency>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>${mysql.version}</version>
                </dependency>
                <!--数据库认证相关 end-->

(2)配置cas的jdbc连接信息:

由于此种方式的密码加密,只是实现一个接口重写下密码加密方法,因此用cas的jdbc连接。配置application.properties:

cas.authn.jdbc.query[0].sql=SELECT * FROM sys_user WHERE username=?
cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=123456
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].passwordEncoder.type=com.cas.demo.auth.MyUserAuth

(3)去掉配置的用户名和密码:

将application.properties配置文件中配置用户信息去掉:

(4)定义实体类实现接口:

(5)重写encode方法:

(6)重写matches方法:

(7)启动访问测试:

修改完成后,先执行maven的clean清下项目,防止因为缓存影响修改生效,然后启动idea中tomcat,访问输入用户和密码案进行访问测试。正常的话是可以正常登录的。

3、复杂密码加密:

(1)引入依赖:

注意添加依赖包的位置,应该是在该位置下进行添加的:

开启cas server的rest支持的包:

<!--开启cas server的rest支持-->
				<dependency>
				    <groupId>org.apereo.cas</groupId>
				    <artifactId>cas-server-support-rest</artifactId>
				    <version>${cas.version}</version>
				</dependency>

数据库认证相关的包:

<!--数据库认证相关 start-->
                <dependency>
                    <groupId>org.apereo.cas</groupId>
                    <artifactId>cas-server-support-jdbc</artifactId>
                    <version>${cas.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.apereo.cas</groupId>
                    <artifactId>cas-server-support-jdbc-drivers</artifactId>
                    <version>${cas.version}</version>
                </dependency>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>${mysql.version}</version>
                </dependency>
                <!--数据库认证相关 end-->

自定义认证相关的包

<!--自定义认证,重写Credential-->
                <dependency>
                    <groupId>org.apereo.cas</groupId>
                    <artifactId>cas-server-core-webflow</artifactId>
                    <version>${cas.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.apereo.cas</groupId>
                    <artifactId>cas-server-webapp-config</artifactId>
                    <version>${cas.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.apereo.cas</groupId>
                    <artifactId>cas-server-support-validation</artifactId>
                    <version>${cas.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-dbcp2</artifactId>
                    <version>2.3.0</version>
                </dependency>
                <dependency>
                    <groupId>javax.servlet</groupId>
                    <artifactId>javax.servlet-api</artifactId>
                    <version>3.1.0</version>
                </dependency>

(2)配置spring的jdbc连接方式:

由于此种方式的密码加密,是自定义认证方式,因此放弃cas自带的jdbc连接方式,使用spring的jdbc连接方式进行连接数据库。配置application.properties:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

(3)定义实体类继承handler:

自定义一个实体类,继承AbstractPreAndPostProcessingAuthenticationHandler,重写需要的方法直到不报错为止,一般就是:实体类构造方法、authenticate、createHandlerResult、doAuthentication、supports这几个方法。

(4)重写authenticate方法:

重写authenticate的方法体,主要逻辑就是通过jdbc执行sql,通过用户名查询用户表获取各种信息,然后对用户输入的明文密码通过自定义的加密方法进行加密,然后比对自定义加密后的密码与数据库中保存的加密后的密码是否相同。

如果相同,那么就返回createHandlerResult,注意传入的Credential对象要新创建一个,将加密后的密码和用户名传入,默认的密码是用户界面输入的明文密码。

如果不相同,说明认证失败,或者因为其他业务比如:用户禁用、用户逻辑删除等业务,认定用户登录失败的地方,都返回FailedLoginException即可。

(5)重写support方法:

(6)定义实体类实现接口:

上面只是自定义了一个认证实体类,但是cas还不知道使用自定义的认证类,因此需要创建一个实体类实现config接口,注册自定义的认证类。

创建一个配置类,实现AuthenticationEventExecutionPlanConfigurer接口,重写configureAuthenticationExecutionPlan方法:

(7)重写customAuthenticationHandler方法:

创建一个AuthenticationHandler对象:

在customAuthenticationHandler方法体中注册认证器,调用上面自己创建的对象:

(8)配置spring-Boot扫描路径:

SpringFactoriesLoader属于Spring框架私有的一种扩展方案,其主要功能就是从指定的配置文件META-INF/spring.factories加载配置。通过这个方法,我们就能将自定义的认证方法让spring boot 自动配置扫描到。

修改META-INF/spring.factories配置文件,添加自定义的配置实体类的路径,默认的有一个路径,在其后面再添加自己的路径即可,用英文逗号分隔。

(9)启动访问测试:

修改完成后,先执行maven的clean清下项目,防止因为缓存影响修改生效,然后启动idea中tomcat,访问输入用户和密码案进行访问测试。正常的话是可以正常登录的。


(10)代码:

自定义用户认证的实体类代码如下:

package demo.server.cas.auth;

import demo.server.cas.util.PasswordUtil;
import org.apache.commons.lang3.StringUtils;
import org.apereo.cas.authentication.*;
import org.apereo.cas.authentication.handler.support.AbstractPreAndPostProcessingAuthenticationHandler;
import org.apereo.cas.authentication.principal.Principal;
import org.apereo.cas.authentication.principal.PrincipalFactory;
import org.apereo.cas.services.ServicesManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.security.auth.login.FailedLoginException;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

public class MyUserHandler extends AbstractPreAndPostProcessingAuthenticationHandler {

    @Autowired
    private JdbcTemplate jdbcTemplate;


    public MyUserHandler(String name, ServicesManager servicesManager, PrincipalFactory principalFactory, Integer order) {
        super(name, servicesManager, principalFactory, order);
    }

    @Override
    public HandlerResult authenticate(Credential credential) throws GeneralSecurityException, PreventedException {
        //获取当前登录用户的用户名、明文密码
        final UsernamePasswordCredential upssc = (UsernamePasswordCredential) credential;
        final String username = upssc.getUsername();
        final String password = upssc.getPassword();
        String dbPassword = null;
        String salt = null;
        String encodePassword = null;
        try {
            //获取数据库中保存的加密密码,用户必须是未删除、正常状态的,否则就表示系统不允许该用户登录
            String sql = "select password from sys_user where status = '1' and del_flag = '0' and username=?";
            dbPassword = this.jdbcTemplate.queryForObject(
                    sql
                    , String.class, username);
            //如果查询的用户密码不为空,表示该用户正常。
            if(StringUtils.isNotEmpty(dbPassword)){
                //获取数据库中当前用户的加密盐值:salt
                String saltSql = "select salt from sys_user where status = '1' and del_flag = '0' and username=?";
                salt = this.jdbcTemplate.queryForObject(
                        saltSql
                        , String.class, username);
            }else{
                throw new FailedLoginException();
            }
            //使用自定义加密工具类,对用户输入的明文密码进行加密
            encodePassword = PasswordUtil.encrypt(username, password, salt);
        } catch (DataAccessException e) {
            //异常信息不打印,否则用户登录失败后会等好长时间空白页面然后再刷新页面提示认证失败,效果很差
            //e.printStackTrace();
            //有异常表示用户是非正常状态,认证失败
            throw new FailedLoginException();
        }
        //如果通过工具类加密后的密码与数据库中保存的加密密码一致,那么用户就登录成功,将用户名、加密后的密码创建一个Credential对象,传递下去。
        if(StringUtils.isNotEmpty(dbPassword) && StringUtils.isNotEmpty(encodePassword) && dbPassword.equals(encodePassword)){
            Credential newCredentinal =new UsernamePasswordCredential(username,encodePassword);
            return createHandlerResult(newCredentinal, this.principalFactory.createPrincipal(upssc.getUsername(), Collections.emptyMap()), null);
        }else{
            throw new FailedLoginException();
        }
    }

    @Override
    protected HandlerResult createHandlerResult(Credential credential, Principal principal, List<MessageDescriptor> warnings) {
        return super.createHandlerResult(credential, principal, warnings);
    }

    @Override
    protected HandlerResult doAuthentication(Credential credential) throws GeneralSecurityException, PreventedException {
        return null;
    }

    @Override
    public boolean supports(Credential credential) {
        return credential instanceof UsernamePasswordCredential;
    }
}

自定义用户认证的实体类注册配置类代码如下:

package demo.server.cas.auth;

import org.apereo.cas.authentication.AuthenticationEventExecutionPlan;
import org.apereo.cas.authentication.AuthenticationEventExecutionPlanConfigurer;
import org.apereo.cas.authentication.AuthenticationHandler;
import org.apereo.cas.authentication.principal.DefaultPrincipalFactory;
import org.apereo.cas.authentication.principal.PrincipalFactory;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.apereo.cas.services.ServicesManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
//注入自定义的spring的datasource,以便自己可以通过jdbc执行sql
@Import({DataSourceAutoConfiguration.class})
@Configuration("myConfigure")
@EnableConfigurationProperties(CasConfigurationProperties.class)
public class MyConfigure implements AuthenticationEventExecutionPlanConfigurer {

    @Autowired
    @Qualifier("servicesManager")
    private ServicesManager servicesManager;

    @Autowired
    @Qualifier("jdbcPrincipalFactory")
    public PrincipalFactory jdbcPrincipalFactory;

    /**
     * 注册验证器
     *
     * @return
     */
    @Bean
    public AuthenticationHandler customAuthenticationHandler() {
        //优先验证
        return new MyUserHandler("customAuthenticationHandler", servicesManager,new DefaultPrincipalFactory(),1);
    }

    //注册自定义认证器
    @Override
    public void configureAuthenticationExecutionPlan(final AuthenticationEventExecutionPlan plan) {
        plan.registerAuthenticationHandler(customAuthenticationHandler());
    }

}

 

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

单点登录——CAS服务端连接mysql自定义密码加密 的相关文章

  • PyTorch——应用一个已训练好的图片分类网络——AlexNet

    1 识别一个图像主体的预训练网络 ImageNet数据集是由一个Stanford大学维护的包含1400多万幅图像的非常大的数据集 xff0c 所有的图像都用来自WordNet数据集的名词层次结构标记 xff0c 而WordNet数据集又是一
  • 2020-09-19

    假设我们现在对 6 1 2 7 9 3 4 5 10 8 这个10个数进行排序 首先在这个序列中随便找一个数作为基准数 xff08 不要被这个名词吓到了 xff0c 就是一个用来参照的数 xff0c 待会你就知道它用来做啥的了 xff09
  • Pytorch——生成式对抗网络的实例

    1 GAN 生成器的最终目标是要欺骗判别器 xff0c 混淆真伪图像 xff1b 而判别器的目标是发现他何时被欺骗了 xff0c 同时告知生成器在生成图像的过程中可识别的错误 注意无论是判别器获胜还是生成器获胜 xff0c 都不是字面意义上
  • 哈工大面向服务的软件系统 期末开卷提纲

    引言 本课程期末考试为开卷 xff0c 博主2022年期末卷面94 100 xff0c 总分92 9排名第2 82 xff0c 现分享复习提纲以供学弟学妹们参考 本提纲仅供参考 xff0c 切勿进行其他目的的使用 基于2021秋季考试题的思
  • 编译原理——语法制导翻译

    一 概述 语法制导翻译主要是使用上下文无关文法来引导对语言的翻译 语义分析的结果通常就表现为中间代码 xff0c 因此 xff0c 语义分析和中间代码生成在一起称为语义翻译 语法分析的同时直接进行语义分析 xff0c 成为语法制导翻译 将语
  • 关闭指定端口号的进程

    一 引言 做数据库实验 xff0c 端口号8080老被占用 xff0c 导致IDEA Debug模式起不来 二 杀进程 1 查端口号被哪个傻逼进程占用了 netstat ano findstr 34 端口号 34 2 把这个傻逼进程杀掉 t
  • 批处理dos命令深度递归扫描删除指定路径下指定文件夹的内容

    1 先列印将要被清理的指定路径下的所有logs文件夹 2 列印后按任意键继续执行则会删除 如果要扫描其它文件夹名 xff0c 修改批处理中的logs为要清理的文件夹名即可 64 echo off 配置需要扫描清理文件夹的路径 set del
  • 惯性导航系统(INS)与全球卫星定位系统(GPS)

    惯性导航系统 xff08 INS xff09 与全球卫星定位系统 xff08 GPS xff09 来源 xff1a 中国自动化网 作者 xff1a 发表时间 xff1a 2010 06 30 08 26 00 1 摘要 目前飞行器所使用的导
  • 关于git clone的时候,如果他一直提示你You do not have permission to pull from the repository 解决方案

    其实很简单 控制面板 所有控制面板项 凭据管理器 添加普通凭据 git https gitee com 注意地址写这个就好了 用户名 密码就是你的用户名密码
  • 线刷rom时fastboot flash system system.img报错

    我在线刷Nexus9的谷歌官方系统时遇到如下报错 fastboot flash system system img Sending sparse 39 system 39 1 3 501966 KB FAILED Error reading
  • 北京科技大学通用学术英语Mooc作文 大一下(20级版)

    注 xff1a 所选用文章均来自20级学生 xff0c 不是范文 xff0c 仅供参考 xff0c 想拿高分的还是自行动笔为上 xff08 文章整体预估得分区间为85 95 xff09 大一下 U1 an introductory para
  • verilog 学号输入并滚动显示

    TOP module module top input clk100mhz input clr input s input key1 input key2 input key3 input key4 input 2 0 count1 out
  • 生产者消费者模型详解

    生产者消费者模型 文章目录 生产者消费者模型什么是生产者消费者模型基于BlockingQueue的生产者消费者模型单生产者单消费者模型多生产者多消费者模型 什么是生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合
  • Verilog 电子秤设计

    能跑就行系列 仅供参考 xff08 xff09 功能 单次计价 xff1a 输入物品的重量 单价 xff0c 显示物品的总价 xff08 61 重量 单价 xff09 累计计价 xff1a 第一次按下累计按键 xff0c 记住当前物品的总价
  • Verilog 四层电梯设计

    能跑就行系列 描述 xff1a 设计一个4层楼的电梯控制系统 xff0c 完成电梯向上或向下移动到被请求楼层 xff08 假设电梯每移动一层需要1秒 xff09 请求可来自每层楼的呼叫按钮 xff0c 也可来自电梯内的目的楼层选择 当电梯到
  • 北京科技大学 工科物理实验 大二上

    前言 本文由20级学生整理 xff0c 包括实验目的和仪器 实验原理 实验步骤三个部分 主要是想节约一下大家手机拍照扫描 语音输入或手打的时间 xff08 可能有些任课老师要求手写 xff0c 那就爱莫能助了 xff09 使用方法 点击 源
  • 北京科技大学 工科物理实验 大二下

    前言 本文由20级学生整理 xff0c 包括实验目的和仪器 实验原理 实验步骤三个部分 主要是想节约一下大家手机拍照扫描 语音输入或手打的时间 xff08 可能有些任课老师要求手写 xff0c 那就爱莫能助了 xff09 5 4 实验原理部
  • [操作系统]进程同步 Reader-Writer问题 共享缓冲区问题 面包师问题 吸烟者问题

    目录 1 Reader Writer问题 2 共享缓冲区问题 3 面包师问题 4 吸烟者问题 1 Reader Writer问题 多个Reader进程 xff0c 多个Writer进程 xff0c 共享文件F 允许多个Reader进程同时读
  • 北京科技大学 算法分析与设计 计蒜客

    北京科技大学 算法分析与设计 计蒜客平时作业及实验代码 2022年 xff08 仅供参考 xff09 目录 作业一 买房子 USACO Open08 农场周围的道路 国王的魔镜 作业二 蜗牛旅游 NOIP2001 求先序排列 作业三 二分查
  • [JavaScript] 优先队列

    JavaScript 实现优先队列 代码如下 xff1a class Heap constructor cmp 61 a b 61 gt a lt b this arr 61 new Array this cmp 61 a b 61 gt

随机推荐

  • BASH PS1 参数详解

    PS1 xff1a 提示符的设置 PS1 xff08 是数字1而不是字母l xff09 xff0c 每个版本bash的PS1变量内的特殊符号可能有些小的差异 xff0c 你可以先man bash 一下 下面是FC4环境下默认的特殊符号所代表
  • 个人面试经验分享

    九月 十月是收获的季节 xff0c 也是奔波的季节 我也不例外 xff0c 没有特殊的机遇 xff0c 也是经历了一次残酷的海选啊 xff0c 把我经历简单的分享给各位学弟学妹们 我数了一下大概面了六家公司 xff1a 阿里 xff0c 华
  • Row size too large (> 8126)的解决方法

    stackOverflow上的解决方法 首先进行第一步 如果是window系统的话就不是my cnf这个文件的了 xff08 linux才是这个问题 xff09 在window系统是在数据库的安装目录下找到 在后面加上 innodb fil
  • Error:java: 程序包org.apache.ibatis.annotations不存在

    今天配合前端小伙伴做的UI差不多了 xff0c 我也该完善我的后端代码了 xff1b 就在我是用Mybatis generator生成实体对象和mapper之后 xff0c 我启动项目 xff0c 报了一个这样的错误 xff1a Error
  • Mac配置Royal TSX

    破解版 xff1a 链接 https pan baidu com s 1jrX 0ZpXiXRTnYeeTtPzzw 密码 eyyy 一 Royal TSX 介绍 Royal TSX是一款功能非常强大适用于 Mac 的远程连接管理工具 兼容
  • 如何用firefox开发者工具查看元素

    一 浏览器自带工具查看元素 1 选中元素 xff0c 右击选择 Inspect Element 查看元素 2 选择更多 web developer Inspector选择查看器 xff0c 页面上移动鼠标 xff0c 选中元素高亮显示 二
  • Day 2 如何用Chrome开发者工具查看元素和如何获取默认xpath和CSS

    如何用Chrome开发者工具查看元素 方式一 打开更多工具 开发者工具 xff0c 调出开发者模式 xff08 窗口位置可选 xff09 xff0c 移动鼠标可高亮显示元素 方式二 高亮元素 xff0c 右击选中检查调出开发者工具 xff0
  • python字符串

    字符串 字符串格式使用方法更改字符串大小写字符串使用变量字符串使用空白符号strip方法删除字符串前后空白 字符串格式 python格式 xff1a 在python中 xff0c 用双引号或单引号括起来的就是字符串双引号中可以使用单引号 单
  • selenium(一)框架介绍及安装

    1 selenium框架详解 1 1 什么是selenium selenium是一个用于web应用程序测试的工具 xff0c 可以直接在浏览器中运行 xff0c 通过驱动浏览器代替人工完成兼容性测试和功能回归测试 xff0c 支持多浏览器
  • selenium(二)基本命令

    1 基本用法 1 1 初始化浏览器对象 span class token comment 导包 span span class token keyword from span selenium span class token keywor
  • 用c语言实现打印日历

    只要输入年份就能打印出相应的日历 span class hljs preprocessor ifndef MAIN H span span class hljs preprocessor define MAIN H span span cl
  • 网络基础1——TCP/IP协议 数据包的封装与分用

    何为协议 xff1f 通俗来讲 xff0c 协议就是一种约定 xff0c 在具体实施某一事务前双方做好的约定 在网络中 xff0c 约定是由机器语言指定好的 那么 xff0c 只要通信的两台主机 xff0c 约定好协议就可以了吗 xff1f
  • 网络基础3——TCP协议及三次握手四次挥手

    本文讲的是传输层的TCP协议 xff0c 在传输层还有UDP协议 xff0c 其传输过程及报头格式都较简单 xff0c 所以不做过多总结 什么是TCP协议 xff1f 简单来说 xff0c TCP协议就是面向连接的 可靠的 基于字节流的传输
  • Debian lxde 自动登录设置

    个人电脑一直使用debian xff0c 但是每次开机都要输入用户名和密码 xff0c 显得有些繁琐 另外 xff0c 电脑只有我一个人用 xff0c 也不用靠密码来保护什么个人隐私 所以干脆就设置上自动登录 方法 xff1a 修改 etc
  • Java使用Collections查找List中最大值、最小值

    在开发当中 xff0c 有时候我们需要查找List中的最大值 xff0c 最小值 虽然可以自己写代码遍历 xff0c 但是有轮子可用的情况下 xff0c 直接用轮子方便的多 在Java中使用Collections查找List中最大值 最小值
  • linux下启动nginx报错libpcre.so.0 => not found

    在启动nginx时会报错 xff1a xff0c 显示未加载到包组件libpcre so 0 xff0c 但在一开始的安装nginx环境时 xff0c 已经通过命令 yum install y pcre pcre devel 进行安装 xf
  • 微软新Bing全面开放BingChat,无需排队,直接用

    我是卢松松 xff0c 点点上面的头像 xff0c 欢迎关注我哦 xff01 好消息 xff0c 所有人都能上手微软Bing了 微软表示 xff0c 为了感谢大量用户的使用与反馈 xff0c 从今天起新 Bing 不再有候补名单 xff0c
  • redis集群部署及踩过的坑

    本文目标 要在单台机器上搭建Redis集群 xff0c 方式是通过不同的TCP端口启动多个实例 xff0c 然后组成集群 xff0c 同时记录在搭建过程中踩过的坑 安装准备 centos版本 xff1a 6 7 redis版本 xff1a
  • sudo apt install提示缺少安装包时可以进行以下命令

    sudo apt fix broken install xff08 提示有未能满足的依赖关系执行下面命令 xff09
  • 单点登录——CAS服务端连接mysql自定义密码加密

    目录 1 自定义密码加密分析 xff1a 2 单纯密码加密 xff1a xff08 1 xff09 引入依赖 xff1a xff08 2 xff09 配置cas的jdbc连接信息 xff1a xff08 3 xff09 去掉配置的用户名和密