0%

整理下 Spring 项目中读取 resources 下的文件的方式,包括 Resource 接口,另外跟一下 ResourceUtils 读取资源文件的流程。

File 方式读取

直接使用 File 类的接口读取资源文件,需要注意的是传入应是相对路径,生成的项目文件中资源文件的路径可以参考 target 目录下的结构。比如,资源文件目录下的文件 resources/static/test.html,在生成的 target 目录下路径是:target/classes/static/test.html

阅读全文 »

昨天看了下 Spring Security 的使用,打着断点弄清了认证的流程。

首先,可以了解下涉及到的关键的几个类,形成一个整体的了解。

主要的类

  1. Authentication

Authentication接口,子类有 AbstractAuthenticationToken,直接用的实现常是 UsernamePasswordAuthenticationToken 类,用于保存认证信息,最重要的字段有:

  • principal

对应用户名之类的用户ID。

  • credentials

根据用户信息加密生成的凭证,用于认证。

阅读全文 »

在 spring boot 项目中使用了 redis,在此对 RedisTemplate 的使用做个记录,另外在腾讯云上安装了 redis 作为缓存服务器进行了测试。

RedisTemplate 的使用

首先,redis 提供了 RedisTemplate<Object,Object> 和 StringRedisTemplate 两个默认实现,其中 StringRedisTemplate 继承自 RedisTemplate。 RedisTemplate<Object,Object> 使用序列化的方式存储 key 和 value,StringRedisTemplate 则是一个 key 和 value 都是 String 的 RedisTemplate<String,String>。

对以上两个类的使用不再叙述。看一下以下错误的解决情况,并对应源码简单分析:

阅读全文 »

协议的体系结构

OSI七层协议

  • 物理层
  • 数据链路层
  • 网络层
  • 传输层
  • 会话层
  • 表示层
  • 应用层

TCP/IP体系结构

  • 网络接口层
  • 网际层
  • 运输层(TCP/UDP)
  • 应用层

五层协议

  • 物理层
  • 数据链路层
  • 网络层
  • 运输层
  • 应用层
阅读全文 »

自己很久以来一直想做个局域网内传输文件的程序,一直没有动手。这次学习了一下要用到的局域网内的socket通信,在此做个记录。

局域网内的socket通信

并无特别之处,只是需要使用内网IP来建立连接。服务端开启一个ServerSocket,监听特定的端口,获取输出流向客户端写入数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
try {
ServerSocket serverSocket = new ServerSocket(9998);
// 也可以绑定监听的IP,应为内网IP
//ServerSocket serverSocket = new ServerSocket(9998, 50, InetAddress.getByName("xx.xx.xx.xx")); // xx.xx.xx.xx 为本机的内网IP
while (true) {
Socket s = serverSocket.accept();
PrintWriter pw = new PrintWriter(s.getOutputStream());
pw.println("hello world");
pw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}

客户端向服务端的”内网IP:指定端口“发送连接请求,读写数据,

阅读全文 »

使用 JDBC 可以方便的操作各种类型的数据库。以下记录一下 JDBC 的基础操作。

连接数据库

使用 DriverManager 建立 Connection

安装数据库服务和导入相应的 jar 包后,即可使用 JDBC 连接到数据库,得到一个 Connection 对象。

首先需要加载驱动程序,比如对于 mysql 数据库,可以使用如下代码加载驱动:

1
Class.forName("com.mysql.jdbc.Driver");
阅读全文 »

使用mysql 8版本,搭建一主一从

  • 主节点:192.168.226.130,mysql端口:3306
  • 从节点:192.168.226.137,mysql端口:3306
  • 主节点mysql同步用户:repl,密码:repl.123
阅读全文 »

在java并发编程实战的4.2节“实例封闭”里介绍了通过封闭机制确保线程安全,这里结合 java SynchronizedList 来了解下这一实现过程。

当需要将一个 List 包装为线程安全时,可以如下调用:

1
2
List l = new LinkedList();
List l2 = Collections.synchronizedList(l);

之后通过 l2 对 l 的一切操作都将是线程安全的。

阅读全文 »

使用FileChannel读写文件,我们只需要关注缓冲区Buffer,只需要对Buffer进行读写操作。

我们关注的只是Buffer的读写,

当需要向文件中写入数据时,将数据写入Buffer,然后使用Channel读取Buffer中的内容写出到文件。对于Buffer,这是一个“写入——读取”的过程。

当需要从文件中读取数据时,使用channel读取文件的内容写入到Buffer,然后读取Buffer的数据。对于Buffer,这是一个“写入——读取”的过程。

阅读全文 »

java 序列化和反序列化过程中,留下了一些方法作为钩子,可以让我们自定义序列化和反序列化的流程和结果,主要是两组五个 Method,在要实现序列化的类中定义这些方法,运行中将通过反射调用。

writeObject()、readObject()、writeReplace() 与 readResolve()

1
2
3
private void writeObject(java.io.ObjectOutputStream out) throws IOException
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
private void readObjectNoData() throws ObjectStreamException;

writeObject 和 readObject 方法分别负责写入和读取对象状态,readObjectNoData 负责初始化对象状态。

阅读全文 »