lightquant.com


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 搜索

JAVA泛型

发表于 2018-01-15 | 分类于 JAVA

一、介绍

泛型只在编译阶段有效。
泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法。
Java泛型中常用的标记符含义:

  • E - Element (在集合中使用,因为集合中存放的是元素)
  • T - Type(Java 类)
  • K - Key(键)
  • V - Value(值)
  • N - Number(数值类型)
  • ? - 表示不确定的java类型

泛型判断:T instanceof Object

二、泛型的使用

1. 泛型类

泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map。

举例:

1
2
3
4
5
6
7
8
9
10
11
12
public class Test<T>{ 

private T key;

public Test(T key) {
this.key = key;
}

public T getKey(){
return key;
}
}

2. 泛型接口

泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中,可以看一个例子:

定义一个泛型接口

1
2
3
public interface Generator<T> {
public T next();
}

当实现泛型接口的类,也要定义泛型,不然会报错

1
2
3
4
5
6
7
8
9
10
11
/**java
* 未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中
* 即:class FruitGenerator<T> implements Generator<T>{
* 如果不声明泛型,如:class FruitGenerator implements Generator<T>,编译器会报错:"Unknown class"
*/
class FruitGenerator<T> implements Generator<T>{
@Override
public T next() {
return null;
}
}

传入泛型实参就不会

1
2
3
public class FruitGenerator implements Generator<String> {
//...
}

3. 泛型通配符

定义一个泛型通配符方法

1
2
3
public void showKeyValue1(Generic<?> obj){
Log.d("泛型测试","key value is " + obj.getKey());
}

?代表 当具体类型不确定的时候,这个通配符就是 ?

1
2
3
List<? extends Number> eList = null;
eList = new ArrayList<Integer>();
eList = new ArrayList<Long>();

4. 泛型方法

定义一个泛型方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 泛型方法的基本介绍
* @param tClass 传入的泛型实参
* @return T 返回值为T类型
* 说明:
* 1)public 与 返回值中间<T>非常重要,可以理解为声明此方法为泛型方法。
* 2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
* 3)<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
* 4)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
* 泛型的数量也可以为任意多个
* 如:public <T,K> K showKeyName(Generic<T> container){
* ...
* }
*/
public <T> T genericMethod(Class<T> tClass)throws InstantiationException ,
IllegalAccessException{
T instance = tClass.newInstance();
return instance;
}

5. 泛型方法与可变参数

T… args

6. 静态方法与泛型

如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方法 。

参考:
http://blog.csdn.net/s10461/article/details/53941091/

MySql常用

发表于 2018-01-11 | 分类于 数据库

常用

1. 常用函数

DATE_ADD(date,INTERVAL i keyword)
返回date加上 i 时期
keyword可以为:
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR

DATE_SUB(date,INTERVAL i keyword) 与上面相反

DATE_FORMAT(create_date,’%H%i’)
时间格式化:
%Y %D %M %h:%i:%s %Y%m%d

MONTHNAME(date) 返回date的月份名(英语月份,如October)
DAYNAME(date) 返回date的星期名(英语星期几,如Saturday)
NOW() 返回当前的日期和时间 如:2016-10-08 18:57:39
CURDATE()或CURRENT_DATE() 返回当前的日期
CURTIME()或CURRENT_TIME() 返回当前的时间
QUARTER(date) 返回date在一年中的季度(1~4)
WEEK(date) 返回日期date为一年中第几周(0~53)
DAYOFYEAR(date) 返回date是一年的第几天(1~366)
DAYOFMONTH(date) 返回date是一个月的第几天(1~31)
DAYOFWEEK(date) 返回date所代表的一星期中的第几天(1~7)
YEAR(date) 返回日期date的年份(1000~9999)
MONTH(date) 返回date的月份值(1~12)
DAY(date) 返回date的天数部分
HOUR(time) 返回time的小时值(0~23)
MINUTE(time) 返回time的分钟值(0~59)
SECOND(time) 返回time的秒值(0-59)
DATE(datetime) 返回datetime的日期值
TIME(datetime) 返回datetime的时间值

TO_DAYS(create_date)
返回从0年开始 到date之间的天数

2.系统表

DATABASE() 返回当前数据库名
BENCHMARK(count,expr) 将表达式expr重复运行count次
CONNECTION_ID() 返回当前客户的连接ID
FOUND_ROWS() 返回最后一个SELECT查询进行检索的总行数
USER()或SYSTEM_USER() 返回当前登陆用户名
VERSION() 返回MySQL服务器的版本

MySQL常用系统表大全:
http://blog.csdn.net/xlxxcc/article/details/51754524

3.连接查询

INNER JOIN:如果表中有至少一个匹配,则返回行
LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
FULL JOIN:只要其中一个表中存在匹配,则返回行

4.优化速度

MySQL数据库优化的八种方式(经典必看)
https://www.cnblogs.com/zhyunfe/p/6209074.html

https://blog.csdn.net/u014421556/article/details/52063904

centOS 7 安装mysql

1.使用安装命令 :yum -y install mysql mysql-server mysql-devel
安装完成却发现Myserver安装缺失,在网上找原因,原来是因为CentOS 7上把MySQL从默认软件列表中移除了,用MariaDB来代替,所以这导致我们必须要去官网上进行下载,找到链接,用wget打开:

a. wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm

b. rpm -ivh mysql-community-release-el7-5.noarch.rpm

c. yum -y install mysql mysql-server mysql-devel,安装成功。

启动服务
service mysqld start

进入客户端
mysql -u root -p 输入密

常用数据库操作

mysql数据库使用总结
本文主要记录一些mysql日常使用的命令,供以后查询。
1.更改root密码
mysqladmin -uroot password ‘yourpassword’
2.远程登陆mysql服务器
mysql -uroot -p -h192.168.137.10 -P3306
3.查询数据库
show databases;
4.进入某个数据库
use databasename;
5.列出数据库中的表
show tables;
6.查看某个表全部字段
desc slow_log;
show create table slow_log\G; (不仅可以显示表信息,还可以显示建表语句)
7.查看当前用户
select user();
8.查看当前所在数据库
select database();
9.创建新数据库(可以指定字符集)
create database db1 charset utf8;
10.创建新表
create table t1 (id int(4), name char(40));
11.查看数据库版本
select version();
12.查看数据库状态
show status; 当前会话状态
show global status; 全局数据库状态
show slave status\G; 查看主从数据库状态信息
13.查询数据库参数
show variables;
14.修改数据库参数
show variables like ‘max_connect%’;
set global max_connect_errors = 1000;(重启数据库会失效,要在配置文件中修改)
15.查看当前数据库队列
show processlist;
16.创建普通用户并授权给某个数据库
grant all on databasename. to ‘user1’@’localhost’ identified by ‘123456’;
17.查询表数据
select
from mysql.db; //查询该表中的所有字段
select count() from mysql.user; //count()表示表中有多少行
select db,user from mysql.db; //查询表中的多个字段
select * from mysql.db where host like ‘10.0.%’;在查询语句中可以使用万能匹配 “%”
18.插入一行数据
insert into db1.t1 values (1, ‘abc’);
19.更改表的某一行数据
update db1.t1 set name=’aaa’ where id=1;
20.清空表数据
truncate table db1.t1;
21.删除表
drop table db1.t1;
22.清空数据库中的所有表(数据库名是eab12)
mysql -N -s information_schema -e “SELECT CONCAT(‘TRUNCATE TABLE ‘,TABLE_NAME,’;’) FROM TABLES WHERE TABLE_SCHEMA=’eab12’” | mysql -f eab12
23.删除数据库
drop database db1;
24.数据库备份
mysqldump -uroot -p’yourpassword’ mysql >/tmp/mysql.sql
25.数据库恢复
mysql -uroot -p’yourpassword’ mysql </tmp/mysql.sql
26.新建普通用户
CREATE USER name IDENTIFIED BY ‘ssapdrow’;
27.更改普通用户密码
SET PASSWORD FOR name=PASSWORD(‘fdddfd’);
28.查看name用户权限
SHOW GRANTS FOR name;
29.脚本中执行mysql命令
mysql -uuser -ppasswd -e”show databases”
echo “show databases”|mysql -uuser -ppassword
以下是执行大量mysql语句采用的方式
mysql -uuser -hhostname -ppasswd << EOF
mysql语句
EOF

原文链接:
https://www.cnblogs.com/suxiaoman/p/7693066.html

MySQL创建用户与授权

一. 创建用户

命令:

CREATE USER 'username'@'host' IDENTIFIED BY 'password';
说明:

username:你将创建的用户名
host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%
password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
例子:

1
2
3
4
5
CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY '123456';
CREATE USER 'pig'@'%' IDENTIFIED BY '123456';
CREATE USER 'pig'@'%' IDENTIFIED BY '';
CREATE USER 'pig'@'%';

二. 授权:

命令:

GRANT privileges ON databasename.tablename TO 'username'@'host'
说明:

privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL
databasename:数据库名
tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用表示,如.*
例子:

1
2
GRANT SELECT, INSERT ON test.user TO 'pig'@'%';
GRANT ALL ON *.* TO 'pig'@'%';

注意:

用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令:

GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;

三.设置与更改用户密码

命令:

SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
如果是当前登陆用户用:

SET PASSWORD = PASSWORD(“newpassword”);
例子:

SET PASSWORD FOR 'pig'@'%' = PASSWORD("123456");

四. 撤销用户权限

命令:

REVOKE privilege ON databasename.tablename FROM 'username'@'host';
说明:

privilege, databasename, tablename:同授权部分

例子:

REVOKE SELECT ON *.* FROM 'pig'@'%';
注意:

假如你在给用户’pig’@’%’授权的时候是这样的(或类似的):GRANT SELECT ON test.user TO ‘pig’@’%’,则在使用REVOKE SELECT ON . FROM ‘pig’@’%’;命令并不能撤销该用户对test数据库中user表的SELECT 操作。相反,如果授权使用的是GRANT SELECT ON . TO ‘pig’@’%’;则REVOKE SELECT ON test.user FROM ‘pig’@’%’;命令也不能撤销该用户对test数据库中user表的Select权限。

具体信息可以用命令SHOW GRANTS FOR ‘pig’@’%’; 查看。

五.删除用户

命令:

DROP USER 'username'@'host';

原文链接:
https://www.jianshu.com/p/d7b9c468f20d

Oracle常用

发表于 2018-01-10 | 分类于 数据库

一、基本常用语句

1. 索引、主键、序列、权限

  1. 索引
    新建索引:create index 索引名 on 表名(列名,……)
    删除索引:drop index ttt;
    新建唯一索引:create unique index 索引名 on 表名(列名……)
    唯一索引用途:一个数据列,不能作为主键,而且允许为空,但是业务上要求唯一特性,这个时候用唯一性索引就是最好的旋转
  2. 主键
    新建主键:
    alter table 表名 add constraint 主键名 primary key(主键列)
    删除主键/外键:
    alter table drop constraint 主键名
    新建外键:
    alter table add constraint 外键名 foreign key(外键列) references 表名(列名)
  3. 序列
    创建序列:
    create sequence squ_t
    start with 1
    minvalue 1
    maxvalue 999
    increment by 1
    nocycle //是否循环,建议不使用
    nocache; //是否启用缓存。使用缓存可以提高sequence的访问效率
    序列属性:
    1.nextval : 返回下一个可用的序列值。
    就算是被不同的用户调用,每次也返回一个唯一的值。
    2.currval :获取序列当前的值。
    在currval调用之前,必须保证nextval已经获取过一次值。
    删除序列:
    drop sequence squ_t
  4. 权限:
    grant 权限等级(select,insert,update,delete) on 权限内容(table,视图,sequence,index) to (aaaaa)
    aaaaaa:
    public:对所有用户开放权限
    group 分组名:对该组所有用户开放权限
    username:对指定用户开放权限
    grant select on tablename to scott
    回收权限:
    revoke select on tablename from scott
  5. exists in区别:
    IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情

2.常用函数

  1. nvl(x1,x2)
    当x1为null时返回X2,否则返回x1
  2. instr(C1,C2,i,j)
    C1 被搜索的字符串
    C2 希望搜索的字符串
    I 搜索的开始位置,默认为1
    J 出现的位置,默认为1
    i为负数,从右边开始算起
  3. length()
    字符串长度
  4. ltrim(‘’,’’)
    左截取,对应右截取rtrim(‘’,’’)
    trim() 修剪
  5. substr(s,i,j)
  6. abs() 绝对值
  7. add_months(date,i)
    返回日期date加上i月的结果。i小数,直接向下取整
  8. last_day(d)
    返回d月的最后一天日期
  9. trunc(date,format)
    1.select trunc(sysdate) from dual –2011-3-18 今天的日期为2011-3-18
    2.select trunc(sysdate, ‘mm’) from dual –2011-3-1 返回当月第一天.
    3.select trunc(sysdate,’yy’) from dual –2011-1-1 返回当年第一天
    4.select trunc(sysdate,’dd’) from dual –2011-3-18 返回当前年月日
    5.select trunc(sysdate,’yyyy’) from dual –2011-1-1 返回当年第一天
    6.select trunc(sysdate,’d’) from dual –2011-3-13 (星期天)返回当前星期的第一天
    7.select trunc(sysdate, ‘hh’) from dual –2011-3-18 14:00:00 当前时间为14:41
    8.select trunc(sysdate, ‘mi’) from dual –2011-3-18 14:41:00 TRUNC()函数没有秒的精确
    Number 需要截尾取整的数字。
    Num_digits 用于指定取整精度的数字Num_digits 的默认值为 0。
    TRUNC()函数截取时不进行四舍五入
  10. to_char(data,format)
    to_char(oper_time,’yyyyMMddhh24’)
  11. DECODE(x,y,z,k,j,i)
    if (x==y) :z else if(x==k) :j else :i

3.其他常用:

  1. SQL执行顺序
    (8) SELECT (9) DISTINCT (11)
    (1) FROM
    (3) JOIN
    (2) ON
    (4) WHERE
    (5) GROUP BY
    (6) WITH {CUBE | ROLLUP}
    (7) HAVING
    (10) ORDER BY

二、系统内置表:

https://www.cnblogs.com/jiangxinnju/p/5840420.html

三、提高oracle查询效率

https://www.2cto.com/database/201301/181269.html

shell脚本常用

发表于 2018-01-09 | 分类于 Linux

一.内部常用命令

  1. echo 在屏幕上输出
    -n 不会换行
    -e 会识别换行符\n
  2. printf 产生各种格式的输出
  3. export 定义全局变量 export 变量名=变量值
  4. read 读入数据
    read -p “我是提示语句” file
    -t 指定等待时间
    -n指定字符串长度
    -s 隐藏输入的数据
    -p:输入提示符
  5. exec
    如:exec echo $a
    shell里,作为独立进程去执行该命令
  6. expr
    expr length “this is a test”
    expr substr “this is a test” 3 5
    expr index “sarasara” a
    expr 10 + 10 //+、-、、/、%
    expr 30 \
    3 //乘用 反斜杠*表示

二、控制、循环语句

1. if语句

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
cd ..
if [ -f test1.txt ]
then
echo test.txt is a fail;
cat test1.txt
elif [ -d shell ]
then
echo in shell is dir;
dir shell #打印出shell目录中的内容
fi

注意:

数值判断:
-eq 等于
-ge 大于等于
-gt 大于
-le 小于等于
-lt 小于
-ne 不等于
字符串判断(两边有个空格)
= 等于
!= 不等于
-z 字符串长度为零
-n 字符串长度不为零
文件测试
-d 如果文件存在且为目录,则为真
-e 如果文件存在
-f 如果文件存在且为普通文件
-r ….且可读
-w ….且可写
-x ….且可执行
-s ….且至少有一个字符

2.switch语句

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
cd ..
echo "please choice to display is file";
echo "1:display test.txt";
echo "2:display test1.txt";
echo enter your choice;
read -p "please in num:" var
case $var in
1) cat test.txt;;
2) cat test1.txt;;
*) echo error;;
esac

3.for语句

1
2
3
4
5
6
#!/bin/bash
for num in 1 2 3 4 5 6 7 8 9 10
do
echo $num is:
expr $num \* $num
done

4.while语句

1
2
3
4
5
6
7
8
9
#!/bin/bash
echo "please input number(gt 100 will quit)";
read num;
while [ $num -lt 100 ]
do
echo result:
expr $num \* $num;
read num;
done

5. until语句

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
echo "please input fileName:"
read filename;
echo "please input fileContent(in 'end! quit!!!'):"
read fileContent;
until [ $fileContent = "end!" ]
do
$fileContent >> $filename #写内容到这个文件去
echo "please input fileContent(in 'end! quit!!!'):" read fileContent
done

三、其他常用

  1. 引号含义:
    反引号:shell中 会首先执行反引号的代码
    单引号:不是解释,原封不动打印出来
    双引号:解释变量,而且保留空格
    没有引号:解释变量,不会保留空格
  2. $符号含义
    $#表示用户输入参数的个数
    $0 是脚本本身的名字
    $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
    $$ 是脚本运行的当前进程ID号
    $@
    $*
    $! 后台运行程序的pid
    都是代表说有, $@每一个会被区别对待
    num# 8# 16# 2# 代表进制
  3. 运算
    sum=$(($sum$i)) 等于 let “sum=sumi” == s
    $i == ${i}
  4. 小括号,中括号,双括号,大括号区别
    if ($i<5)

    1
    2
    3
    4
    5
    6
    7
    8
    if [ $i -lt 5 ]    
    if [ $a -ne 1 -a $a != 2 ]
    if [ $a -ne 1] && [ $a != 2 ]
    if [[ $a != 1 && $a != 2 ]]
    for i in $(seq 0 4);do echo $i;done
    for i in `seq 0 4`;do echo $i;done
    for ((i=0;i<5;i++));do echo $i;done
    for i in {0..4};do echo $i;done
  5. 注意
    shell脚本对空格有严格的规定,赋值语句等号两边不能有空格,而字符串比较,等号两边必须有空格

Linux高级

发表于 2018-01-09 | 分类于 Linux

sed命令

sed命令行格式为: sed [-nefri] ‘command’ 输入文本

  1. 常用选项:

-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
set -n ‘20,30p’ 文件 常与p结合使用
set -参数 ‘/条件/ c\ sfdasf’ 文件
-e∶直接在指令列模式上进行 sed 的动作编辑;
set -e -n 20,30p’
a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
sed ‘/100/ a bbb’ 文件
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
sed ‘/^9/d’ count.log
sed ‘100d’ count.log
sed ‘2,$d’ count.log
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
要替换时,如果“原内容”或“新内容”中含有特殊字符(比如”/”或者”#”等),可以使用其它符号把各部分隔开,比如以下几种格式都是正确的
sed -i ‘s,原内容,新内容,g’ 文件
sed -i ‘s#原内容#新内容#g’ 文件
sed -i ‘s:原内容:新内容:g’ 文件
sed -i ‘s~原内容~新内容~g’ 文件
匹配规则:
. 匹配任意一个字符
* 匹配0 个或多个*前的字符
^ 匹配行开头
$ 匹配行结尾

awk命令

  1. 格式

    格式:awk -F: ‘BEGIN {处理文件前执行的代码块} {处理文件过程中执行的代码块} END {处理文件后执行的代码块}’ filename
    如:
    cat count.log|awk ‘BEGIN{a=1;b=2}{print $(a+b)}END{print $1}’
    awk -F: ‘BEGIN {print “这是第一行”} {print $0} END {print “这是最后一行”}’
    print $1,$2 打印多个用逗号,$0代表整行。
    其中+和?只适用于awk而不适用于grep或sed:
    + 匹配一个或一个以上前面的单字符
    ? 匹配0个或一个前面的单字符
    举例:
    /XY+Z/ 匹配XYZ、XYYYYZ
    /XY?Z/ 匹配XYZ、XZ
    ~ 匹配正则表达式
    !~ 不匹配正则表达式

  2. awk有许多内置变量用来设置环境信息,常用的有

    ARGC 命令行参数个数
    ARGV 命令行参数排列
    ENVIRON 支持队列中系统环境变量的使用
    FILENAME awk读取的文件名
    FNR 当前文件已处理的记录行数
    FS 设置域分隔符,相当于-F
    NF 域的列数
    echo ‘/user/apache/conf/httpd.conf’|awk -F/ ‘{print $NF}’
    NR 已处理的记录总行数
    OFS 设置输出字段域分隔符
    RS/ORS 换行符

  3. 举例

    awk ‘{name=$1;belts=$4;if(belts ~ /Yellow/) print name “is belt “belts}’ grade.txt
    awk ‘{if($1==”ley”)$7=$7-40; print $0}’ grade.txt
    awk ‘BEGIN{print “Name\tDifference”}{if ($6<$7){$8=$7-$6;print $1,$8}}’ gra //模拟第8列出来
    awk ‘BEGIN {print “Name\tDifference”} {if ($6 < $7) {diff = $7 - $6; print $1,diff}}’ grade.txt //同上,不模拟列,直接给变量
    awk ‘total+=$6;END{print total}’ grade

    awk ‘{total+=$6;END{print total}}’ grade*
    //区别: 上面的所有内容就将会打印出来,下面的只会打印结果

  4. 函数

    awk有很多强大的字符串函数:
    gsub(r,s,t) 在整个字符串t中用字符串s替代所有满足正则表达式r的字符串(如没指定t则默认为$0)
    index(s,t) 返回字符串s中字符串t第一次出现的位置(如不存在则为0)
    length(s) 返回s字符串的长度(如没指定s则默认为$0)
    match(s,r) 返回第一个满足正则表达式r的字符串在s字符串里面的位置(如无匹配的则为0)
    split(s,a,sep) 使用sep将字符串s分隔成为数组a的元素,返回数组元素的数量(如果没指定分隔符则默认与FS相同用法)
    sprint(“fmt”,exp) 使用printf的格式说明对表达式exp 进行格式化输出
    sub(r,s,t) 在字符串t中用s字符串替换满足正则表达式r的第一个字符串,返回1如果成功,否则返回0(如没指定t则默认为$0)
    substr(s,p,n) 返回字符串s中以p位置开始长度为n的字符串(如果没指定n则返回从p位置开始的所有字符串)
    tolower(s) 将字符串s中的所有大写字母转换为小写,返回转换后的字符串
    toupper(s) 将字符串s中的所有小写字母转换为大写,返回转换后的字符串

vim

  1. 插入命令

    i 在当前位置生前插入
    I 在当前行首插入
    a 在当前位置后插入
    A 在当前行尾插入
    o 在当前行之后插入一行
    O 在当前行之前插入一行

  2. 查找命令

    ngg 12gg 跳转12行 或者 :12
    /xxx ?xxx 向上查找 向下查找
    ctrl + f 向下翻页 同 page down.
    ctrl + b 向上翻页 同 page up.
    ctrl + d 向下翻半页 此比较有用
    ctrl + u 向上翻半页 此比较有用
    ctrl + e 向下翻一行
    ctrl + y 向上一行
    跳到文本的最后一行:按“G”,即“shift+g”

  3. 其他常用

    u 撤销(Undo)
    Ctrl + r 重做(Rx 删除当前字符edo),即撤销的撤销。
    x 删除当前字符
    dd 删除当前行
    10d 删除当前行开始的10行。

其他常用

  1. 加载文件顺序

    etc/profile–>~/.bash_profile–>~/.bashrc–>/etc/bashrc

  2. source /etc/profile 重新加载该文件

Linux常用命令进阶

发表于 2018-01-09 | 分类于 Linux
  1. df命令(查看磁盘情况)


    1
    2
    3
    4
    5
    6
    7
    8
    df -i
    以inode模式来显示磁盘使用情况
    df -t ext3
    显示指定类型磁盘
    df -ia
    列出各文件系统的i节点使用情况
    df -h
    以更易读的方式显示目前磁盘空间和使用情况


  2. du命令


    1
    2
    3
    4
    5
    6
    7
    8
    du log30.tar.gz log31.tar.gz
    显示多个文件所占空间
    du -s
    只显示总和的大小
    du -ah test
    文件和目录都显示
    du -c log30.tar.gz log31.tar.gz
    显示几个文件或目录各自占用磁盘空间的大小,还统计它们的总和


  3. cp -R 连目录一起复制

  4. chmod命令


    1
    2
    3
    4
    5
    6
    7
    8
    u :目录或者文件的当前的用户
    g :目录或者文件的当前的群组
    o :除了目录或者文件的当前用户或群组之外的用户或者群组
    a :所有的用户及群组
    chmod 751 file
    给file的属主分配读、写、执行(7)的权限,给file的所在组分配读、执行(5)的权限,给其他用户分配执行(1)的权限
    chmod u=rwx,g=rx,o=x file
    同上


  5. chown命令


    1
    2
    3
    4
    5
    6
    7
    chown [选项]... [所有者][:[组]] 文件...
    chown mail:mail log2012.log
    改变拥有者和群组
    chown :mail log2012.log
    改变文件群组
    chown -R root:mail test6
    改变指定目录以及其子目录下的所有文件的拥有者和群组


  6. ftp命令


    1
    2
    3
    4
    5
    6
    7
    8
    9
    ftp 192.168.1.1
    get 路径 //下载文件
    mget *.* //下载多个文件
    put 1.htm /usr/your/2.htm
    把本地的1.htm传送到远端主机/usr/your,并改名为2.htm
    mput *.htm
    将本地主机中一批文件传送至远端主机。
    bye
    断开连接


  7. tar

    1
    2
    3
      -v :压缩的过程中显示文件!这个常用
    -c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。相当于打包。
    -f :使用档名,请留意,在 f 之后要立即接档
  8. grep 参数 查找条件 文件名。


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
      主要参数:
    -c:只输出匹配行的计数。
    -I:不区分大 小写(只适用于单字符。
    -l:查询多文件时只输出包含匹配字符的文件名。
    -n:显示匹配行及 行号。
    -s:不显示不存在或无匹配文本的错误信息。
    -v:显示不包含匹配文本的所有行。
    -r:**递归**文件夹查询。
    grep:
    . 匹配任意一个字符
    * 匹配0 个或多个*前的字符
    ^ 匹配行开头
    $ 匹配行结尾
    [options]主要参数:
    \: 忽略正则表达式中特殊字符的原有含义。
    ^:匹配正则表达式的开始行。
    $: 匹配正则表达式的结束行。
    \<:从匹配正则表达 式的行开始。
    \>:到匹配正则表达式的行结束。
    [ ]:单个字符,如[A]即A符合要求 。
    [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
    .:所有的单个字符。
    * :有字符,长度可以为0。


  9. env 显示当前用户变量,set显示全局变量

  10. cut

    1
    2
    -f列号:提取第几列
    -d分隔符:按照指定分隔符分隔列(默认是一个制表符当分隔符)
  11. sort排序


    1
    2
    3
    4
    5
    6
    7
    8
    9
    sort [选项]
    -f 忽略大小写
    -n 以数值型进行排序
    -r 反向排序
    -t 指定分隔符,默认是制表符
    -k n[,m] 按照指定的字段范围排序.从第n字段开始,m字段结束(默认到行尾)
    sort -n -t ":" -k 3,3 /etc/passwd
    sort -t ":" -k 3,3 /etc/passwd
    sort -r /etc/passwd


  12. find


    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
       find . -size 25k
    查找文件大小是25K的文件
    -25K 小于
    25K 等于25K
    +25K 大于
    find /etc -size +20K -a -size 50k
    查找/etc下,大于20K并且小于50K文件
    -a 逻辑与 and
    -o 逻辑或 or
    find /etc -size +20K -a -size -50k -exec ls -lh {} \;
    -exec 命令 {} \; 对搜索结果执行操作
    find /var/log/ -mtime +10
    查找10天前修改的文件
    -10 10天内修改文件
    10 10天当天修改的文件
    +10 10天前修改的文件
    atime 文件访问时间
    ctime 改变文件属性
    mtime 修改文件内容
    find / -name *.java
    查询.java后缀的文件
    find . -type 类型参数
    f 普通文件
    d 目录
    find ./ -name *.java | awk '{print $1 }'|xargs grep 'USER_'
    重要( awk '{print $1 }' 可以不要)


  13. crontab命令选项:

    1
    2
    3
    4
    -u指定一个用户
    -l列出某个用户的任务计划
    -r删除某个用户的任务
    -e编辑某个用户的任务
  14. ssh

    1
    2
    3
    4
    5
    6
    ssh ip/用户名@ip	两种方式
    ssh ip -p 222 指定端口
    SCP[-r] 用户名@ip:文件路径 本地路径
    下载文件
    scp [-r] 本地文件 用户名@ip:上传路径
    上传文件
  15. nohup
    nohup 命令 &

  16. crontab

    1
    2
    3
    4
    备份:
    crontab -l>crontab20161
    还原:
    crontab crontab20161

Linux常用 150 个命令汇总

发表于 2018-01-08 | 分类于 Linux
命令 功能说明
线上查询及帮助命令 (2 个)
man 查看命令帮助,命令的词典,更复杂的还有 info,但不常用。
help 查看 Linux 内置命令的帮助,比如 cd 命令。
文件和目录操作命令 (18 个)
ls 全拼 list,功能是列出目录的内容及其内容属性信息。
cd 全拼 change directory,功能是从当前工作目录切换到指定的工作目录。
cp 全拼 copy,其功能为复制文件或目录。
find 查找的意思,用于查找目录及目录下的文件。
mkdir 全拼 make directories,其功能是创建目录。
mv 全拼 move,其功能是移动或重命名文件。
pwd 全拼 print working directory,其功能是显示当前工作目录的绝对路径。
rename 用于重命名文件。
rm 全拼 remove,其功能是删除一个或多个文件或目录。
rmdir 全拼 remove empty directories,功能是删除空目录。
touch 创建新的空文件,改变已有文件的时间戳属性。
tree 功能是以树形结构显示目录下的内容。
basename 显示文件名或目录名。
dirname 显示文件或目录路径。
chattr 改变文件的扩展属性。
lsattr 查看文件扩展属性。
file 显示文件的类型。
md5sum 计算和校验文件的 MD5 值。
查看文件及内容处理命令(21 个)
cat 全拼 concatenate,功能是用于连接多个文件并且打印到屏幕输出或重定向到指定文件中。
tac tac 是 cat 的反向拼写,因此命令的功能为反向显示文件内容。
more 分页显示文件内容。
less 分页显示文件内容,more 命令的相反用法。
head 显示文件内容的头部。
tail 显示文件内容的尾部。
cut 将文件的每一行按指定分隔符分割并输出。
split 分割文件为不同的小片段。
paste 按行合并文件内容。
sort 对文件的文本内容排序。
uniq 去除重复行。oldboy
wc 统计文件的行数、单词数或字节数。
iconv 转换文件的编码格式。
dos2unix 将 DOS 格式文件转换成 UNIX 格式。
diff 全拼 difference,比较文件的差异,常用于文本文件。
vimdiff 命令行可视化文件比较工具,常用于文本文件。
rev 反向输出文件内容。
grep/egrep 过滤字符串,三剑客老三。
join 按两个文件的相同字段合并。
tr 替换或删除字符。
vi/vim 命令行文本编辑器。
文件压缩及解压缩命令(4 个)
tar 打包压缩。oldboy
unzip 解压文件。
gzip gzip 压缩工具。
zip 压缩工具。
信息显示命令(11 个)
uname 显示操作系统相关信息的命令。
hostname 显示或者设置当前系统的主机名。
dmesg 显示开机信息,用于诊断系统故障。
uptime 显示系统运行时间及负载。
stat 显示文件或文件系统的状态。
du 计算磁盘空间使用情况。
df 报告文件系统磁盘空间的使用情况。
top 实时显示系统资源使用情况。
free 查看系统内存。
date 显示与设置系统时间。
cal 查看日历等时间信息。
搜索文件命令(4 个)
which 查找二进制命令,按环境变量 PATH 路径查找。
find 从磁盘遍历查找文件或目录。
whereis 查找二进制命令,按环境变量 PATH 路径查找。
locate 从数据库 (/var/lib/mlocate/mlocate.db) 查找命令,使用 updatedb 更新库。
用户管理命令(10 个)
useradd 添加用户。
usermod 修改系统已经存在的用户属性。
userdel 删除用户。
groupadd 添加用户组。
passwd 修改用户密码。
chage 修改用户密码有效期限。
id 查看用户的 uid,gid 及归属的用户组。
su 切换用户身份。
visudo 编辑 / etc/sudoers 文件的专属命令。
sudo 以另外一个用户身份(默认 root 用户)执行事先在 sudoers 文件允许的命令。
基础网络操作命令(11 个)
telnet 使用 TELNET 协议远程登录。
ssh 使用 SSH 加密协议远程登录。
scp 全拼 secure copy,用于不同主机之间复制文件。
wget 命令行下载文件。
ping 测试主机之间网络的连通性。
route 显示和设置 linux 系统的路由表。
ifconfig 查看、配置、启用或禁用网络接口的命令。
ifup 启动网卡。
ifdown 关闭网卡。
netstat 查看网络状态。
ss 查看网络状态。
深入网络操作命令(9 个)
nmap 网络扫描命令。
lsof 全名 list open files,也就是列举系统中已经被打开的文件。
mail 发送和接收邮件。
mutt 邮件管理命令。
nslookup 交互式查询互联网 DNS 服务器的命令。
dig 查找 DNS 解析过程。
host 查询 DNS 的命令。
traceroute 追踪数据传输路由状况。
tcpdump 命令行的抓包工具。
有关磁盘与文件系统的命令(16 个)
mount 挂载文件系统。
umount 卸载文件系统。
fsck 检查并修复 Linux 文件系统。
dd 转换或复制文件。
dumpe2fs 导出 ext2/ext3/ext4 文件系统信息。
dump ext2/3/4 文件系统备份工具。
fdisk 磁盘分区命令,适用于 2TB 以下磁盘分区。
parted 磁盘分区命令,没有磁盘大小限制,常用于 2TB 以下磁盘分区。
mkfs 格式化创建 Linux 文件系统。
partprobe 更新内核的硬盘分区表信息。
e2fsck 检查 ext2/ext3/ext4 类型文件系统。
mkswap 创建 Linux 交换分区。
swapon 启用交换分区。
swapoff 关闭交换分区。
sync 将内存缓冲区内的数据写入磁盘。
resize2fs 调整 ext2/ext3/ext4 文件系统大小。
系统权限及用户授权相关命令(4 个)
chmod 改变文件或目录权限。
chown 改变文件或目录的属主和属组。
chgrp 更改文件用户组。
umask 显示或设置权限掩码。
查看系统用户登陆信息的命令(7 个)
whoami 显示当前有效的用户名称,相当于执行 id -un 命令。
who 显示目前登录系统的用户信息。
w 显示已经登陆系统的用户列表,并显示用户正在执行的指令。
last 显示登入系统的用户。
lastlog 显示系统中所有用户最近一次登录信息。
users 显示当前登录系统的所有用户的用户列表。
finger 查找并显示用户信息。
内置命令及其它(19 个)
echo 打印变量,或直接输出指定的字符串
printf 将结果格式化输出到标准输出。
rpm 管理 rpm 包的命令。
yum 自动化简单化地管理 rpm 包的命令。
watch 周期性的执行给定的命令,并将命令的输出以全屏方式显示。
alias 设置系统别名。
unalias 取消系统别名。
date 查看或设置系统时间。
clear 清除屏幕,简称清屏。
history 查看命令执行的历史纪录。
eject 弹出光驱。
time 计算命令执行时间。
nc 功能强大的网络工具。
xargs 将标准输入转换成命令行参数。
exec 调用并执行指令的命令。
export 设置或者显示环境变量。
unset 删除变量或函数。
type 用于判断另外一个命令是否是内置命令。
bc 命令行科学计算器
系统管理与性能监视命令 (9 个)
chkconfig 管理 Linux 系统开机启动项。
vmstat 虚拟内存统计。
mpstat 显示各个可用 CPU 的状态统计。
iostat 统计系统 IO。
sar 全面地获取系统的 CPU、运行队列、磁盘 I/O、分页(交换区)、内存、 CPU 中断和网络等性能数据。
ipcs 用于报告 Linux 中进程间通信设施的状态,显示的信息包括消息列表、共享内存和信号量的信息。
ipcrm 用来删除一个或更多的消息队列、信号量集或者共享内存标识。
strace 用于诊断、调试 Linux 用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。
ltrace 命令会跟踪进程的库函数调用, 它会显现出哪个库函数被调用。
关机 / 重启 / 注销和查看系统信息的命令(6 个)
shutdown 关机。
halt 关机。
poweroff 关闭电源。
logout 退出当前登录的 Shell。
exit 退出当前登录的 Shell。
Ctrl+d 退出当前登录的 Shell 的快捷键。
进程管理相关命令(15 个)
bg 将一个在后台暂停的命令,变成继续执行 (在后台执行)。
fg 将后台中的命令调至前台继续运行。
jobs 查看当前有多少在后台运行的命令。
kill 终止进程。
killall 通过进程名终止进程。
pkill 通过进程名终止进程。
crontab 定时任务命令。
ps 显示进程的快照。
pstree 树形显示进程。
nice/renice 调整程序运行的优先级。
nohup 忽略挂起信号运行指定的命令。
pgrep 查找匹配条件的进程。
runlevel 查看系统当前运行级别。
init 切换运行级别。
service 启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。

来源:banana 童
www.cnblogs.com/bananaaa/p/7774467.html

Shiro在SpringBoot中配置

发表于 2018-01-08 | 分类于 安全认证框架

一、什么是Shiro

​ Shiro是一个很易用与Java项目的的安全框架,主要提供了提供了认证、授权、加密、会话管理功能。

二、Shiro主要记住哪些

  • ShiroFilterFactory Shiro核心类
  • SecurityManager 用于管理所有的Subject
  • Subject 当前用户操作
  • Realms 用于进行权限信息的验证,也是我们需要自己实现的。

三、步骤:

1.pom.xml中添加Shiro依赖

1
2
3
4
5
<dependency>  
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>

2.注入ShiroFilterFactory和SecurityManager


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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/**
* shiro配置
*
* @Description:
* @author: gaojindeng
* @Time: 2018年1月6日 下午4:31:00
*
*/
@Configuration
public class ShiroConfig {
/**
* ShiroFilterFactoryBean 处理拦截资源文件问题。
* 注意:单独一个ShiroFilterFactoryBean配置是或报错的,以为在
* 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager
*
* Filter Chain定义说明 1、一个URL可以配置多个Filter,使用逗号分隔 2、当设置多个过滤器时,全部验证通过,才视为通过
* 3、部分过滤器可指定参数,如perms,roles
*
*/
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

// 必须设置 SecurityManager
shiroFilterFactoryBean.setSecurityManager(securityManager);

// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
shiroFilterFactoryBean.setLoginUrl("/login");
// 登录成功后要跳转的链接
shiroFilterFactoryBean.setSuccessUrl("/index");
// 未授权界面;
shiroFilterFactoryBean.setUnauthorizedUrl("/error");
// 拦截器.
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
// 配置不会被拦截的链接 顺序判断

// 配置退出过滤器,其中的具体的退出代码Shiro已经替我们实现了
filterChainDefinitionMap.put("/logout", "logout");
filterChainDefinitionMap.put("/css/**", "anon");
filterChainDefinitionMap.put("/fonts/**", "anon");
filterChainDefinitionMap.put("/image/**", "anon");
filterChainDefinitionMap.put("/js/**", "anon");
filterChainDefinitionMap.put("/favicon.ico", "anon");
filterChainDefinitionMap.put("/", "anon");
filterChainDefinitionMap.put("/register", "anon");
filterChainDefinitionMap.put("/index/**", "anon"); // 首页
filterChainDefinitionMap.put("/charts/**", "anon");// 图表
filterChainDefinitionMap.put("/statistics/**", "anon");// 统计
filterChainDefinitionMap.put("/about/**", "anon");// 关于
// filterChainDefinitionMap.put("/setup/**", "authc");
// filterChainDefinitionMap.put("/capital/entrustment",
// "perms[user:admin:*]");
// filterChainDefinitionMap.put("/capital/entrustment", "authc");
// <!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;
// <!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
filterChainDefinitionMap.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
System.out.println("Shiro拦截器工厂类注入成功");
return shiroFilterFactoryBean;
}

@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 设置realm.
securityManager.setRealm(myShiroRealm());
return securityManager;
}

/**
* 身份认证realm; (这个需要自己写,账号密码校验;权限等)
*
* @return
*/
@Bean
public MyShiroRealm myShiroRealm() {
MyShiroRealm myShiroRealm = new MyShiroRealm();
myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());
return myShiroRealm;
}

/**
* 开启shiro aop注解支持. 使用代理方式;所以需要开启代码支持;
*
* @param securityManager
* @return
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}

/**
* 该方法不加上,权限认证也可以通过
*
* @return
*/
/* @Bean
public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor()
{
return new LifecycleBeanPostProcessor();
}*/

/**
* 不加上这个 权限注解通过不了
*
* @return
*/
@Bean
public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
return new DefaultAdvisorAutoProxyCreator();
}

/**
* 凭证匹配器 (由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了
* 所以我们需要修改下doGetAuthenticationInfo中的代码; )
*
* @return
*/
@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher() {
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
hashedCredentialsMatcher.setHashAlgorithmName("md5");// 散列算法:这里使用MD5算法;
hashedCredentialsMatcher.setHashIterations(2);// 散列的次数,比如散列两次,相当于
// md5(md5(""));
return hashedCredentialsMatcher;
}
}



注入ShiroFactory==>SecurityManager==>Realm
Realm是实现权限认证、授权的,所有要自己手动新建这个类

### 3.Realm代码


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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
public class MyShiroRealm extends AuthorizingRealm {

@Autowired
private IUserSV userSV;

/**
* 认证信息.(身份验证) : Authentication 是用来验证用户身份
*
* @param token
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

// 获取用户的输入的账号.
String username = (String) token.getPrincipal();

// 通过username从数据库中查找 User对象,如果找到,没找到.
// 实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法
User userInfo = userSV.queryByName(username);
if (userInfo == null) {
return null;
}
// 加密方式;
// 交给AuthenticatingRealm使用CredentialsMatcher进行密码匹配,如果觉得人家的不好可以自定义实现
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(userInfo, // 用户名
userInfo.getPassword(), // 密码
ByteSource.Util.bytes(userInfo.getSalt()), // //salt=username+salt
getName() // realm name
);

// 明文: 若存在,将此用户存放到登录认证info中,无需自己做密码对比,Shiro会为我们进行密码对比校验
// SimpleAuthenticationInfo authenticationInfo = new
// SimpleAuthenticationInfo(
// userInfo, //用户名
// userInfo.getPassword(), //密码
// getName() //realm name
// );
return authenticationInfo;
}

/**
* 此方法调用 hasRole,hasPermission的时候才会进行回调.
*
* 权限信息.(授权): 1、如果用户正常退出,缓存自动清空; 2、如果用户非正常退出,缓存自动清空;
* 3、如果我们修改了用户的权限,而用户不退出系统,修改的权限无法立即生效。 (需要手动编程进行实现;放在service进行调用)
* 在权限修改后调用realm中的方法,realm已经由spring管理,所以从spring中获取realm实例, 调用clearCached方法;
* :Authorization 是授权访问控制,用于对用户进行的操作授权,证明该用户是否允许进行当前操作,如访问某个链接,某个资源文件等。
*
* @param principals
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
/*
* 当没有使用缓存的时候,不断刷新页面的话,这个代码会不断执行, 当其实没有必要每次都重新设置权限信息,所以我们需要放到缓存中进行管理;
* 当放到缓存中时,这样的话,doGetAuthorizationInfo就只会执行一次了, 缓存过期之后会再次执行。
*/
System.out.println("权限配置-->MyShiroRealm.doGetAuthorizationInfo()");

SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
User userInfo = (User) principals.getPrimaryPrincipal();

// 实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法
// UserInfo userInfo = userInfoService.findByUsername(username)

// 权限单个添加;
// authorizationInfo.addRole("admin");
// 添加权限
// authorizationInfo.addStringPermission("userInfo:query");

for (Role role : userInfo.getRoles()) {
authorizationInfo.addRole(role.getType());
for (Permission p : role.getPermissions()) {
authorizationInfo.addStringPermission(p.getPermission());
}
}
return authorizationInfo;
}

}


4.controller层代码


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
// 登录提交地址和配置文件的登录url一致 
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(HttpServletRequest request, Map<String, Object> map) throws Exception {
System.out.println("HomeController.login()");
// 登录失败从request中获取shiro处理的异常信息。
// shiroLoginFailure:就是shiro异常类的全类名.
String exception = (String) request.getAttribute("shiroLoginFailure");

System.out.println("exception=" + exception);
String msg = "";
if (exception != null) {
if (UnknownAccountException.class.getName().equals(exception)) {
System.out.println("UnknownAccountException -- > 账号不存在:");
msg = "UnknownAccountException -- > 账号不存在:";
} else if (IncorrectCredentialsException.class.getName().equals(exception)) {
System.out.println("IncorrectCredentialsException -- > 密码不正确:");
msg = "IncorrectCredentialsException -- > 密码不正确:";
} else if ("kaptchaValidateFailed".equals(exception)) {
System.out.println("kaptchaValidateFailed -- > 验证码错误");
msg = "kaptchaValidateFailed -- > 验证码错误";
} else {
msg = "else >> " + exception;
System.out.println("else -- >" + exception);
}
}
map.put("msg", msg);
// 此方法不处理登录成功,由shiro进行处理.
return "/login";
}


5.没有权限页面跳转

​ 新建全局异常类

1
2
3
4
5
6
7
8
9
@ControllerAdvice
public class ExceptionHandle {

@ExceptionHandler(value = UnauthorizedException.class) // 处理访问方法时权限不足问题
@ResponseBody
public String handle(Exception e) {
return "<script>alert('没有权限访问!');window.history.back();</script>";
}
}

四、其他

1.获取密文:

1
Object obj = new SimpleHash("md5", user.getPassword(), ByteSource.Util.bytes(user.getSalt()) , 2);	//获取MD5加密后的密文 2是加密次数

2.错误页面处理

​ 新建error文件夹,404,500错误会自动找到该页面

​ springBoot错误,也可以新建error.html视图,也会自动找该页面

3.为什么要用盐

​ 希望即使两个原始密码相同,加密得到的两个字符串也不同。

4.前端怎么传值过来

​ 表单中的参数固定name写法是username、password、rememberMe。

MyBatis多对一、多对多注解方式实现

发表于 2018-01-07 | 分类于 JAVA框架

用户和角色多对多,角色和权限多对多。
用户表、角色表、权限表、加两个中间表。

不用多说,直接上代码

用户表:

1
2
3
4
5
6
7
8
9
public interface UserMapper {
@Select("select * from `user` where username=#{name}")
@Results({@Result(id=true,property="id",column="id"),
@Result(property="name",column="name"),
@Result(property="type",column="type"),
@Result(property="roles",column="id",javaType=List.class,
many=@Many(select="com.gjd.dao.RoleMapper.queryById"))})
User queryByName(String name);
}

角色表:

1
2
3
4
5
6
7
8
9
10
11
public interface RoleMapper {
@Select("select * from `role` r,`user_role` u where u.rid=r.id and u.uid=#{id}")
@Results({@Result(id=true,property="id",column="id"),
@Result(property="name",column="name"),
@Result(property="permission",column="permission"),
@Result(property="resourceType",column="resourceType"),
@Result(property="url",column="url"),
@Result(property="permissions",column="id",javaType=List.class,
many=@Many(select="com.gjd.dao.PermissionMapper.queryById"))})
List<Role> queryById(long id);
}

权限表:

1
2
3
4
public interface PermissionMapper {
@Select("select * from `role_permission` r,`permission` p where r.rid=#{id} and r.pid=p.id")
List<Permission> queryById(long id);
}

一对多、多对一

把many=@Many替换成one=@One就好了。

js常用和AJAX

发表于 2017-12-30 | 分类于 前端

JS项目常用

  1. 判断数据类型
    typeof(s) 字符串:"string",数字:"number";

  2. 找指定的子标签
    单个:$(order).find("i");
    多个:$(order).find("i").each (function(i,data) ....);

  3. 遍历指定class 元素
    $(".capital-order").each(function(i, data) {...}

  4. DOM获取value和name
    data.value data.name

  5. jquery获取value和name
    $().val() ;$().attr("name")

  6. jquery中attr和prop的区别
    对应DOM中attribute()和properties() attr获取的是原始的值,prop是结果,比如checked、selected、disabled attr获取到的是里面的值,而prop是true或者false

  7. 设置标签属性的值
    $().attr("key","value");

  8. 修改css的值
    $("").css("key","value");
    dom.style.${css名称}

  9. 获取/设置标签内容
    $("").html("");$("").text()
    dom.innerHTML dom.innerText

  10. 四舍五入
    Number(数值).toFixed(2)

  11. 转int
    parseInt(s)

  12. 跳转页面
    window.location.href=url;

  13. 追加
    append(text);

  14. 找出其他同类元素,除了自己
    $("").siblings()

  15. 把from里的有name标签的封装成对象
    $("form表单").serialize()

  16. 判断标签是否存在某个class
    $(i).hasClass("c-red")

  17. 隐藏光标,设置字体为红色
    text-shadow:0 0 0 red;color:transparent;

  18. 触发按钮事件
    $("#close").trigger("click");

  19. 显示/隐藏切换
    jq:$("p").hide(); $("p").show();
    js:ui.style.display="none"; ui.style.display="";
    其他:ui.style.visibility= "visible/hidden";

  20. 查询父标签
    $('#items1').closest('.parent1');
    $('#items1').parents('.parent1');

  21. 点击事件
    $("#strategy").trigger("click");

  22. 添加/删除class
    $("#").addClass();
    $("#").removeClass();

  23. AJAX

js原生方式:

  1. 创建XMLHttpRequest对象

    1
    2
    3
    4
    5
    if (window.ActiveXObject) {
    req = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
    req = new XMLHttpRequest();
    }
  2. 与服务器建立连

    1
    2
    3
    4
    //method:get|post url:服务器相对或绝对路径  asynch:true|false 默认为true;
    req.open("post", "user",true);
    //Post提交方式需要设置Request头部信息
    req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  3. 发送请求

    1
    req.send("name=" + name + "&pwd=" + pwd);
  4. 设置回调函数

    ​

    1
    2
    3
    4
    5
    6
    //readyState 0未初始化 1正在加载 2已加载 3交互中 4响应完成  
    req.onreadystatechange = function() {
    if (req.readyState == 4 && req.status == 200) {
    var text = req.responseText;
    }
    }

JQuery方式

方式1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$.ajax({
type:"get", //请求类型get/post
url:"goods", //待载入页面的URL地址
data:{"uId":v}, //待发送 Key/value 参数。
dataType:"json", //数据类型
error:function(data){
alert("出现错误"+data);
},
success:function(data,status){
//alert("调用成功");
},
beforeSend:function(req){
//alert("发送之前");
}

});

方式2:

1
2
3
4
5
6
7
$.get(url, [data], [callback], [type]);
//$.post()同上
//url:待载入页面的URL地址
//data:待发送 Key/value 参数。
//callback:载入成功时回调函数。
//timeout:超时时间
//type:返回内容格式,xml, html, script, json, text, _default。

方式3:

1
2
3
$.getJSON(url).done(function(data){
alert('请求成功!json数据:'+data);
});
1234
lightquant

lightquant

你得拼命奔跑,才能留在原地!

36 日志
16 分类
27 标签
GitHub E-Mail
© 2018 lightquant
由 Hexo 强力驱动
|
主题 — NexT.Gemini v6.0.0