Shiro
基本使用
Authentication:身份认证/登录,验证用户是不是拥有相应的身份
Authorization:权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能进行什么操作(如:验证某个用户是否拥有某个角色)
Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中会话可以是普通 JavaSE 环境,也可以是 Web 环境的
Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储
Web Support:Web支持,可以非常容易的集成到 Web 环境
Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率
Concurrency:Shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去
Testing:提供测试支持
Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问
Remember Me:记住我,即一次登录后,下次再来的话不用登录
依赖12345678910 ...
EasyExcel
EasyExcel特点采用一行一行的解析模式,并将一行的解析结果以解析者的模式通知处理
概念
整个excel称为 workbook
每个 workbook 里面有 sheet
每个 sheet 有 行 列 单元格
引入依赖123456<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.1</version></dependency>
写操作创建实体类(和excel对应),设置表头和添加的数据字段
12345678910111213141516171819202122public class TestWrite { public static void main(String[] a ...
MySQL专题
InnoDB的缓冲池缓存什么?有什么用?缓存表数据与索引数据,把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO,起到加速访问的作用
什么是预读?磁盘读写,并不是按需读取,而是按页读取,一次至少读一页数据(一般是4K),如果未来要读取的数据就在页中,就能够省去后续的磁盘IO,提高效率。
传统的LRU是如何进行缓冲页管理?
栈与队列题目
理论基础栈的特点:先进后出
栈提供了push和pop等接口,所有元素都必须符合先进后出的规则
可以理解为:栈是以底层容器完成其所有的工作,堆外提供统一的接口,我们可以选择用各种容器来实现栈的功能
java中栈的常见方法
队列的特点:先进后出
实际上是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作
java中队列的常见方法
用栈实现队列定义两个栈,一个出栈(output),一个入栈(input),当元素进入队列时,先让元素全部进入名为input的栈,然后再让元素全部从input中pop出来,进入output栈,实现队列先进先出的特点
注意:当output栈为空时,就将input栈全部弹出并压入output栈中,然后output进行出栈操作。如果input栈没有全部弹出,就无法实现队列的特点
1234567891011121314151617181920212223242526272829303132333435class MyQueue { private Stack<Integer> input; ...
java基础专题
包装类缓存问题在 JDK 5 以后,几种包装类对象在内部实现中通过使用相同的对象引用实现了缓存和重用。
例如:Integer类型对于-128-127之间的数字是在缓冲区取的,所以对于在这个范围内的数值用双等号(==)比较是一致的,因为对应的内存地址是相同的。但对于不在这区间的数字是在堆中 new 出来的,所以地址空间不一样,也就不相等
Byte、Short、Integer、Long 缓存范围:[-128,127]
Character 缓存范围:[0,127]
Boolean 直接返回 True Or False
注意:浮点数类型的包装类 Float 和 Double 并没有实现常量池技术
Boolean部分源码12345678910111213// 一开始就定义 TRUE FALSE 两个常量public static final Boolean TRUE = new Boolean(true);public static final Boolean FALSE = new Boolean(false);// 很少使用此构造函数, 非必须时推荐使用静态工厂public Bool ...
链表题目
解析未补充理论基础链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null
删除节点删除D结点,只需要将C结点的下一个结点指向E结点即可
添加节点只需要将C结点的下一个结点指向新结点,新结点下一个结点指向D结点
注意:链表的增添和删除都是O(1)操作,也不会影响到其他节点
但是如果要删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是O(n)
题目反转链表
双指针1234567891011public ListNode reverseList(ListNode head) { ListNode temp = head; ListNode pre = null; while (temp != null) { ListNode next = temp.next; temp.next = pre; pre = temp; temp = next; ...
前端入门
结合MDN食用
HTML常见元素文本123456<h1>1号标题</h1><h2>2号标题</h2><h3>3号标题</h3><h4>4号标题</h4><h5>5号标题</h5><h6>6号标题</h6>
段落1<p>段落</p>
无序列表-ul12345<ul> <li>列表项1</li> <li>列表项2</li> <li>列表项3</li></ul>
有序列表-ol12345<ol> <li>列表项1</li> <li>列表项2</li> <li>列表项3</li></ol>
多级列表-嵌套使用1234567891011121314151617<ul> <li ...
Netty入门
概述Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端
注意:Netty的异步还是基于多路复用的,并没有实现真正意义上的异步IO
优势
入门案例添加依赖12345<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.39.Final</version></dependency>
服务器步骤1、创建启动器类,添加组件(NioEventLoopGroup)
2、添加一个ServerSocketChannel的实现
3、添加处理器和初始化器
4、绑定监听端口
1234567891011121314151617181920212223242526272829303132333435363738public class HelloServer { public static void ...
数组题目
双指针通过一个快指针和慢指针在一个for循环下完成两个for循环的工作
移除元素
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置
当快指针与移除的目标值相等时,将快指针向前移动一位,慢指针保持不变,此时慢指针指向的就是需要被替换的数组下标位置
当快指针与移除的目标值不相等时,因为此时慢指针指向的是需要被替换的数组下标位置,所以将快指针的值赋给慢指针,完成覆盖,最后再将慢指针移动一位
123456789public int removeElement(int[] nums, int val) { int slow = 0; for (int fast = 0; fast < nums.length; fast++) { if (nums[fast] != val) { nums[slow++] = nums[fast]; } } return slow;}
删除有序数组中的重复项
比较 ...
Netty-NIO基础
NIO概念概念:non-blocking io 即非阻塞的IO
三大组件Channel与Bufferchannel类似与stream,是读写数据的双向通道,可以从channel读取数据到buffer,也可以将buffer的数据读取到channel
常见的channe
FileChannel:文件传输
DatagramChannel:UDP网络编程传输对象
SocketChannel:TCP网络编程传输对象(客户端+服务器端)
ServerSocketChannel(服务器端)
buffer用来缓冲读写数据
常见的buffer有
ByteBuffer
MappedByteBuffer
DirectByteBuffer
HeapByteBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
CharBuffer
Selector多线程版设计一个客户端表现为一个socket,当有多个socket则开启多个连接,当连接数过多时内存消耗严重
缺点:内存占用高,线程上下文切换版本高,只适合连接数较少的 ...