SpringSecurity
一、SpringSecurity框架简介1.1 概要的关于安全方面的两个主要区域是“认证”和“授权”(或者访问控制),一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分,这两点也是 Spring Security 重要核心功能。
(1)用户认证指的是:验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码(现在有二维码、手机短信、指纹认证)。系统通过校验用户名和密码来完成认证过程。通俗点说就是系统认为用户是否能登录
(2)用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。通俗点讲就是系统判断用户是否有权限去做某些事情。
1.2 会话用户认证通过后,为了避免用户的每次操作都进行认证可将用户的信息保证在会话中。会话就是系统为了保持当前用户的登录状态所提供的机制,常见的有基于session方式、 ...
swagger2
一、Swagger简介Swagger2 是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的web服务。
接口文档对于前后端开发人员都非常重要。Swagger可以使得接口文档动态生成
OpenApi:是REST API的api描述格式
每个访问地址类型。POST(写)或者GET(读)
每个操作的参数,包括输入输出参数
认证方法
连接信息,声明,使用团队和其他信息。
Open API规范可以使用YAML或JSON格式进行编写。
Open API规范为REST API定义了一个与语言无关的标准接口。
Swagger2的组件:
Swagger Editor:基于浏览器编辑器,可以在里面编写Open API规范。配置中出现->定制文档
Swagger UI:将Open API规范呈现为交互式API文档,用可视化UI展示描述文件。
Swagger Codgen:将Open API规范生成为服务器存根和客户端库。
Swagger Inspector:跟ui有点类似,但是可以返回更多信息,也可以保存请求的实际参数数据。
Swagger Hub:集成上面所有项目的各个功 ...
java并发编程实战--第四部分 高级主题
第十三章、显示锁13.1 Lock 和ReentrantLocklock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作。为什么要创建一种与内置锁如此相似的新加锁机制?在大多数情况下,内置锁都能很好地工作,但在功能上存在一些局限性,例如,无法中断一个正在等待获取锁的线程,或者无法在请求获取一个锁时无限地等待下去。内置锁必须在获取该锁的代码块中释放,这就简化了编码工作,并且与异常处理操作实现了很好的交互,但却无法实现非阻塞结构的加锁规则。这些都是使用synchronized的原因,但在某些情况下,一种更灵活的加锁机制通常能提供更好的活跃性或性能。
123456789Lock lock = new ReentrantLock () ;...lock.lock ( ) ;try { //更新对象状态 //捕获异常,并在必要时恢复不变性条件}finally {lock.unlock ( ) ;
轮询锁与定时锁由tryLock实现
如果不能获得所有需要的锁,那么可以使用可定时的或可轮询的锁获取方式,从而使你重新获得控制权,它会释放已经获得的销.然后重新尝 ...
java并发编程实战--第三部分 活跃性、性能与测测
十、避免活跃性危险10.1 死锁
锁顺序死锁:一个锁先锁left 在锁right,另一个锁先锁right再锁left,会发生死锁。
动态的锁顺序死锁
有时候,并不能清楚地知道是否在锁顺序上有足够的控制权来避免死锁的发生。
123456789101112131415//注意:容易发生死锁!//看似无害的代码,它将资金从一个账户转入另一个账户。在开始转账之前,首先要获得这两个Account对象的锁,以确保通过原子方式来更新两个账户中的余额,同时又不破坏一些不变性条件,例如“账户的余额不能为负数”。public void transferMoney (Account fromAccount, Account toAccount ,Dol1arAmount amount) throws InsufficientFundsException { synchronized (fromAccount) { synchronized (toAccount) { if (fromAccount.getBalance( ).compa ...
java并发编程实战--第二部分 结构化并发应用程序(2)
八、线程池的使用8.1 在任务与执行策略之间的隐性耦合Executor框架可以将任务的提交和任务执行策略解耦。但有些任务需要明确指定执行策略:
依赖性任务。大多数行为正确的任务都是独立的:它们不依赖于其他任务的执行时序、执行结果或其他效果。当在线程池中执行独立的任务时,可以随意地改变线程池的大小和配置,这些修改只会对执行性能产生影响。然而,如果提交给线程池的任务需要依赖其他的任务,那么就隐含地给执行策略带来了约束,此时必须小心地维持这些执行策略以避免产生活跃性问题
使用线程封闭机制的任务。
对响应时间敏感的任务。
使用ThreadLocal的任务
线程饥饿死锁在线程池中,如果任务依赖于其他任务,那么可能产生死锁。在单线程的Executor中,如果一个任务将另一个任务提交到同一个Executor,并且等待这个被提交任务的结果,那么通常会引发死锁。第二个任务停留在工作队列中,并等待第一个任务完成,而第一个任务又无法完成,因为它在等待第二个任务的完成。在更大的线程池中,如果所有正在执行任务的线程都由于等待其他仍处于工作队列中的任务而阻塞,那么会发生同样的问题。这种现象被称为线程饥饿死锁( ...
java并发编程实战--第二部分 结构化并发应用程序(1)
六、任务执行6.1 在线程中执行任务大多数服务器应用程序都提供了一种自然的任务边界选择方式:以独立的客户请求为边界。Web服务器、邮件服务器、文件服务器、EJB容器以及数据库服务器等,这些服务器都能通过网络接受远程客户的连接请求。将独立的请求作为任务边界,既可以实现任务的独立性,又可以实现合理的任务规模。
串行的执行任务在单个线程中串行执行各项任务。
123456789class singleThreadwebServer { public static void main (string[] args) throws IOBxception { serversocket socket = new serverSocket (8o ) ; while (true){ socket connection = socket .accept ( ) ; handleRequest(connection) ; } }}
它每次只能处理一个请求。在单 ...
Git-廖雪峰
Git教程次教程基于https://www.liaoxuefeng.com/wiki/
Git简介集中式版本控制系统:版本库存放在中央服务器,用自己的电脑干活,类似于图书馆,必须互联网才能工作,CVS,SVN。
分布式版本控制系统:每个人的电脑都是一个完整的版本库,工作的时候不需要联网,安全性高的多
安装Git在Linux上安装Git首先,你可以试着输入git,看看系统有没有安装Git:
123$ gitThe program 'git' is currently not installed. You can install it by typing:sudo apt-get install git
Debian或Ubuntu Linux,通过一条sudo apt-get install git就可以直接完成Git的安装,非常简单。
老一点的Debian或Ubuntu Linux,要把命令改为sudo apt-get install git-core,因为以前有个软件也叫GIT(GNU Interactive Tools),结果Git就只能叫git-core了。由 ...
redis-应用实践
Redis深度历险:核心原理和应用实践应用1:千帆竞发–分布式锁要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。如果这样的操作同时进行了,就会出现并发问题,因为读取和保存状态这两个操作不是原子的。
原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束
这个时候就要使用到分布式锁来限制程序的并发执行。
分布式锁分布式锁本质上要实现的目标就是在 Redis 里面占一个“茅坑”,当别的进程也要来占时,发现已经有人蹲在那里了,就只好放弃或者稍后再试。
占坑一般是使用 setnx(set if not exists) 指令,只允许被一个客户端占坑。先来先占, 用完了,再调用 del 指令释放茅坑。
12345> setnx lock:codehole trueOK... do something critical ...> del lock:codehole(integer) 1
如果逻辑执行到中间出现异常了,可能会导致 del 指令没有被调用,这样就会陷入死锁,锁永远得不到释放。
于是我们在拿到锁之后,再给锁加上一个过期时 ...
leetcode-动态规划
53 最大子序和
如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字每次比较 sum 和 ans的大小,将最大值置为ans,遍历结束返回结果
123456789101112131415public class leet_53 { public int maxSubArray(int[] nums) { int ans = nums[0];//最大子序和 int sum = 0; //当前位置的子序和 for (int num : nums){ if (sum > 0){ sum += num; }else { sum = num; } ans = Math.max(a ...
海康威视
3x0.1 = = 0.3false
123x0.1 = 0.300000000000004 计算机存储问题0.3
非检查性异常空指针异常
类的访问权限,同一包的类和子类可以访问protected: 类+子类private: 类public: all无: 包内
排序的顺序对排序算法没有影响堆排序,归并排序
以下对JDBC事务描述错误的是JDBC右connection发起可控制
关于Servlet说法错误的是A.Servlet的生命周期由Servlet实例控制 (创建 Servlet 实例后响应客户请求直至销毁的全过程.)
B.init()方法在创建完Servlet实例后对其进行初始化,传递的参数为实现ServletContext接口的对象
C.service()方法响应客户端发出的请
D.destroy()方法释放Servlet实例 (销毁)
选c
多选
在数据库操作中,如果不考虑事务的隔离性,会发生下面哪种情况
脏读:A事务中读取到了B事务中未提交的数据,造成数据错误
不可重复读:A事务中读取到了B事务中已提交的数据,在特定情景下会产生影响,比如生成统一的数据报表
虚读( ...