java rsa 117_java实现RSA非对称加密解密

之前写过一篇java实现AES对称加密解密

在对密码加密传输的场景下 RSA非对称加密解密可能会更加适合。

原理就是后台生成一对公钥和私钥,公钥给前端用来加密,后台用私钥去解密,保证了传输过程中就算被截获也避免密码泄露。

下面是代码:

package com.zhaohy.app.utils;

import java.io.BufferedReader;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.security.KeyFactory;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.Signature;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

import javax.crypto.CipherInputStream;

import org.apache.commons.codec.binary.Base64;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class RSAUtil {

/**

* RSA最大加密明文大小

*/

private static final int MAX_ENCRYPT_BLOCK = 117;

/**

* RSA最大解密密文大小

*/

private static final int MAX_DECRYPT_BLOCK = 128;

/**

* 获取密钥对

*

* @return 密钥对

*/

public static KeyPair getKeyPair() throws Exception {

KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");

generator.initialize(1024);

return generator.generateKeyPair();

}

/**

* 获取私钥

*

* @param privateKey 私钥字符串

* @return

*/

public static PrivateKey getPrivateKey(String privateKey) throws Exception {

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

byte[] decodedKey = Base64.decodeBase64(privateKey.getBytes());

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);

return keyFactory.generatePrivate(keySpec);

}

/**

* 获取公钥

*

* @param publicKey 公钥字符串

* @return

*/

public static PublicKey getPublicKey(String publicKey) throws Exception {

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

byte[] decodedKey = Base64.decodeBase64(publicKey.getBytes());

X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedKey);

return keyFactory.generatePublic(keySpec);

}

/**

* RSA加密

*

* @param data 待加密数据

* @param publicKey 公钥

* @return

*/

public static String encrypt(String data, PublicKey publicKey) throws Exception {

Cipher cipher = Cipher.getInstance("RSA");

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

int inputLen = data.getBytes().length;

ByteArrayOutputStream out = new ByteArrayOutputStream();

int offset = 0;

byte[] cache;

int i = 0;

// 对数据分段加密

while (inputLen - offset > 0) {

if (inputLen - offset > MAX_ENCRYPT_BLOCK) {

cache = cipher.doFinal(data.getBytes(), offset, MAX_ENCRYPT_BLOCK);

} else {

cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset);

}

out.write(cache, 0, cache.length);

i++;

offset = i * MAX_ENCRYPT_BLOCK;

}

byte[] encryptedData = out.toByteArray();

out.close();

// 获取加密内容使用base64进行编码,并以UTF-8为标准转化成字符串

// 加密后的字符串

return new String(Base64.encodeBase64String(encryptedData));

}

/**

* RSA解密

*

* @param data 待解密数据

* @param privateKey 私钥

* @return

*/

public static String decrypt(String data, PrivateKey privateKey) throws Exception {

Cipher cipher = Cipher.getInstance("RSA");

cipher.init(Cipher.DECRYPT_MODE, privateKey);

byte[] dataBytes = Base64.decodeBase64(data);

int inputLen = dataBytes.length;

ByteArrayOutputStream out = new ByteArrayOutputStream();

int offset = 0;

byte[] cache;

int i = 0;

// 对数据分段解密

while (inputLen - offset > 0) {

if (inputLen - offset > MAX_DECRYPT_BLOCK) {

cache = cipher.doFinal(dataBytes, offset, MAX_DECRYPT_BLOCK);

} else {

cache = cipher.doFinal(dataBytes, offset, inputLen - offset);

}

out.write(cache, 0, cache.length);

i++;

offset = i * MAX_DECRYPT_BLOCK;

}

byte[] decryptedData = out.toByteArray();

out.close();

// 解密后的内容

return new String(decryptedData, "UTF-8");

}

/**

* 签名

*

* @param data 待签名数据

* @param privateKey 私钥

* @return 签名

*/

public static String sign(String data, PrivateKey privateKey) throws Exception {

byte[] keyBytes = privateKey.getEncoded();

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

PrivateKey key = keyFactory.generatePrivate(keySpec);

Signature signature = Signature.getInstance("MD5withRSA");

signature.initSign(key);

signature.update(data.getBytes());

return new String(Base64.encodeBase64(signature.sign()));

}

/**

* 验签

*

* @param srcData 原始字符串

* @param publicKey 公钥

* @param sign 签名

* @return 是否验签通过

*/

public static boolean verify(String srcData, PublicKey publicKey, String sign) throws Exception {

byte[] keyBytes = publicKey.getEncoded();

X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

PublicKey key = keyFactory.generatePublic(keySpec);

Signature signature = Signature.getInstance("MD5withRSA");

signature.initVerify(key);

signature.update(srcData.getBytes());

return signature.verify(Base64.decodeBase64(sign.getBytes()));

}

/**

* 文件解密

*

* @param publicKeyStr

* @param srcFileName

* @param destFileName

*/

public static void decryptFileBig(String publicKeyStr, String srcFileName, String destFileName) {

Cipher cipher = null;

InputStream is = null;

OutputStream out = null;

try {

X509EncodedKeySpec encodedKey = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyStr));

KeyFactory keyf = KeyFactory.getInstance("RSA");

PublicKey pubKey = keyf.generatePublic(encodedKey);

cipher = Cipher.getInstance("RSA", new BouncyCastleProvider());

cipher.init(Cipher.DECRYPT_MODE, pubKey);

File f = new File(srcFileName);

is = new FileInputStream(f);

out = new FileOutputStream(destFileName);

int blockSize = cipher.getBlockSize();

int size = Integer.valueOf(String.valueOf(f.length()));

byte[] decryptByte = new byte[size];

is.read(decryptByte);

//分别对各块数据进行解密

int j = 0;

while ((decryptByte.length - j * blockSize) > 0) {

out.write(cipher.doFinal(decryptByte, j * blockSize, blockSize));

j++;

}

} catch (Exception e) {

System.out.println(e);

} finally {

if (null != out) {

try {

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (null != is) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

/**

* 加密大文件

* @param privateKeyStr

* @param srcFileName

* @param destFileName

*/

public static void encryptFileBig(String privateKeyStr, String srcFileName, String destFileName) {

if (privateKeyStr == null) {

new Exception("加密私钥为空, 请设置");

}

Cipher cipher = null;

InputStream is = null;

OutputStream out = null;

CipherInputStream cis = null;

try {

// 使用默认RSA

PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(

Base64.decodeBase64(privateKeyStr));

KeyFactory keyf = KeyFactory.getInstance("RSA");

PrivateKey priKey = keyf.generatePrivate(priPKCS8);

cipher = Cipher.getInstance("RSA", new BouncyCastleProvider());

cipher.init(Cipher.ENCRYPT_MODE, priKey);

int blockSize = cipher.getBlockSize();

is = new FileInputStream(srcFileName);

File f = new File(srcFileName);

int size = Integer.valueOf(String.valueOf(f.length()));

byte[] encryptByte = new byte[size];

is.read(encryptByte);

out = new FileOutputStream(destFileName);

int outputBlockSize = cipher.getOutputSize(encryptByte.length);

int leavedSize = encryptByte.length % blockSize;

int blocksNum = leavedSize == 0 ? encryptByte.length / blockSize : encryptByte.length / blockSize + 1;

byte[] cipherData = new byte[blocksNum * outputBlockSize];

for (int i = 0; i < blocksNum; i++) {

if ((encryptByte.length - i * blockSize) > blockSize) {

cipher.doFinal(encryptByte, i * blockSize, blockSize, cipherData,i * outputBlockSize);

} else {

cipher.doFinal(encryptByte, i * blockSize, encryptByte.length - i * blockSize,cipherData, i * outputBlockSize);

}

}

out.write(cipherData);

} catch (Exception e) {

System.out.println(e);

} finally {

if (null != cis) {

try {

cis.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (null != is) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (null != out) {

try {

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

/**

* RSA文件签名

*

* @param filePath

* @param privateKey

* @param encode

* @return

*/

public static String signFile(String filePath, String privateKey, String encode) {

FileInputStream fis = null;

InputStreamReader isr = null;

BufferedReader bfr = null;

try {

PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));

KeyFactory keyf = KeyFactory.getInstance("RSA");

PrivateKey priKey = keyf.generatePrivate(priPKCS8);

java.security.Signature signature = java.security.Signature.getInstance("SHA1WithRSA");

signature.initSign(priKey);

fis = new FileInputStream(new File(filePath));

isr = new InputStreamReader(fis, encode);

bfr = new BufferedReader(isr);

String lineTxt = "";

while (!AppFrameworkUtil.isBlank(lineTxt = bfr.readLine())) {

signature.update(lineTxt.getBytes(encode));

}

byte[] signed = signature.sign();

String ret = new String(Base64.encodeBase64(signed));

System.out.println("signed:" + ret);

return ret;

} catch (Exception e) {

System.out.println(e);

} finally {

if (bfr != null) {

try {

bfr.close();

} catch (IOException e) {

}

}

if (isr != null) {

try {

isr.close();

} catch (IOException e) {

}

}

if (fis != null) {

try {

fis.close();

} catch (IOException e) {

}

}

}

return null;

}

/**

* RSA文件验签名检查

* @param content 待签名数据

* @param sign 签名值

* @param publicKey 分配给开发商公钥

* @param encode 字符集编码

* @return 布尔值

*/

public static boolean doCheckFile(String filePath, String sign, String publicKey, String encode) {

FileInputStream fis = null;

InputStreamReader isr = null;

BufferedReader bfr = null;

try {

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

byte[] encodedKey = Base64.decodeBase64(publicKey);

PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));

java.security.Signature signature = java.security.Signature.getInstance("SHA1WithRSA");

signature.initVerify(pubKey);

fis = new FileInputStream(new File(filePath));

isr = new InputStreamReader(fis, "UTF-8");

bfr = new BufferedReader(isr);

String lineTxt = "";

while (!AppFrameworkUtil.isBlank(lineTxt = bfr.readLine())) {

signature.update(lineTxt.getBytes(encode));

}

boolean bverify = signature.verify(Base64.decodeBase64(sign));

return bverify;

} catch (Exception e) {

System.out.println(e);

} finally {

if (bfr != null) {

try {

bfr.close();

} catch (IOException e) {

}

}

if (isr != null) {

try {

isr.close();

} catch (IOException e) {

}

}

if (fis != null) {

try {

fis.close();

} catch (IOException e) {

}

}

}

return false;

}

public static void main(String[] args) {

try {

// 生成密钥对

KeyPair keyPair = getKeyPair();

String privateKey = new String(Base64.encodeBase64(keyPair.getPrivate().getEncoded()));

String publicKey = new String(Base64.encodeBase64(keyPair.getPublic().getEncoded()));

System.out.println("私钥:" + privateKey);

System.out.println("公钥:" + publicKey);

// RSA加密

String data = "123秘密啊";

String encryptData = encrypt(data, getPublicKey(publicKey));

System.out.println("加密后内容:" + encryptData);

// RSA解密

String decryptData = decrypt(encryptData, getPrivateKey(privateKey));

System.out.println("解密后内容:" + decryptData);

// RSA签名

String sign = sign(data, getPrivateKey(privateKey));

System.out.println("sign==" + sign);

// RSA验签

boolean result = verify(data, getPublicKey(publicKey), sign);

System.out.println("验签结果:" + result);

/****大文件加签验签****/

//加签验签

String fileSign = signFile("/home/zhaohy/Documents/test.doc", privateKey, "UTF-8");

System.out.println("fileSign==" + fileSign);

boolean checkFileBoolean = doCheckFile("/home/zhaohy/Documents/test.doc", fileSign, publicKey, "UTF-8");

System.out.println("大文件校验签名结果:" + checkFileBoolean);

//加密解密

encryptFileBig(privateKey, "/home/zhaohy/Documents/test.txt", "/home/zhaohy/Documents/test.dat");

decryptFileBig(publicKey, "/home/zhaohy/Documents/test.dat", "/home/zhaohy/Documents/test1.txt");

} catch (Exception e) {

e.printStackTrace();

System.out.print("加解密异常");

}

}

}

运行结果:

私钥:MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALpLjdbsu172ftiv3eUC/JghSSzNRlp8p9Ilr8XlK/gl3gaPFFo1BAHWWyb9MhoTdE5BvES6E/eW5gVKby8olLa6ILbh9UYif0SKWca7pTt2nqn2Cd8v29/94ZF9i+yMoime3wuS7QxJEHG7qCqps7KVNtP/4/628lq1jB6B3DrPAgMBAAECgYBUtCGrxTt0dBM8psn3ZKJA8XF6A2OnpOIRNL109zxEucL3rHqOgWhvBW2wjpMHNC0/n7fgb9LAUkYHxc5D3OmwXAhvgRzDmMTeoaikrLeJpxX9NQ4TU3CFcL9YabQ+rjB6yMgfbmmA0B/odxpzIZd6ypHq91ogI/rfP4McaX7NwQJBAO9Qm4SoOn/0SzfOE+PjnIyLkDqW2kFRJv+c/4Z0H/yPOIjytHhe6hQQ8KHT2azOP+SeAWbjb152a5Rp/E8da/8CQQDHSKDBSGZuN/Qyk1eGJ80T9+GSQI0oYQfZcHYNUkAKrWceHISL5jMrUXWHSlKjFC5E7RsqQKMn72xisrlLcXExAkEA7YAB11VdOT8opulNtAxfgNvA92RelhQDsAoPTVBRrkQ0xzSXBh6sD93/8ZpdnLHTlv94RLPSAt1jRpcoXxvD4QJBALtv00uYVkdqt3NuZE8ZVmlmp7KQpnQJN4HLpi2HZBbm2+tVdVHEVfJzbrCuNiWO0KohvYAzRYJFTlNSuLd93rECQDcgPHh0qBOW22ggxiqpfbLIURvPAT9urp8NuTM0K0rW3mC2me55yPSDQ7jL1t9vwYkfahc0GUl1V1Cq/449AHU=

公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6S43W7Lte9n7Yr93lAvyYIUkszUZafKfSJa/F5Sv4Jd4GjxRaNQQB1lsm/TIaE3ROQbxEuhP3luYFSm8vKJS2uiC24fVGIn9EilnGu6U7dp6p9gnfL9vf/eGRfYvsjKIpnt8Lku0MSRBxu6gqqbOylTbT/+P+tvJatYwegdw6zwIDAQAB

加密后内容:R7GqGE2r51PmJAt3wtKhsbqfFzeobvzqFlAp8Tv0+3HkevsUF2a+/ZO7Sn53cKGwXIkOkDQN0S/pk/Eacd8Wk1wXKTKx57eSaQJFv/HQ5nDUfvtMWIg0IcHNmHyNBfDPVe/MiMkKf23/a/EyEfCQEzsCQyHLyHoTg34a1SNXTLs=

解密后内容:123秘密啊

sign==p8JR0aserak6iPltfAJx/mlvlp5Ox5NcpvRo7R1rxDItekMhyF82RVizgMqsmEBpWzW9Qkxm6AWzjzEr+XhR7u4KhxEO7euTHC9NGJ0TAtDKqtAsfFaZi8ZyY4MkHnSCFZVMcWMR3GhZ8ALJGe/lSstNSEp8H9lQE8u2o2oYiiw=

验签结果:true

signed:aavuNSCwaT2jZ6XrlAbSJNLBDalkWZ1t0tnQnveUw+3exlpcvRu0xotAlrW0V4voLLeRydLgIjwCwq1YxqFyKcYlOuORzorlmihjSXBZf0GZoJIlTIaUZ8/TJV+CRFObFnnEQ+8QAbRs4b7AB6nv1A2bxMeKulS0OTPxSkSFTdM=

fileSign==aavuNSCwaT2jZ6XrlAbSJNLBDalkWZ1t0tnQnveUw+3exlpcvRu0xotAlrW0V4voLLeRydLgIjwCwq1YxqFyKcYlOuORzorlmihjSXBZf0GZoJIlTIaUZ8/TJV+CRFObFnnEQ+8QAbRs4b7AB6nv1A2bxMeKulS0OTPxSkSFTdM=

大文件校验签名结果:true

可以看到加密解密成功,里面最后加密解密文件自测只对txt或html等文本文件有效,doc或者excel加密文件后解密出来的东西乱码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeForces 731C Socks

//并查集的应用 #include <bits/stdc.h> using namespace std; const int N 2e5 5; int f[N]; int color[N]; vector<int>num[N]; int findx(int x) {return ( x f[x]? x: f[x] findx(f[x]) ); } void merge(int x, int y) {int fx findx(x);int fy findx(y…

php多条件筛选顺序_php多条件组合筛选

【实例简介】js搞定多条件组合筛选&#xff0c;实现URL动态变化&#xff0c;后台根据URL参数实现查询【实例截图】【核心代码】filter└── filter├── css│ ├── bootstrap.css│ ├── bootstrap.css.map│ ├── bootstrap.min.css│ ├── bootstrap-resp…

jdeveloper_JDeveloper中的Java反编译器

jdeveloperJava Decompiler是一个独立的图形实用程序&#xff0c;显示“ .class”文件的Java源代码。 下面是Java Decompiler程序的快照 您可以从这里下载该程序 我将说明如何在Jdeveloper中将此程序用作外部工具 Java Decompiler和Jdeveloper之间的集成 您可以将此程序添加…

文件上传 java 完美,vue+java实现文件上传(excel等),会出现跨域问题,直接用form表单提交就不会有问题了(new FormData())...

vuejava实现文件上传(excel等)&#xff0c;会出现跨域问题&#xff0c;直接用form表单提交就不会有问题了(new FormData())地址&#xff1a;https://www.cnblogs.com/muscles/p/9503103.html一&#xff1a;首先说一下什么是跨域&#xff0c;跨域就是解决浏览器同源策略的问题。…

abp的权限与导航菜单的关系

原来以为各是各的,所以就有了第一个版本.Getallmentus.然后注入了role,当然失败了.获取所有的菜单.一直在思考在什么地方设置菜单是否展示呢? 后面看了源码.才发现自己错了. UserNavigationManager(这个是一个框架内部调用的类)会获取当前userid的所有的菜单, 数据源跟菜单的R…

通过Java 8流使用Oracle AQ

Oracle数据库最令人敬畏的功能之一是Oracle AQ&#xff1a;Oracle数据库高级队列 。 AQ API直接在数据库中实现了完整的事务性消息传递系统。 在数据库位于系统中心的经典体系结构中&#xff0c;使用AQ进行进程间通信时&#xff0c;多个应用程序&#xff08;其中一些应用程序用…

藏经阁

藏经阁 收藏经典书籍&#xff0c; 文学 1.霍乱时期的爱情 2.巨人的陨落 3.群山之巅 4.无人生还 5.加缪文集&#xff0c;1995&#xff0c;译林出版 6.1984 7.黄金时代 8.太阳照常升起 9.月亮和六便士 10.白夜行 11.小王子 12.杀死一只知更鸟 社科 1.高效能人士的七个习惯 2.少有…

php private方法,php如何调用private方法

php调用private方法&#xff1a;首先定义一个parent类&#xff1b;然后在类的内部使用私有函数&#xff1b;接着实例化parent类&#xff0c;让其变成一个对象并赋值给“$obj”即可。将一个类实例化后就变成对象&#xff0c;私有函数只能在类内部使用&#xff0c;不能在类外&…

Centos7 开启端口

CentOS7默认没有使用iptables&#xff0c;所以通过编辑iptables的配置文件来开启80端口是不可以的。 CentOS 7 采用了 firewalld 防火墙。 如要查询是否开启80端口&#xff1a; [rootjoe-pc ~]# firewall-cmd --query-port80/tcp no 显然80端口没有开启。 下面我们开启80端口&a…

java flux api,SpringBoot学习系列-WebFlux REST API 全局异常处理

本文内容为什么要全局异常处理&#xff1f;WebFlux REST 全局异常处理实战小结摘录&#xff1a;只有不断培养好习惯&#xff0c;同时不断打破坏习惯&#xff0c;我们的行为举止才能够自始至终都是正确的。一、为什么要全局异常处理&#xff1f;前后端分离开发&#xff0c;一般提…

使您的Java 8方法引用生效

方法参考 众所周知&#xff0c;我们可以使用Java 8中的方法引用 &#xff08;例如String::isEmpty来引用例如在元素上流式传输时使用的方法。 看一下以下代码片段&#xff1a; Stream.of("A", "", "B").filter(Stream::isEmpty).count();它将产…

down.php无法打开,php下载文件 图片不能打开,该怎么解决

php下载文件 图片不能打开function fileDown($file_name){$file_name iconv("utf-8","gb2312",$file_name);$file_path "E:/php/down/".$file_name;if(!file_exists($file_path)){echo "文件不存在";return;}$fp fopen($file_path,…

【转】Linux如何在系统启动时自动加载模块

1、Linux安装驱动程序 tar zxf ixgbe-<x.x.x>.tar.gz cd ixgbe-<x.x.x>/src/ make install modprobe <ixgbe> 卸载驱动 cd ixgbe-<x.x.x>/src/ make uninstall 2、Linux如何在系统启动时自动加载模块 原文&#xff1a;http://www.cnblogs.com/image-ey…

MATLAB小记_fread的用法

“fread”以二进制形式&#xff0c;从文件读出数据。语法1&#xff1a;[a,count]fread(fid,size,precision)语法2&#xff1a;[a,count]fread(fid,size,precision,skip)size: 不指定 &#xff1a;到尾返回读。N : 读出N个数据&#xff0c;构成列向量。inf …

mvvm 后端_ZK实际应用:MVVM –与ZK客户端API一起使用

mvvm 后端在以前的文章中&#xff0c;我们已经使用ZK的MVVM实现了以下功能&#xff1a; 将数据加载到表中 使用表单绑定保存数据 删除条目并以编程方式更新视图 ZK MVVM和ZK MVC实现方式之间的主要区别是&#xff0c;我们不直接在controller&#xff08;ViewModel&#xff0…

微信分享朋友圈固定缩略图 php,微信转发或分享朋友圈带缩略图、标题和描述的实现方法...

自己做博客以来&#xff0c;很早之前分享过文章至朋友圈&#xff0c;那个时候分享过去的文章自动获取页面的比例适合的图片为所缩略图&#xff1a;后期就很少分享至朋友圈&#xff0c; 近来分享文章给朋友后&#xff0c;发现不带缩略图和简介了&#xff0c;觉得这样很不好看&am…

Oracle 用户、表空间、授权、备份、导入等操作相关

一、基础操作 闲来无事&#xff0c;整理oracle数据库相关操作&#xff0c;以后备用。。。。。 ps&#xff1a; satp 为用户 satp_data 为表空间 1 1.删除表空间2 DROP TABLESPACE satp_data INCLUDING CONTENTS AND DATAFILES;3 4 2.删除用户5 drop user satp cascade;6 …

看一下即将发布的JSF 2.3 Push支持

如前几篇文章所述&#xff0c;下一版本的JavaServer Faces&#xff08;Mojarra&#xff09;已添加了许多增强功能。 JSF 2.3计划于2017年与Java EE 8一起发布&#xff0c;但是您现在可以通过从源代码构建或运行里程碑版本来尝试JSF的一些增强和更新&#xff0c;以进行测试。 对…

java mvc中重复提交表单,spring mvc 防止重复提交表单的两种方法,推荐第二种

第一种方法&#xff1a;判断session中保存的token比较麻烦&#xff0c;每次在提交表单时都必须传入上次的token。而且当一个页面使用ajax时&#xff0c;多个表单提交就会有问题。注解Token代码&#xff1a;package com.thinkgem.jeesite.common.repeat_form_validator;import j…

3415 最小和

3415 最小和 链接&#xff1a;http://codevs.cn/problem/3415/ CodeVS原创 时间限制: 1 s空间限制: 64000 KB题目描述 Description小浣熊松松来到文具店&#xff0c;选择了K支自己喜欢的水彩笔&#xff0c;并抄下了它们的价格。可是到结算时&#xff0c;他发现自己抄价格时抄…