AES-128解密函数
1 | /** |
主类
用来识别m3u8文件
1 | public static void main(String[] args) { |
1 | /** |
用来识别m3u8文件
1 | public static void main(String[] args) { |
涉及到的技术点
1 | window.downloadImage = function (url) { |
1 | window.downloadImage = function (url) { |
使用Subject currentUser = SecurityUtils.getSubject();
该条语句是获得当前的用户。
subject.login(AuthenticationToken token)
登陆。这种登陆是给shiro的认证机制登陆的。1 | AuthenticationToken token = |
boolean subject.hasRole("administrator")
boolean subject.isPermitted("user:create")
anon
所属类:org.apache.shiro.web.filter.authc.AnonymousFilter 没有参数,可以匿名使用。例如: /admin/** = anonauthc
所属类:org.apache.shiro.web.filter.authc.FormAuthenticationFilter 没有参数,需要认证(登陆)之后才能访问 例如:/user/** = authcauthcBasic
org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter 没有参数,表示需要通过HttpBasic验证。如果不通过验证,跳转到登陆页面。 例如: /user/** = authcBasiclogout
org.apache.shiro.web.filter.authc.LogoutFilter 注销登陆的时候,完成一定功能:任何现有的session都将会失效,任何身份都会失去关联。(web应用程序中,RememberMe cookie将被删除)noSessionCreation
org.apache.shiro.web.filter.authc.NoSessionCreationFiler 阻止在请求期间创建新的会话,保证无状态体验。perms
org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter 可以写多个。多个时加上引号。用逗号分隔。多个参数需要通过全部的参数才算通过。相当于isPermitedAll()方法。 例如:/admin/** = perms[user:add:] /admin/** = perms[“user:add:,user:delete:*”]port
org.apache.shiro.web.filter.authz.PortFilter 指定访问的端口。如果不匹配跳转到登陆界面。 例如:/admin/** = port[8080]rest
org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter 根据请求方法 例如:/admins/user/** = perms[user.method] method为post、get、delete等请求方法roles
org.apache.shiro.web.filter.authz.RolesAuthorizationFilter 角色过滤。判断当前用户是否指定角色。多个参数需通过所有的角色。 例如:/admins/** = roles[“admin,guest”]ssl
org.apache.shiro.web.filter.authz.SslFilter 使用协议为Httpsuser
org.apache.shiro.web.filter.authc.UserFilter 缓存必须存在用户?
,*
,**
。通配符匹配不了包括目录分隔符"\"
?
:匹配一个字符,如/admin?。将匹配/admin1,但是不匹配/admin 或 /admin/*
:匹配0个或n个字符串.如/admin* 匹配/admin、/admin123。但不匹配/admin/1、/admin/**
: 匹配路径中的0或n路径。如/admin/** 匹配/admin/a or /admin/a/bURL权限采取第一次匹配优先的方式。所以需要一些不要认证的路径放在前面。将需要认证的路径放在后面。否则会被覆盖的。
在shiro中我们需要提供两个对象(principals和credentials)用来完成身份的验证
principals
身份,主体的标识属性,可以是任何的属性。用户名、邮箱等。具备唯一性。可以有多个principals.但只有一个Primary principals。一般是用户名/邮箱/手机号credentials
证明/凭证。证明主体标识的,如密码和数字证书等。1、收集用户的身份/凭证。一般是从前端获得用户名和密码
2、调用Subject.login
进行登陆。失败会抛出响应的异常信息
3、创建自定义的Realm
类。继承org.apache.shiro.realm.AuthorizingRealm类。实现doGetAuthenticationInfo()
方法
官方给的认证示例代码:
1 | // let's login the current user so we can check against roles and permissions: |
1、首先调用 Subject.login(token) 进行登录,其会自动委托给SecurityManager
2、 SecurityManager 负责真正的身份验证逻辑;它会委托给Authenticator 进行身份验证;
3、 Authenticator 才是真正的身份验证者,Shiro API 中核心的身份认证入口点,此处可以自定义插入自己的实现;
4、 Authenticator 可能会委托给相应的 AuthenticationStrategy 进行多 Realm 身份验证,默认 ModularRealmAuthenticator 会调用AuthenticationStrategy 进行多 Realm 身份验证;
5、 Authenticator 会把相应的 token 传入 Realm,从 Realm 获取身份验证信息,如果没有返回/抛出异常表示身份验证失败了。此处可以配置多个Realm,将按照相应的顺序及策略进行访问。
在用户没有填写表单数据,没有产生输入框的焦点时点击提交。在提交前进行触发表单校验
调用element表单对象中的validateField(prop:string, callback)
函数来触发表单校验.
prop是需要校验的属性。与表单中的属性一致。该函数接收一个回调函数。入口参数是校验规则中的message
例子
1 | <el-form :model="dialogForm" ref="formData" :rules="rules" size="small" label-position="left" label-width="120px"> |
1 | <el-form-item label="考试标题:" prop="title"> |
1 | this.$refs.formData.validateField('title', err => { |
1 | title: [ |
对于一个int[][] array = new int[5][10];
获得行数int rows = array.lenght;
获得列数int columns = array[0].length;
1、equals()
比较的是对象的内容是否相等,而==
比较的是对象的引用是否不同。即==
比较的是内存地址。
例如
1 | String a1 = "Hello World"; |
结果:
1 | a1 == a2: true |
a1 和 a2的值Hello World都是放在常量区中。所以对应的内存地址都一样。所以== 和equals都是true
a3 和 a4是两个对象,对象的内存地址不一样。但是里面的值是一样的。
2、equals()是如何比较的?
Object类中equals的源码源码如下
1 | public boolean equals(Object obj) { |
比较的是对象的引用地址
String类中重写了equals方法
1 | public boolean equals(Object anObject) { |
第一个部分判断引用是否相等。引用相等则对象是同一个,里面的值就一定相等。
如果是两个对象,则取出两个对象的值一个一个的比较是否相等。
3、关于hashCode()
http://coding-geek.com/how-does-a-hashmap-work-in-java/
hashCode() 函数返回的是一个函数的hash值。两个对象相等则hashCode一定相等。两个hashCode() 相等则两个对象不一定相等。
为什么要重写hashCode()函数。因为有些集合框架是基于对象的hash值的。例如hashMap。如果不重写对象使用的都是父类生成的hash值。这样冲突变多,对于存储不利。
没有重写hashCode函数在hashMap中放置可能如下图所示
如果重写了hashCode()
提高了访问的效率和存储的效率。
1 |
Scanner类一般是用来接收从控制台传进去的数据的。但是往往不能使用Scanner从控制台获得想要的数据。。
需求描述将1 2 3 4 5 6 7
从控制台转成数组对象。
使用如下的代码是跳不出来循环的
1 | Scanner cin = new Scanner(System.out); |
另外一种思路:
将控制台的输入当成一个字符串。获得该字符串之后再进行解析。
用空格进行正则分割.然后再依次的赋值
1 | int[] arr = new int[100]; |
redis是运行在内存的软件。速度快,完全基于内存。使用C语言实现,网络层使用epoll解决高并发问题。单线程模型,避免不必要的上下文切换和竞争条件浪费资源。Redis可以用在下面的场景。
1、缓存。常用的功能
2、数据排序 使用Redis的SortSet数据结构能够非常方便搞定
3、计算器/请求限流 秒杀的时候,将数据缓存在Redis中。减少数据库的频繁读写。
4、使用集合的命令获得相关的数据
5、简单的消息队列。使用Redis的list实现消息队列
6、Session共享、token实现单点验证
Redis提供8种数据类型,常用的主要是String、Hash、List、Set、SortSet这5种类型。另外还有BitMap-位图、HyperLogLog、GEO-地理信息定位。
存储的为Key-Value的值。
./redis-server ../redis.conf
./redis-cli
> set mykey myvalue
> exists mykey
> get mykey
> type mykey
> keys my*
> del key
> del key*
> randomkey
> clear
> rename newkey oldkey
> dbsize
> expire key 20
设置key值20秒后过期> ttl key
查看key的值还有多少秒过期> flushdb
> flushall
> config get requirepass
> config set requirepass test123
> auth test123
> config get requirepass
1 | 1) "requirepass" |
> config get *max-*-entries*
1 | 1) "hash-max-ziplist-entries" |
> config resetstat
> info server
> info client
> info memory
> info persistence
> info stats
> info replication
> info cpu
requirepass
后面加上需要验证的密码1 | requirepass test1234 |
auth test1234
来验证了multi
命令开启一个事务exec
命令批量执行操作save
命令 set key-name value
如果key存在则修改里面的值,如果不存在就添加
get key-name
del key-name
setex key-name 10 value
设置key的过期时间为10秒
mset key-name1 value1 key-name2 value2
mget key-name1 key-name2
hset key-name hash-key hash-value
例如:hset user name "smith"
添加一个hash表的名字为user,其中user中有[name=”smith”]的键值对
hget key-name hash-key
例如:hget user name
查询user中key为name的值
hgetall key-name
hmset key-name hash-key1 hash-value1 hash-key2 hash-value2
hlen key-name
返回该Hash表的键值对数量
hexist key-name hash-key
lpush/rpush key-name value1 value2 value3
其中lpush从左边插入数据,rpush从右边插入数据
lpop/rpop key-name
弹出列表最左边/右边的值。
lrange key-name start stop
遍历下标为[start,stop]的数据
例如:lrange city 0 -1
遍历全部数据
llen key-name
Set是String类型的无序集合,元素值不能重复
sadd key-name value1 value2
smembers key-name
获得所有数据
sisexist key-name member
srem key-name member
zset类型可以排序,每个值都有对应的score,可以进行集合间的操作
zadd key-name score1 member1 score2 member2
zrem key-name member [member2...]
使用[]来标识里面的内容为可选内容
zcard key-name
zscore key-name member
zincrby key-name increase-num member
给成员的分值加上increase-num的值,可为正,可为负。
zcount key-name min max
返回分值介于[min,max]区间的成员
(1) zrank key-name member
返回成员在集合中的排名,按照分值从小到大排
(2)zrevrank key-name member
返回成员的排名,按照分值从大到小排
(1) zrange key-name start stop [WITHSCORES]
返回排名处于[start stop]区间内的成员,withscores选项会返回成员的分值。成员按照分值从小到大排序
(2) zrevrange key-name start stop [WITHSCORES]
和zrange
一致,区别是按照分值从大到小排序
(1)zrangebyscore key-name min max [WITHSCORES] [LIMIT offset count]
返回分数处于[min,max]区间的成员,按照分数从小到大排列
(2)zrevrangebyscore key-name min max [WITHSCORES] [LIMIT offset count]
和(1)中的作用一致,不同的是成员按照分数从大到小排列
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
例子:zset zkey3 2 zkey1 zkey2
zkey3放置zkey1和zkey2进行交运算之后的结果。其中2表示有两个集合。
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
相同的成员分数相加。
引入redis的依赖
1 | <dependency> |
1 | # Redis 配置 |
1、在启用类的类头哪里使用@EnableCaching
注解开启redis
2、获得redis的模板对象
1 | /** |
3、在bean的构造函数中初始化模板。主要是用来设置序列化的方式
1 | @PostConstruct |
初始化方法如下
1 | /** |
4、使用redis的模板来操作redis
涉及到的函数为
boolean hashKey = redisTemplate.hasKey(key)
判断redis中是否含有key值1 | ValueOperations<String,Dictionary> operations = redisTemplate.opsForValue(); |
operations.set(key,dictionary,timeout,TimeUnit.HOURS);
dictionary
为设置到缓存的对象。会被序列化为stirng类型。timeout
为过期时间,long类型TimeUnit.HOURS
是timeout的单位.可以设置纳秒、微秒、分钟、小时、天等。PROPERGATION_MANDATORY
方法必须运行在一个事务中,如果当前事务不存在,就抛出异常PROPAGATION_NESTED
如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和PROPAGATION_REQUIRED
没有什么两样。PROGATION_NEVER
方法不能运行在一个事务中,否则会抛出异常PROGATION_NOT_SUPPORTED
方法不能运行在一个事务中,如果当前存在事务,那么该方法将被挂起PROGATION_REQUIRED
当前方法必须运行在一个事务中,如果存在事务,则运行在该事务中,否则创建一个新的事务PROGATION_REQUIRES_NEW
必须运行在自己的事务中,如果当前存在一个事务,那么这个事务将在该方法运行期间被挂起PROGATION_SUPPORTS
当前方法不需要运行在一个事务中,如果有一个事务存在,该方法也可以运行在这个事务中。ISOLATION_DEFAULT
后端数据库默认的隔离级别ISOLATION_READ_UNCOMMITTED
允许读取未提交的数据。可能导致脏读、不可重复读、幻读(未提交读)ISOLATION_REPEATABLE_READ
一个事务不可能更新由另一个事务修改但未提交(回滚)的数据。(对应不可重复读),可避免脏读、不可重复读、但无法避免幻读ISOLATION_SERIALIZATABLE
所有的事务都在一个执行队列中,依次顺序执行,而不是并行(可序列化)。可以避免脏读、不可重复读、幻读。但效率低READ_ONLY_MARKER
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true