• Tools
  • css怎么让文字竖着排列?
    p {  writing-mode: vertical-rl;}其中,vertical-rl表示竖排方向为从上至下,文字从右向左排列。还可以使用vertical-lr来实现文字从左向右排列。 需要注意的是,竖排文字在不同浏览器中的效果可能会有所不同,需要进行兼容性测试。writing-mode是CSS3的属性之一,用于控制元素的书写方式,包括从左到右、从右到左、从上到下以及从下到上等多种方式。下面是使用writing-mode属性的方法:语法格式:plaintextCopy codewriting-mode: horizontal-tb | vertical-rl | vertical-lr;属性值:horizontal-tb:表示从左到右,从上到下的水平书写方式,是浏览器默认的书写方式,不需要使用writing-mode属性来指定。vertical-rl:表示从上到下,从右到左的竖直书写方式,即文字顺序是从右向左排列。vertical-lr:表示从上到下,从左到右的竖直书写方式,即文字顺序是从左向右排列。示例代码:/* 将段落中的文字竖排 */p {  writing-mode: vertical-rl;}/* 将div中的文字从下到上竖排 */div {  writing-mode: vertical-lr;}需要注意的是,writing-mode属性可能会影响元素的布局和位置,需要根据实际情况进行调整。
  • JS中find方法的使用
    一:概念find()方法用于查找数组中符合条件的第一个元素,如果没有符合条件的元素,则返回undefined注意: find()对于空数组,函数是不会执行的。 find()并没有改变数组的原始值。二:语法array.find(function(currentValue, index, arr),thisValue)参数callback:必须。为数组中每个元素执行的函数,该函数接受三个参数:currentValue:必须。数组中正在处理的当前元素。index:可选。当前元素的索引值。arr:可选。当前元素所在的数组对象。thisValue:可选。传递给函数的值一般用"this"值。如果这个参数为空,"undefined"会传递给"this"值三:实例1、求数组中第一个大于1的值let arr1 = [1, 2, 3, 4, 5];let num = arr1.find(item => item > 1);console.log(num)  //輸出的結果是22、提取第一个id为1的对象 var arr = [{        id: 1,        name: '张一',        age: 25,        class: '一班'    }, {        id: 1,        name: '张二',        age: 25,        class: '二班'    }, {        id: 2,        name: '张三',        age: 25,        class: '三班'    }]    let obj = arr.find(item => item.id == 1)    console.log(obj);     // 结果:{id: 1, name: '张一', age: 25, class: '一班'}
  • Git操作之 git add 撤销、git commit 撤销
    1、gitadd添加多余文件撤销操作gitresetHEAD后面什么都不跟的,就是上一次add里面的内容全部撤销gitresetHEADXXX后面跟文件名,就是对某个文件进行撤销2、gitcommit撤销操作gitreset--softHEAD^ 这样就成功的撤销了commit操作注意,仅仅是撤回commit操作,您写的代码仍然保留。gitreset其他参数说明:--mixed 意思是:不删除工作空间改动代码,撤销commit,并且撤销gitadd.操作这个为默认参数,gitreset--mixedHEAD^和gitresetHEAD^效果是一样的。--soft 不删除工作空间改动代码,撤销commit,不撤销gitadd. --hard删除工作空间改动代码,撤销commit,撤销gitadd. 注意完成这个操作后,就恢复到了上一次的commit状态。commit注释写错了,只是想改一下注释,只需要:gitcommit--amend此时会进入默认vim编辑器,修改注释完毕后保存就好了。原文链接:https://blog.csdn.net/w958796636/article/details/53611133
  • Thymeleaf在html中的输出
    thymeleaf在页面中输出格式th:field,其中filed是各标签中的属性1、在table中遍历List     //输出序列号    序号    //输出变量值    代码    //点击事件,渲染结果οnclick="edit('23')"    >编辑2、if-else可以使用switch-case来实现     true    false 3、js中赋值    var msg = [[${msg}]];注:${}中的变量都是从后台传入的,在SpringMVC中:ModelAndViewmav=newModelAndView("/pagepath");mav.addObject("msg","error");4、thymeleaf中输出html标签使用th:utextWelcome to our grocery store!//效果:Welcome to our fantastic grocery store!————————————————版权声明:本文为CSDN博主「houjguang」的原创文章
  • js复制字符串内容到剪切板
    可以使用JavaScript的execCommand()方法来实现复制字符串内容到剪切板的功能,具体实现方法如下:1. 创建一个元素,将要复制的字符串内容赋值给该元素的value属性;2. 将该元素添加到文档中;3. 使用execCommand()方法执行“复制”操作;4. 移除该元素。复制字符串采用临时添加一个元素,模拟选中内容进行选中的方式进行复制,复制后移除临时添加的元素即可。Javascript代码:// 创建元素用于复制var el = document.createElement('textarea');// 将字符串放入元素中el.value = text;// 设置元素不可见el.setAttribute('readonly', '');el.style = {position: 'absolute', left: '-9990009px'};document.body.appendChild(el);// 选中元素el.select();// 复制内容document.execCommand('copy');// 移除元素document.body.removeChild(el);alert('复制成功')
  • jquery上传图片
    jQuery提供了一个简单的方法来实现图片上传,可以使用Ajax来实现。可以使用jQuery的Ajax方法来实现图片上传,具体步骤如下:1. 创建一个FormData对象,将图片文件添加到FormData对象中。2. 使用jQuery的Ajax方法发送FormData对象到服务器端。 3. 在服务器端处理图片文件,将图片文件保存到指定的位置。 4. 返回上传成功的信息给客户端。代码示例// 创建FormData对象var formData = new FormData();// 添加图片文件到FormData对象中formData.append('file', $('#fileInput')[0].files[0]);// 使用jQuery的Ajax方法发送FormData对象到服务器端$.ajax({    url: 'upload.php',    type: 'POST',    data: formData,    processData: false,    contentType: false,    success: function (data) {        // 上传成功后的操作    }});
  • js location对象详解
    Location对象属性属性描述hash获取网址后面的锚部分,#号开始的urlhost返回一个URL的主机名和端口hostname返回URL的主机名href返回完整的URLpathname返回的URL路径名。port返回一个URL服务器使用的端口号protocol设置或返回当前URL的协议,取值为‘http:’,’https:’,’file:’等等。search设置或返回从问号(?)开始的URL(查询部分)。Location对象方法方法说明assign()载入一个新的文档reload()重新载入当前文档replace()用新的文档替换当前文档注window.location.assign(url)加载 URL 指定的新的 HTML 文档。就相当于一个链接,跳转到指定的url,当前页面会转为新页面内容,可以点击后退返回上一个页面。window.location.replace(url)通过加载 URL 指定的文档来替换当前文档,这个方法是替换当前窗口页面,前后两个页面共用一个窗口,所以是没有后退返回上一页的
  • css实现按钮点击水波纹效果和两边扩散效果
    点击查看代码                Document            .btn,        .btn2 {            position: relative;            width: 150px;            height: 60px;            background: #409eff;            outline: 0;            border: none;            padding: 12px 20px;            overflow: hidden;            color: #fff;        }        .btn::before,        .btn2::before {            content: '';            display: block;            position: absolute;            width: 100%;            height: 100%;            left: 0;            top: 0;            transition: 0.2s;            background: #fff;            opacity: 0;        }        .btn:active::before,        .btn2:active::before {            opacity: 0.2;        }        .btn::after {            content: '';            display: block;            position: absolute;            width: 200%;            height: 100%;            left: var(--x, 0);            top: var(--y, 0);            background-image: radial-gradient(circle, #fff 10%, transparent 10.01%);            background-repeat: no-repeat;            background-position: 50%;            transform: translate(-50%, -50%) scale(10);            opacity: 0;            transition: transform 0.8s, opacity 0.8s;        }        .btn:active::after {            transform: translate(-50%, -50%) scale(0);            opacity: 0.3;            transition: 0s;        }        .btn2::after {            content: '';            display: block;            position: absolute;            background: rgb(255, 255, 255, 0.7);            left: 0;            top: 0;            right: 0;            bottom: 0;            opacity: 0;            transition: all 0.8s, opacity 0.8s;        }        .btn2:active::after {            left: var(--l, 0);            right: var(--r, 0);            opacity: 0.3;            transition: 0s;        }            水波纹散开        两边散开    (() => {        const el = document.querySelector('.btn');        el.addEventListener('mousedown', e => {            const { left, top } = el.getBoundingClientRect();            el.style = `--x:${e.clientX - left}px;--y:${e.clientY - top}px`;        });        const el2 = document.querySelector('.btn2');        el2.addEventListener('mousedown', e => {            const { left, right } = el2.getBoundingClientRect();            el2.style = `--l:${e.clientX - left}px;--r:${right - e.clientX}px`;        });    })();原理,通过监听按下事件,获取到点击坐标,将获取到的坐标通过style代入到自定义变量中,css中写入相关样式,引用伪元素,只需改变点击坐标点即可总结,网上水波纹的例子有许多,但很多都不完善,如连续点击后水波纹会失效,本文已优化,并通过自定义css变量来实现,相对于较简单
  • AES加密详解
    文章目录推荐AES简介对称加密加密模式填充模式常见填充模式PKCS5Padding到底是什么?偏移量字符集实际工作中的加密流程AES加密/解密注意的问题实战AES加解密AES默认实现类AES随机加密推荐AES加密—详解RSA加密—详解AES简介DES全称为DataEncryptionStandard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS)AES密码学中的高级加密标准(AdvancedEncryptionStandard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(DataEncryptionStandard),已经被多方分析且广为全世界所使用。为什么DES被废弃?我们知道数据加密标准(DataEncryptionStandard:DES)的密钥长度是56比特,因此算法的理论安全强度是2的56次方。但二十世纪中后期正是计算机飞速发展的阶段,元器件制造工艺的进步使得计算机的处理能力越来越强,DES将不能提供足够的安全性。简单来说,DES标准的秘钥长度要求太短,安全性不够。为什么AES算法被称为Rijndael算法?1997年1月2号,美国国家标准技术研究所(NationalInstituteofStandardsandTechnology:NIST)宣布希望征集高级加密标准(AdvancedEncryptionStandard:AES)[3],用以取代DES。AES得到了全世界很多密码工作者的响应,先后有很多人提交了自己设计的算法。最终有5个候选算法进入最后一轮:Rijndael,Serpent,Twofish,RC6和MARS,下图分别为其中的5位作者。最终经过安全性分析、软硬件性能评估等严格的步骤,Rijndael算法获胜。为什么AES算法安全性高?AES的区块长度固定为128位,密钥长度则可以是128bit,192bit或256位bit。换算成字节长度,就是密码必须是16个字节,24个字节,32个字节。AES密码的长度更长了,破解难度就增大了,所以就更安全。对称加密对称加密:也就是加密秘钥和解密秘钥是一样的。非对称加密:也就是加密秘钥和解密秘钥是不一样的。AES是对称加密算法,优点:加密速度快;缺点:如果秘钥丢失,就容易解密密文,安全性相对比较差RSA是非对称加密算法,优点:安全;缺点:加密速度慢AES加密需要:明文+密钥+偏移量(IV)+密码模式(算法/模式/填充)AES解密需要:密文+密钥+偏移量(IV)+密码模式(算法/模式/填充)AES的算法模式一般为AES/CBC/PKCS5Padding加密模式AES的加密模式有以下几种电码本模式(ECB)密码分组链接模式(CBC)计算器模式(CTR)密码反馈模式(CFB)输出反馈模式(OFB)密码分组链接模式(CBC):将整段明文切成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。电码本模式ECB(Electroniccodebook,ECB):需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。根据图示,在CBC模式下,使用AES加解密方式进行分组加解密时,需要用到的两个参数1、初始化向量,也就是偏移量2、加解密秘钥填充模式如电子密码本(ECB)和密文块链接(CBC)。为对称密钥加密设计的块密码工作模式要求输入明文长度必须是块长度的整数倍,因此信息必须填充至满足要求。常见填充模式算法/模式/填充16字节加密后数据长度不满16字节加密后长度AES/CBC/NoPadding16不支持AES/CBC/PKCS5Padding3216AES/CBC/ISO10126Padding3216AES/CFB/NoPadding16原始数据长度AES/CFB/PKCS5Padding3216AES/CFB/ISO10126Padding3216AES/ECB/NoPadding16不支持AES/ECB/PKCS5Padding3216AES/ECB/ISO10126Padding3216AES/OFB/NoPadding16不支持AES/OFB/PKCS5Padding3216AES/OFB/ISO10126Padding3216AES/PCBC/NoPadding16不支持AES/PCBC/PKCS5Padding3216AES/PCBC/ISO10126Padding3216PKCS5Padding到底是什么?为什么JAVA里指定算法时,写的是AES/CBC/PKCS5Padding,每个都是什么含义,又有什么作用。AES,加解密算法CBC,数据分组模式PKCS5Padding,数据按照一定的大小进行分组,最后分剩下那一组,不够长度,就需要进行补齐,也可以叫补齐模式简单的说:拿到一个原始数据以后,首先需要对数据进行分组,分组以后如果长度不满足分组条件,需要进行补齐,最后形成多个分组,在使用加解密算法,对这多个分组进行加解密。所以这个过程中,AES,CBC,PKCS5Padding缺一不可。在对数据进行加解密时,通常将数据按照固定的大小(blocksize)分成多个组,那么随之就产生了一个问题,如果分到最后一组,不够一个blocksize了,要怎么办?此时就需要进行补齐操作。补齐规则:Thevalueofeachaddedbyteisthenumberofbytesthatareadded,i.e.Nbytes,eachofvalueNareadded.举例:36位的UUID,如果按照blocksize=16字节(即128比特),那么就需要补齐到48位,差12个字节。那么最后填充的12个字节的内容,都是字节表示的0x0c(即12)。偏移量偏移量的添加一般是为了增加AES加密的复杂度,增加数据的安全性。一般在AES_256中会使用到偏移量,而在AES_128加密中不会使用到。字符集在AES加密中,特别也要注意到字符集的问题。一般用到的字符集是utf-8和gbk。实际工作中的加密流程在实际的工作中,客户端跟服务器交互一般都是字符串格式,所以一个比较好的加密流程是:加密流程:明文通过密钥(有时也需要偏移量),利用AES加密算法,然后通过Base64转码,最后生成加密后的字符串。解密流程:加密后的字符串通过密钥(有时也需要偏移量),利用AES解密算法,然后通过Base64转码,最后生成解密后的字符串。AES加密/解密注意的问题AES加密/解密的时候,通常是用在服务端和客户端通讯的过程中,一端加密传输,另一端解密使用。虽然AES加密看似简单,但在使用过程过程中,仍然会出现在一端加密ok,但是另一端解密失败的情况。一旦出现AES解密失败,我们可以通过以下几个方面进行排查:1. AES 加密/解密 使用相同的密钥2. 若涉及到偏移量,则AES 加密/解密 使用的偏移量要一样3. AES 加密/解密 要使用相同加密数位,如都使用`AES_256`4. AES 加密/解密 使用相同的字符集5. AES 加密/解密 使用相同的加密,填充模式,如都使用`AES/CBC/PKCS5Padding`模式6. 由于不同开发语言(如C 和 Java)及不同开发环境(如 Java 和 Android)的影响,可能相同的加解密算法在实现上出现差异,若你们注意到这个差异,就可能导致加解密出现问题123456最后,当我们需要验证自己的AES解密算法是否与别人的加密方法为一套的时候。可以让加密方发你一份加密后的密文和加密前的明文,然后你用密文解密,看解密结果和加密方发你的是否一致。需要注意的是,加密方给你的明文要尽量简洁,如就中国二字,这样既能看出加密方和解密方的字符集是否一致,而且能避免复制粘贴等环节出现空格,回车等转义字符对验证结果的干扰。实战AES加解密首先定义加密、解密工具类import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import java.io.IOException;import java.security.GeneralSecurityException;/** * AES加解密工具类 */public class AES {    /**     * AES加密     *     * @param key     * @param iv     * @throws GeneralSecurityException     * @throws IOException     */    public static byte[] encryptAes(byte[] data, byte[] key, byte[] iv)            throws GeneralSecurityException, IOException {        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));        return cipher.doFinal(data);    }    /**     * AES解密     *     * @param key     * @param iv     * @return     * @throws GeneralSecurityException     * @throws IOException     */    public static byte[] decryptAesToByteString(byte[] data, byte[] key, byte[] iv)            throws GeneralSecurityException, IOException {        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));        return cipher.doFinal(data);    }}12345678910111213141516171819202122232425262728293031323334353637383940414243加密和解密的代码很像,唯一的不同点是,加密Cipher.ENCRYPT_MODE,解密用的是Cipher.DECRYPT_MODE下面我们写一个测试代码:        try {            //加密密码            String key = "zhaoyanjunzhaoy1";            //偏移量            String iv = "1234567890123456";            String message = "今天是周二,我好开心";            //加密            byte[] encryResult = AES.encryptAes(message.getBytes(), key.getBytes(), iv.getBytes());            //解密            byte[] decryResult = AES.decryptAesToByteString(encryResult, key.getBytes(), iv.getBytes());            System.out.println("解密数据 = " + new String(decryResult));        } catch (IOException | GeneralSecurityException e) {            e.printStackTrace();        }123456789101112131415161718输出结果:解密数据 = 今天是周二,我好开心1可以看到数据已经正常解密了。AES默认实现类不带模式和填充来获取AES算法的时候,其默认使用AES/ECB/PKCS5Padding(输入可以不是16字节,也不需要填充向量),所以不需要偏移量参数Cipher cipher = Cipher.getInstance("AES");1我下面封装一个工具类import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.io.IOException;import java.security.GeneralSecurityException;/** * AES加解密工具类 */public class AES {    /**     * AES加密     *     * @param key     * @throws GeneralSecurityException     */    public static byte[] encryptAes(byte[] data, byte[] key) throws GeneralSecurityException {        Cipher cipher = Cipher.getInstance("AES");        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"));        return cipher.doFinal(data);    }    /**     * AES解密     *     * @param key     * @return     * @throws GeneralSecurityException     * @throws IOException     */    public static byte[] decryptAesToByteString(byte[] data, byte[] key)            throws GeneralSecurityException, IOException {        Cipher cipher = Cipher.getInstance("AES");        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"));        return cipher.doFinal(data);    }}12345678910111213141516171819202122232425262728293031323334353637测试代码public class T2 {    public static void main(String[] args) {        try {            //加密密码            String key = "zhaoyanjunzhaoy1";            //加密正文            String message = "今天是周二,我好开心";            //加密            byte[] encryResult = AES.encryptAes(message.getBytes(), key.getBytes());            //解密            byte[] decryResult = AES.decryptAesToByteString(encryResult, key.getBytes());            System.out.println("解密数据 = " + new String(decryResult));        } catch (IOException | GeneralSecurityException e) {            e.printStackTrace();        }    }}12345678910111213141516171819202122测试结果解密数据 = 今天是周二,我好开心1AES随机加密在上面的例子中,我们在AES加密中,需要指定规定长度的密码,偏移量。在Java中还给我们提供了KeyGenerator类来随机生成一个密码和偏移量,解决了我们动脑想密码的问题。我们来看看随机加密怎么用。 /**     * AES加密/解密     *     * @throws GeneralSecurityException     */    public void encryptAes() throws GeneralSecurityException {        //原始数据        String message = "今天是周四,好开心哦";        byte[] data = message.getBytes();        //指定加密类型        KeyGenerator keygen = KeyGenerator.getInstance("AES");        //指定秘钥长度        keygen.init(256);        SecretKey secretKey = keygen.generateKey();        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");        cipher.init(Cipher.ENCRYPT_MODE, secretKey);        //获取秘钥        byte[] key = secretKey.getEncoded();        //获取偏移量        byte[] iv = cipher.getIV();        //解密数据        byte[] ciphertext = cipher.doFinal(data);        //解密数据        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));        byte[] decryMessage = cipher.doFinal(ciphertext);        System.out.println("解密数据 = " + new String(decryMessage));    }123456789101112131415161718192021222324252627282930313233这种加密key,iv都是随机产生的,每次加密后的密文都不一样,适合一定的特殊场景。随机是怎么发生的,我们就看cipher.init(Cipher.ENCRYPT_MODE, secretKey);1在init方法的时候,JceSecurity.RANDOM产生随机数,源码如下:   public final void init(int opmode, Key key) throws InvalidKeyException {        init(opmode, key, JceSecurity.RANDOM);    }123具体细节就不看了,知道原理就行。
  • mysql权限详解
    目录User表 1.范围列(或用户列)host:表示连接类型user:表示用户名,同一用户通过不同方式链接的权限是不一样的。password:密码2.权限列Grant_privShutdown_privSuper_privExecute_privSelect_priv,Insert_priv等3.安全列4.资源控制列db表1.用户列2.权限列tables_priv表和columns_priv表procs_priv表MySQL服务器通过权限表来控制用户对数据库的访问,权限表存在在mysql数据库中。这些权限表是最重要的是`user``db``tables_priv``columns_priv``procs_priv`等。在MySQL启动时,服务器将这些数据表中的权限信息读入内存。上文中提到的mysql数据库是:进去看看:use mysql;show tables;User表  user表是MySQL中最重要的一个权限表,记录用户账号和权限信息: desc user;+------------------------+-----------------------------------+------+-----+-----------------------+-------+| Field                  | Type                              | Null | Key | Default               | Extra |+------------------------+-----------------------------------+------+-----+-----------------------+-------+| Host                   | char(60)                          | NO   | PRI |                       |       || User                   | char(32)                          | NO   | PRI |                       |       || Select_priv            | enum('N','Y')                     | NO   |     | N                     |       || Insert_priv            | enum('N','Y')                     | NO   |     | N                     |       || Update_priv            | enum('N','Y')                     | NO   |     | N                     |       || Delete_priv            | enum('N','Y')                     | NO   |     | N                     |       || Create_priv            | enum('N','Y')                     | NO   |     | N                     |       || Drop_priv              | enum('N','Y')                     | NO   |     | N                     |       || Reload_priv            | enum('N','Y')                     | NO   |     | N                     |       || Shutdown_priv          | enum('N','Y')                     | NO   |     | N                     |       || Process_priv           | enum('N','Y')                     | NO   |     | N                     |       || File_priv              | enum('N','Y')                     | NO   |     | N                     |       || Grant_priv             | enum('N','Y')                     | NO   |     | N                     |       || References_priv        | enum('N','Y')                     | NO   |     | N                     |       || Index_priv             | enum('N','Y')                     | NO   |     | N                     |       || Alter_priv             | enum('N','Y')                     | NO   |     | N                     |       || Show_db_priv           | enum('N','Y')                     | NO   |     | N                     |       || Super_priv             | enum('N','Y')                     | NO   |     | N                     |       || Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N                     |       || Lock_tables_priv       | enum('N','Y')                     | NO   |     | N                     |       || Execute_priv           | enum('N','Y')                     | NO   |     | N                     |       || Repl_slave_priv        | enum('N','Y')                     | NO   |     | N                     |       || Repl_client_priv       | enum('N','Y')                     | NO   |     | N                     |       || Create_view_priv       | enum('N','Y')                     | NO   |     | N                     |       || Show_view_priv         | enum('N','Y')                     | NO   |     | N                     |       || Create_routine_priv    | enum('N','Y')                     | NO   |     | N                     |       || Alter_routine_priv     | enum('N','Y')                     | NO   |     | N                     |       || Create_user_priv       | enum('N','Y')                     | NO   |     | N                     |       || Event_priv             | enum('N','Y')                     | NO   |     | N                     |       || Trigger_priv           | enum('N','Y')                     | NO   |     | N                     |       || Create_tablespace_priv | enum('N','Y')                     | NO   |     | N                     |       || ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |                       |       || ssl_cipher             | blob                              | NO   |     | NULL                  |       || x509_issuer            | blob                              | NO   |     | NULL                  |       || x509_subject           | blob                              | NO   |     | NULL                  |       || max_questions          | int(11) unsigned                  | NO   |     | 0                     |       || max_updates            | int(11) unsigned                  | NO   |     | 0                     |       || max_connections        | int(11) unsigned                  | NO   |     | 0                     |       || max_user_connections   | int(11) unsigned                  | NO   |     | 0                     |       || plugin                 | char(64)                          | NO   |     | mysql_native_password |       || authentication_string  | text                              | YES  |     | NULL                  |       || password_expired       | enum('N','Y')                     | NO   |     | N                     |       || password_last_changed  | timestamp                         | YES  |     | NULL                  |       || password_lifetime      | smallint(5) unsigned              | YES  |     | NULL                  |       || account_locked         | enum('N','Y')                     | NO   |     | N                     |       |+------------------------+-----------------------------------+------+-----+-----------------------+-------+这些字段可以分成4类,分别是范围列(或用户列)、权限列、安全列和资源控制列。1.范围列(或用户列)host:表示连接类型 %表示所有远程通过TCP方式的连接 IP地址如(192.168.1.2、127.0.0.1)通过制定ip地址进行的TCP方式的连接 机器名通过制定网络中的机器名进行的TCP方式的连接 ::1IPv6的本地ip地址,等同于IPv4的127.0.0.1 localhost本地方式通过命令行方式的连接,比如mysql-uxxx-pxxx方式的连接user:表示用户名,同一用户通过不同方式链接的权限是不一样的。password:密码所有密码串通过password(明文字符串)生成的密文字符串。MySQL8.0在用户管理方面增加了角色管理,默认的密码加密方式也做了调整,由之前的SHA1改为了SHA2不可逆。同时加上MySQL5.7的禁用用户和用户过期的功能,MySQL在用户管理方面的功能和安全性都较之前版本大大的增强了。mysql5.7及之后版本的密码保存到authentication_string字段中不再使用password字段。2.权限列Grant_priv表示是否拥有GRANT权限Shutdown_priv表示是否拥有停止MySQL服务的权限Super_priv表示是否拥有超级权限Execute_priv表示是否拥有EXECUTE权限。拥有EXECUTE权限,可以执行存储过程和函数Select_priv,Insert_priv等为该用户所拥有的权限3.安全列安全列只有6个字段,其中两个是ssl相关的(ssl_type、ssl_cipher),用于加密;两个是x509相关的(x509_issuer、x509_subject),用于标识用户;另外两个Plugin字段用于验证用户身份的插件,该字段不能为空。如果该字段为空,服务器就使用内建授权验证机制验证用户身份。4.资源控制列资源控制列的字段用来限制用户使用的资源,包含4个字段,分别为: max_questions,用户每小时允许执行的查询操作次数; max_updates,用户每小时允许执行的更新操作次数; max_connections,用户每小时允许执行的连接操作次数; max_user_connections,用户允许同时建立的连接次数。查看字段:desc mysql.user;+------------------------+-----------------------------------+------+-----+-----------------------+-------+| Field                  | Type                              | Null | Key | Default               | Extra |+------------------------+-----------------------------------+------+-----+-----------------------+-------+| Host                   | char(60)                          | NO   | PRI |                       |       || User                   | char(32)                          | NO   | PRI |                       |       || Select_priv            | enum('N','Y')                     | NO   |     | N                     |       || Insert_priv            | enum('N','Y')                     | NO   |     | N                     |       || Update_priv            | enum('N','Y')                     | NO   |     | N                     |       || Delete_priv            | enum('N','Y')                     | NO   |     | N                     |       || Create_priv            | enum('N','Y')                     | NO   |     | N                     |       || Drop_priv              | enum('N','Y')                     | NO   |     | N                     |       || Reload_priv            | enum('N','Y')                     | NO   |     | N                     |       || Shutdown_priv          | enum('N','Y')                     | NO   |     | N                     |       || Process_priv           | enum('N','Y')                     | NO   |     | N                     |       || File_priv              | enum('N','Y')                     | NO   |     | N                     |       || Grant_priv             | enum('N','Y')                     | NO   |     | N                     |       || References_priv        | enum('N','Y')                     | NO   |     | N                     |       || Index_priv             | enum('N','Y')                     | NO   |     | N                     |       || Alter_priv             | enum('N','Y')                     | NO   |     | N                     |       || Show_db_priv           | enum('N','Y')                     | NO   |     | N                     |       || Super_priv             | enum('N','Y')                     | NO   |     | N                     |       || Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N                     |       || Lock_tables_priv       | enum('N','Y')                     | NO   |     | N                     |       || Execute_priv           | enum('N','Y')                     | NO   |     | N                     |       || Repl_slave_priv        | enum('N','Y')                     | NO   |     | N                     |       || Repl_client_priv       | enum('N','Y')                     | NO   |     | N                     |       || Create_view_priv       | enum('N','Y')                     | NO   |     | N                     |       || Show_view_priv         | enum('N','Y')                     | NO   |     | N                     |       || Create_routine_priv    | enum('N','Y')                     | NO   |     | N                     |       || Alter_routine_priv     | enum('N','Y')                     | NO   |     | N                     |       || Create_user_priv       | enum('N','Y')                     | NO   |     | N                     |       || Event_priv             | enum('N','Y')                     | NO   |     | N                     |       || Trigger_priv           | enum('N','Y')                     | NO   |     | N                     |       || Create_tablespace_priv | enum('N','Y')                     | NO   |     | N                     |       || ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |                       |       || ssl_cipher             | blob                              | NO   |     | NULL                  |       || x509_issuer            | blob                              | NO   |     | NULL                  |       || x509_subject           | blob                              | NO   |     | NULL                  |       || max_questions          | int(11) unsigned                  | NO   |     | 0                     |       || max_updates            | int(11) unsigned                  | NO   |     | 0                     |       || max_connections        | int(11) unsigned                  | NO   |     | 0                     |       || max_user_connections   | int(11) unsigned                  | NO   |     | 0                     |       || plugin                 | char(64)                          | NO   |     | mysql_native_password |       || authentication_string  | text                              | YES  |     | NULL                  |       || password_expired       | enum('N','Y')                     | NO   |     | N                     |       || password_last_changed  | timestamp                         | YES  |     | NULL                  |       || password_lifetime      | smallint(5) unsigned              | YES  |     | NULL                  |       || account_locked         | enum('N','Y')                     | NO   |     | N                     |       |+------------------------+-----------------------------------+------+-----+-----------------------+-------+查看用户,以列的方式显示数据:SELECT * FROM mysql.user \G*************************** 1. row ***************************Host: %User: rootSelect_priv: YInsert_priv: YUpdate_priv: YDelete_priv: YCreate_priv: YDrop_priv: YReload_priv: YShutdown_priv: YProcess_priv: YFile_priv: YGrant_priv: YReferences_priv: YIndex_priv: YAlter_priv: YShow_db_priv: YSuper_priv: YCreate_tmp_table_priv: YLock_tables_priv: YExecute_priv: YRepl_slave_priv: YRepl_client_priv: YCreate_view_priv: YShow_view_priv: YCreate_routine_priv: YAlter_routine_priv: YCreate_user_priv: YEvent_priv: YTrigger_priv: YCreate_tablespace_priv: Yssl_type:ssl_cipher:x509_issuer:x509_subject:max_questions: 0max_updates: 0max_connections: 0max_user_connections: 0plugin: mysql_native_passwordauthentication_string: *1CBB512647CC0DF0A850C55C13778CEA53552E43password_expired: Npassword_last_changed: 2022-08-24 11:13:22password_lifetime: NULLaccount_locked: N*************************** 2. row ***************************Host: localhostUser: mysql.sessionSelect_priv: NInsert_priv: NUpdate_priv: NDelete_priv: NCreate_priv: NDrop_priv: NReload_priv: NShutdown_priv: NProcess_priv: NFile_priv: NGrant_priv: NReferences_priv: NIndex_priv: NAlter_priv: NShow_db_priv: NSuper_priv: YCreate_tmp_table_priv: NLock_tables_priv: NExecute_priv: NRepl_slave_priv: NRepl_client_priv: NCreate_view_priv: NShow_view_priv: NCreate_routine_priv: NAlter_routine_priv: NCreate_user_priv: NEvent_priv: NTrigger_priv: NCreate_tablespace_priv: Nssl_type:ssl_cipher:x509_issuer:x509_subject:max_questions: 0max_updates: 0max_connections: 0max_user_connections: 0plugin: mysql_native_passwordauthentication_string: *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHEREpassword_expired: Npassword_last_changed: 2022-08-23 15:30:37password_lifetime: NULLaccount_locked: Y*************************** 3. row ***************************Host: localhostUser: mysql.sysSelect_priv: NInsert_priv: NUpdate_priv: NDelete_priv: NCreate_priv: NDrop_priv: NReload_priv: NShutdown_priv: NProcess_priv: NFile_priv: NGrant_priv: NReferences_priv: NIndex_priv: NAlter_priv: NShow_db_priv: NSuper_priv: NCreate_tmp_table_priv: NLock_tables_priv: NExecute_priv: NRepl_slave_priv: NRepl_client_priv: NCreate_view_priv: NShow_view_priv: NCreate_routine_priv: NAlter_routine_priv: NCreate_user_priv: NEvent_priv: NTrigger_priv: NCreate_tablespace_priv: Nssl_type:ssl_cipher:x509_issuer:x509_subject:max_questions: 0max_updates: 0max_connections: 0max_user_connections: 0plugin: mysql_native_passwordauthentication_string: *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHEREpassword_expired: Npassword_last_changed: 2022-08-23 15:30:37password_lifetime: NULLaccount_locked: Y*************************** 4. row ***************************Host: %User: vanSelect_priv: NInsert_priv: NUpdate_priv: NDelete_priv: NCreate_priv: NDrop_priv: NReload_priv: NShutdown_priv: NProcess_priv: NFile_priv: NGrant_priv: NReferences_priv: NIndex_priv: NAlter_priv: NShow_db_priv: NSuper_priv: NCreate_tmp_table_priv: NLock_tables_priv: NExecute_priv: NRepl_slave_priv: NRepl_client_priv: NCreate_view_priv: NShow_view_priv: NCreate_routine_priv: NAlter_routine_priv: NCreate_user_priv: NEvent_priv: NTrigger_priv: NCreate_tablespace_priv: Nssl_type:ssl_cipher:x509_issuer:x509_subject:max_questions: 0max_updates: 0max_connections: 0max_user_connections: 0plugin: mysql_native_passwordauthentication_string: *1CBB512647CC0DF0A850C55C13778CEA53552E43password_expired: Npassword_last_changed: 2022-08-24 11:15:47password_lifetime: NULLaccount_locked: N查询特定字段:SELECT host,user,authentication_string,select_priv,insert_priv,drop_privFROM mysql.user;db表使用DESCRIBE查看db表的基本结构:DESCRIBE mysql.db;+-----------------------+---------------+------+-----+---------+-------+| Field                 | Type          | Null | Key | Default | Extra |+-----------------------+---------------+------+-----+---------+-------+| Host                  | char(60)      | NO   | PRI |         |       || Db                    | char(64)      | NO   | PRI |         |       || User                  | char(32)      | NO   | PRI |         |       || Select_priv           | enum('N','Y') | NO   |     | N       |       || Insert_priv           | enum('N','Y') | NO   |     | N       |       || Update_priv           | enum('N','Y') | NO   |     | N       |       || Delete_priv           | enum('N','Y') | NO   |     | N       |       || Create_priv           | enum('N','Y') | NO   |     | N       |       || Drop_priv             | enum('N','Y') | NO   |     | N       |       || Grant_priv            | enum('N','Y') | NO   |     | N       |       || References_priv       | enum('N','Y') | NO   |     | N       |       || Index_priv            | enum('N','Y') | NO   |     | N       |       || Alter_priv            | enum('N','Y') | NO   |     | N       |       || Create_tmp_table_priv | enum('N','Y') | NO   |     | N       |       || Lock_tables_priv      | enum('N','Y') | NO   |     | N       |       || Create_view_priv      | enum('N','Y') | NO   |     | N       |       || Show_view_priv        | enum('N','Y') | NO   |     | N       |       || Create_routine_priv   | enum('N','Y') | NO   |     | N       |       || Alter_routine_priv    | enum('N','Y') | NO   |     | N       |       || Execute_priv          | enum('N','Y') | NO   |     | N       |       || Event_priv            | enum('N','Y') | NO   |     | N       |       || Trigger_priv          | enum('N','Y') | NO   |     | N       |       |+-----------------------+---------------+------+-----+---------+-------+1.用户列db表用户列有3个字段,分别是Host、User 、Db 。这3个字段分别表示主机名、用户名和数据库名。表示从某个主机连接某个用户对某个数据库的操作权限,这3个字段的组合构成了db表的主键。2.权限列 Create_routine_priv和Alter_routine_priv这两个字段决定用户是否具有创建和修改存储过程的权限。tables_priv表和columns_priv表
  • 1
  • 2
  • 3
  • ···
  • 1481
  • 1482
  • 1483
  • ···
  • 1486
  • 1487
  • 1488
最新文章
  • jpg怎么转换成ico图标
  • json是什么意思
  • 如何进行网站流量统计分析?
  • 网页定时刷新是干嘛的
  • user agent检测详解
  • 支付宝微信二维码如何合并?
  • 如何制作ico图标
  • 随机密码生成器安全吗?
  • Base64是什么
  • 时间戳是什么意思
冀ICP备2020020658号