0%

文章字数:261,阅读全文大约需要1分钟

http长链接

  1. http是一问一答的形式,本身没有长短的概念
  2. http是基于tcp协议的,tcp是长链接
  3. HTTP/1.1起浏览器默认支持connection:keep-alive即tcp连接不中断,每次http请求都复用一条tcp连接
  4. keep-alive时间可以在服务器上设置

https复用ssl握手

  1. 客户端获取证书,的到服务器公钥
  2. 客户端利用公钥给服务器发送一个PMS(Pre-Master Secret)前主秘钥。
  3. 双方共享了PMS之后利用特定算法导出之后对话需要使用的对称秘钥(开销很大)
  4. 为了避免每次通讯都要进行以上SSL握手环节,双方都会根据SessionID保存对称加密秘钥。下次通讯直接从缓存获取就可以了。
  5. SSL是面向连接的,逻辑上独立于传输层。是传输层之上,应用层之下的安全层。即兼容了老的http,有不影响tcp。

文章字数:1139,阅读全文大约需要4分钟

一、返回值

1.该类型状态码表示接收到请求并且继续处理

  • 100: 客户端必须继续发出请求。
  • 101: 客户端要求服务器根据请求转换HTTP协议版本。

2.该类型状态码表示动作被成功接收、理解和接受

  • 200: 表明该请求被成功地完成,所请求的资源发送到客户端。
  • 201: 提示知道新文件的URL。
  • 202: 接受并处理,但处理未完成。
  • 203: 返回信息不确定或不完整。
  • 204: 收到请求,但返回信息为空。
  • 205: 服务器完成了请求,用户必须复位当前已经浏览过的文件。
  • 206: 服务器已经完成了部分用户的GET请求。

3.该类型状态码表示为了完成指定的动作,必须接受进一步处理。

  • 300: 请求的资源可在多处获得。
  • 301: 本网页被永久性转移到另一个URL。
  • 302: 请求的网页被重定向到新的地址。
  • 303: 建议用户访问其他URL或访问方式。
  • 304: 自从上次请求后,请求的网页未修改过。
  • 305: 请求的资源必须从服务器指定的地址获得。
  • 306: 前一版本HTTP中使用的代码,现已不再使用。
  • 307: 声明请求的资源临时性删除。

4.该类型状态码表示请求包含错误语法或不能正确执行。

  • 400: 客户端请求有语法错误。
  • 401: 请求未经授权。
  • 402: 保留有效ChargeTo头响应。
  • 403: 禁止访问,服务器收到请求,但拒绝提供服务。
  • 404: 可连接服务器,但服务器无法取得所请求的网页,请求资源不存在。
  • 405: 用户在Request-Line字段定义的方法不被允许。
  • 406: 根据用户发送的Accept,请求资源不可访问。
  • 407: 类似401,用户必须首先在代理服务器上取得授权。
  • 408: 客户端没有在用户指定的时间内完成请求。
  • 409: 对当前资源状态,请求不能完成。
  • 410: 服务器上不再有此资源。
  • 411: 服务器拒绝用户定义的Content-Length属性请求。
  • 412: 一个或多个请求头字段在当前请求中错误。
  • 413: 请求的资源大于服务器允许的大小。
  • 414: 请求的资源URL长于服务器允许的长度。
  • 415: 请求资源不支持请求项目格式。
  • 416: 请求中包含Range请求头字段,在当前请求资源范围内没有range指示值。
  • 417: 服务器不满足请求Expect头字段指定的期望值。

5.该类型状态码表示服务器或网关错误。

  • 500: 服务器错误。
  • 501: 服务器不支持请求的功能。
  • 502: 网关错误。
  • 503: 无法获得服务。
  • 504: 网关超时。
  • 505: 不支持的http版本。

二、http请求方法

  • OPTIONS: 返回服务器针对特定资源所支持的HTTP请求方法。
  • HEAD: 与GET请求一致,只不过不会返回响应体。
  • GET: 请求指定的资源。
  • POST: 向指定资源提交数据进行处理请求,数据包含在请求体中,可能会导致新资源的创建或已有资源的修改。
  • PUT: 向指定资源位置上传最新内容。
  • DELETE: 请求服务器删除所标识的资源。

三、get和post区别

  • get数据放在url后,post把数据放在body中
  • get最多提交1024字节数据,post没有限制

文章字数:33,阅读全文大约需要1分钟

URI is not registered (Settings | Languages) 即url没有注册,需要在编辑器注册一下。

dtd,xml的规则文件。

解决

setting->search Schemas and DTDs->Ignored Schemas and DTDs 添加


文章字数:675,阅读全文大约需要2分钟

1、进入/返回方法快捷键

Ctrl+B 进入光标所在方法定义的地方或返回该方法被使用的地方(代替Ctrl+鼠标点击方法进入方式,避免了手指在键盘和鼠标之间切换,非常好用的快捷键)

Ctrl+Alt+B 进入子类或子方法定义的地方,

Ctrl+U 子类跳转到接口方法

Ctrl+F12 查看当前类的所有方法

Ctrl+H 显示该类继承关系结构图

Ctrl+Q 显示类/方法/变量上的doc注释说明

2、光标定位及选中快捷键

Ctrl+Alt+Left/Right 光标定位到上一个/下一个浏览位置处

Ctrl+Shift+Backspace 光标定位到上次修改的地方

Alt+Up/Down 移动光标到上一个/下一个方法开始处

Ctrl+Left/Right 移动光标到前一个/后一个单词处,加Shift键,产生选中效果

Ctrl+[/] 移动光标到前/后代码块,加Shift键,产生选中效果

Ctrl+W 按语法选中代码,连续按会有其他效果,加Shift键,产生反向选中效果

F2 快速定位到下一个错误和警告处,加Shift键,定位到上一个错误处

Ctrl+”+/-“ 当前方法展开/折叠,加Shift键,全部方法展开/折叠

Ctrl+Alt+T 在选中代码情况下,Surround With(if/else/try catch…) 快速包裹代码

Ctrl+Alt+V 提出选中内容为局部变量

home 快速移动到行头

end 快速移动到行尾

3、删除/插入相关快捷键

Ctrl+Backspace 按单词删除

Ctrl+D 复制行

Ctrl+Y 删除当前行

Ctr+Shift+U 大小写转化

Shift+Enter 向下插入新行,配合Ctrl键,先代码补全再插入新行

Ctrl+Alt+Enter 向上插入新行

Ctrl+Shift+Up/Down 整体向上/下移动语句块/方法

Alt+Shift+Up/Down 单行向上/下移一行

Ctrl+Alt+M 复制代码并生成一个调用函数

4、文件之间定位相关快捷

Ctrl+E/Ctrl+Tab 查看/切换最近打开过的文件(通过方向键上下选择后,按Enter键进入)

ALT+Left/Right 打开的代码编辑窗口中左右切换

5、查找相关快捷键

Ctrl+F/R 当前文件下查找/替换文本,加Shift键,当前工程路径下查找/替换文本

Ctrl+N 查找类

Ctrl+Shift+N 查找文件

Ctrl+Shift+Alt+N 查找类中的方法或变量

Shift+Shift 全局查找

alt+7 查找当前类的所有方法


文章字数:64,阅读全文大约需要1分钟
idea编译程序时报错

1
2
3
4
5
6
error: (com.intellij.util.io.PersistentEnumeratorBase$CorruptedException) PersistentEnumerator storage corrupted 
C:\Users\Administrator\.IntelliJIdea2017.2\system\compile-server\packmes_f0d28b04\targets\artifact\packmes_war_exploded\out-src\data
com.intellij.util.io.PersistentEnumeratorBase$CorruptedException: PersistentEnumerator storage corrupted
C:\Users\Administrator\.IntelliJIdea2017.2\system\compile-server\packmes_f0d28b04\targets\artifact\packmes_war_exploded\out-src\data
at com.intellij.util.io.PersistentEnumeratorBase.<init>(PersistentEnumeratorBase.java:222)
...

解决

清空以下文件夹内的文件
C:\Users\Administrator.IntelliJIdea2017.2\system\compile-server\packmes_f0d28b04\targets\artifact\packmes_war_exploded\out-src/data


文章字数:124,阅读全文大约需要1分钟

原文

重命名文件、方法、属性等(rename):SHIFT+F6
提取当前选择为变量(extract variable):CTRL+ALT+V
提取当前选择为属性(extract field):CTRL+ALT+F
提取当前选择为常量(extract constant):CTRL+ALT+C
提取当前选择为方法(extract method):CTRL+ALT+M
提取当前选择为方法参数(extract parameter):CTRL+ALT+P
重构类、方法(change signarture):CTRL+F6
提取代码块至if、try等结构中(surround with):CTRL+ALT+T
创建模块文件等(new):CTRL+ALT+N
创建测试用例(test):CTRL+SHIFT+T
重构菜单(refactor for this):CTRL+T


文章字数:290,阅读全文大约需要1分钟

封装了几个方法,主要是传入input对象,将对象选中的文件转程base64形式。可以用于图片上传,图片选中后马上显示等功能

1.读取input对象图片,并调用2执行压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* input对象内的图片转Base64
* @param inputOb input对象
* @param outputFun 转换后执行的函数,有一个base64的形参
* */
function inputImgToBase64(inputOb,outputFun) {
var file=inputOb.files[0]

if(!/image\/\w+/.test(file.type))//判断获取的是否为图片文件
{
alert("请确保文件为图像文件");
return false;
}
var reader=new FileReader();
reader.readAsDataURL(file);
reader.onload=function(e)
{
var image = new Image();
//文件类型
image.imgType = file.type;
//保存后缀
var fileNameList = file.name.split('.');
var fileType = fileNameList[fileNameList.length-1];
$('#photoType').attr('value',fileType);

image.src = e.target.result;
image.onload = function() {
var expectWidth = 480;
var expectHeight = 640;
var base64 = compress(this,expectWidth,expectHeight,1);
outputFun(base64);
}
}
}

2.图片转base64

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 图片转base64
* @param img img对象
* @param width
* @param height
* @param ratio 比例
* @returns base64Img
*/
function compress(img, width, height, ratio) {
var canvas, ctx, img64;
canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0, width, height);
img64 = canvas.toDataURL(img.imgType, ratio);
return img64;
}

使用方式

1
2
3
4
//input对象,函数
inputImgToBase64($('#inputPhoto')[0],function (base64) {//base64为转换后图像的base64编码
$('#output')[0].src=base64
});

文章字数:637,阅读全文大约需要2分钟

原文

一、搜索

  1. Ctrl + N :按类名进行搜索
  2. Ctrl + F: 当前文件内搜索
  3. Ctrl + Shift + F: 全局搜索
  4. Ctrl + Shift + Alt + N:模糊搜索方法名
  5. Ctrl + Shift + N:模糊搜索目录
  6. Ctrl + E :打开 曾打开过的文件的记录;
  7. Ctrl + Shift + E : 6的增强版

二、代码生成
1.Ctrl + O :选择重写父类方法;

  1. Ctrl + Shift + Enter:收尾操作,自动补全大括号和分号等;
  2. Alt + Insert : 自动生成get/set和构造方法;

三、代码自动补全

  1. var声明:如输入“aaa”.var 自动补全为 string a =“aaa”;
  2. for/fori遍历:如list.for/fori 自动补全为for(Obejct o:list){…} 或for(int i=0;i<list.size();i++){…};
  3. nullnotnull判断:person.null/notnull 自动补全为if(person == null){...}if(person != null){...}
  4. nn判非空:如person.nn 自动补全为 if(person !=null);
  5. if条件判断:xx>0.if 自动补全为:if(xx > 0){…};
  6. cast强转: Object a=“aa”,输入a.cast自动补全为(String)a;
  7. return 返回值:“aa”.return 自动补全为return “aa”;
  8. sout:生成System.out.println()
  9. psvm:生成main方法;
  10. sout:生成System.out.println()
  11. CTRL+ALT+T或者CTRL+ALT+Win+T: 代码被模板包围,try if之类的可选
    四、其他
  12. Ctrl + Shift + 方向键↑和↓ :向上或向下移动代码
  13. Ctrl + Alt + B(或鼠标左键):进入该接口方法的实现方法;
  14. Ctrl + Alt + U:显示该类的继承关系图
  15. Ctrl + Alt + 方向键←和→:前进或后退
  16. Ctrl + G :跳转到某行
  17. Ctrl + Shift + U :大小写转换

五、运行调试

  1. Ctrl + F10:热部署tomcat项目;
  2. F7:单步调试,进入方法内部;
  3. F8:单步调试,不进入方法内部;
  4. F9 继续执行,进入下一个断点或执行完程序
  5. Shift+F7:选择要进入的方法;
  6. Shift+F8:跳出方法;
  7. Alt+F8:执行表达式查看结果;
  8. Alt+F9:运行到断点;
  9. Ctrl+F8 设置/取消当前行断点;
  10. Ctrl+Shift+F8 查看断点;

文章字数:290,阅读全文大约需要1分钟

application.properties中经常会放账户密码数据库连接地址等敏感信息,可能会造成信息的泄露。使用jasypt可以加密解密配置文件。

引入

1
2
3
4
5
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>1.5</version>
</dependency>

使用

  1. 通过密钥生成密文
  • 下载jasypt-1.9.2.jar生成
1
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI password=G0CvDz7oJn6 algorithm=PBEWithMD5AndDES input=root

结果

1
2
3
4
5
6
7
8
9
10
----ENVIRONMENT-----------------
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.171-b11

----ARGUMENTS-------------------
input: root
algorithm: PBEWithMD5AndDES
password: G0CvDz7oJn6

----OUTPUT----------------------
Gvkoz+sbFWiRe3ECtizV1A==
  • 代码生成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import org.jasypt.util.text.BasicTextEncryptor;
import java.util.UUID;

public class testTest {

public static void main(String[] args) {
testTest t = new testTest();
t.getPass();
}

/**
* 加密解密
*/
public void getPass() {
BasicTextEncryptor stringEncryptor = new BasicTextEncryptor();
//设置密钥
stringEncryptor.setPassword("tfa46e505nh4565e5o8adjg4a8e01by");

//加密数据
String url = stringEncryptor.encrypt("url");
String name = stringEncryptor.encrypt("username");
String password = stringEncryptor.encrypt("pwd");
//结果
System.out.println("-----------------url------------------");
System.out.println("ENC("+url+")");
System.out.println("-----------------name------------------");
System.out.println("ENC("+name+")");
System.out.println("-----------------pwd------------------");
System.out.println("ENC("+password+")");

//手动密文解密
password = password.replace("ENC(","");
password = password.replace(")","");
String decrypted = stringEncryptor.decrypt(password);
System.out.println("-----------------decrypt------------------");
System.out.println(decrypted);

//自动生成密钥
String uuid = UUID.randomUUID().toString().replaceAll("-","");
System.out.println("-----------------uuid------------------");
System.out.println(uuid);
}
}
  1. 配置文件
1
2
3
4
5
# 加密所需的salt(盐),和生成密文时使用的要一样
jasypt.encryptor.password=tfa46e505nh4565e5o8adjg4a8e01by
# 加密后的密文,使用ENC(...)包裹
spring.datasource.username=ENC(6eaMh/RX5oXUVca9ignvtg==)
spring.datasource.password=ENC(6eaMh/RX5oXUVca9ignvtg==)
  1. 开启加密

项目里没有使用@SpringBootApplication或者@EnableAutoConfiguration,可以手动在Configuration类上添加注解@EnableEncryptableProperties,来在整个环境的属性启用属性加密。


文章字数:840,阅读全文大约需要3分钟

IO分类

从操作对象上可分为

  1. 文件流(file):FileInputStream FileOutputStream FileReader FileWriter
  2. 字节数组(byte[]):ByteArrayInputStream ByteArrayOutputStream
  3. 字符数组(char[]):CharArrayReader CharArrayWriter
  4. 管道操作:PipedInputStream PipedOutputStream PipedReader PipedWriter
  5. 基本数据类型:DataInputStream DataOutputStream
  6. 缓冲操作:BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
  7. 打印:PrintStream PrintWriter
  8. 对象序列化反序列化:ObjectInputStream ObjectOutputStream
  9. 转换:InputStreamReader OutputStreWriter

从传输方式上可以分为

  • 字节流 InputStream OutputStream
  • 字符流 Reader Writer
    字节流采用的是单个字节传输,可以用于处理二进制。字符则是根据编码由数个字节组成的,人可以阅读文字、符号。字符流用来处理文本文件。

抽象类InputStream

方法 方法介绍
int read() 读取数据,返回一个字节。返回-1是读到文件末尾,正数强转就是相应的数据。
int read(byte b[]) 将读取到的数据放入byte数组b中,调用下一个方法实现的
int read(byte b[],int off,int len) 从off位置读取len字节长度放到byte数组中。返回-1是读取结束,正数则是读取字符数。
long skip(long n) 跳过指定个数的字节不读取
int available() 返回可读的字节数量
void close() 关闭流,释放资源
synchronized void mark(int readlimit) 标记读取位置,下次还可以从这里读取。通过markSupported()查看是否支持。
synchronized void reset() 重置读取位置为上次标记的位置
boolean markSupported() 判断当前流是否支持标记流。

抽象类OutputStream

方法 方法介绍
void write(int b) 写入一个字节,对应上面read的int。int的32个位中低8位才会写入,其它舍弃。
void write(byte b[]) 调用下面的方法,把数组中所有数据写入
void write(byte b[],int off,int len) 将byte数组从off位置开始,写入len长度。(读多少写多少的话就是read的返回值)
void flush() 强制刷新,将缓冲区数据写入。有缓冲在close前执行一下
public void close() 关闭输出流,流关闭后不能再输出数据了

抽象类Reader

方法 方法介绍
int read(java.nio.CharBuffer target) 读取字节到字符缓存中
int read() 读取单个字符
int read(char cbuf[]) 读取字符到指定的char数组中
int read(char cbuff[],int off,int len) 从off位置读取len长度的字符到char数组中
long skip(long n) 跳过指定长度的字符数量
boolean ready() 判断当前流是否可读
boolean markSupported() 判断当前流是否支持标记流
void mark(int readAheadLimit) 标记读取位置,下次可以返回这里从新开始读取。需要判断是否支持
void reset() 重置读取位置为上次mark标记的位置
void close() 关闭流释放相关资源

抽象类Writer

方法 方法介绍
void write(int c) 写人一个字符
void write(char cbuf[]) 写入一个字符数组
void write(char cbuf[],int off,int len) 从字符数组的off位置写入len数量的字符
void write(String str) 写入一个字符串
void write(String str,int off,int len) 从字符串的off位置写入len数量的字符
Writer append(CharSequence csq) 追加吸入一个字符序列
Writer append(CharSequence csq,int start,int end) 追加写入一个16位的字符
void flush() 强制刷新,将缓冲区中数据写入
void close() 关闭输出流,流关闭后不能再输出数据