这里只供参考,比较使用jwt方式进行身份验证感觉不好,最不行的就是不能退出
登陆时设定多长过期时间,只能等这个时间过了以后才算退出,服务端只能验证请求过来的token是否通过验证
code:
1
2
3
4
5
6
7
8
9
10
|
/**
* created by qhong on 2018/6/7 15:34
* 标注该注解的,就不需要登录
**/
@target ({elementtype.method,elementtype.type})
@retention (retentionpolicy.runtime)
@documented
public @interface authignore {
}
|
loginuser:
1
2
3
4
5
|
@target (elementtype.parameter)
@retention (retentionpolicy.runtime)
public @interface loginuser {
}
|
jwtutil:
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
|
@configurationproperties (prefix = "jwt" )
@component
public class jwtutils {
private logger logger = loggerfactory.getlogger(getclass());
private string secret;
private long expire;
private string header;
/**
* 生成jwt token
*/
public string generatetoken( long userid) {
date nowdate = new date();
//过期时间
date expiredate = new date(nowdate.gettime() + expire * 1000 );
return jwts.builder()
.setheaderparam( "typ" , "jwt" )
.setsubject(userid+ "" )
.setissuedat(nowdate)
.setexpiration(expiredate)
.signwith(io.jsonwebtoken.signaturealgorithm.hs512, secret)
.compact();
}
public claims getclaimbytoken(string token) {
try {
return jwts.parser()
.setsigningkey(secret)
.parseclaimsjws(token)
.getbody();
} catch (exception e){
logger.debug( "validate is token error " , e);
return null ;
}
}
/**
* token是否过期
* @return true:过期
*/
public boolean istokenexpired(date expiration) {
return expiration.before( new date());
}
public string getsecret() {
return secret;
}
public void setsecret(string secret) {
this .secret = secret;
}
public long getexpire() {
return expire;
}
public void setexpire( long expire) {
this .expire = expire;
}
public string getheader() {
return header;
}
public void setheader(string header) {
this .header = header;
}
}
|
application.properties配置:
1
2
3
4
5
|
# 加密秘钥
jwt.secret=f4e2e52034348f86b67cde581c0f9eb5
# token有效时长,单位秒
jwt.expire= 60000
jwt.header=token
|
拦截器:
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
|
/**
* created by qhong on 2018/6/7 15:36
**/
@component
public class authorizationinterceptor extends handlerinterceptoradapter {
@autowired
private jwtutils jwtutils;
public static final string user_key = "userid" ;
@override
public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception {
authignore annotation;
if (handler instanceof handlermethod) {
annotation = ((handlermethod) handler).getmethodannotation(authignore. class );
} else {
return true ;
}
//如果有@authignore注解,则不验证token
if (annotation != null ){
return true ;
}
//获取用户凭证
string token = request.getheader(jwtutils.getheader());
if (stringutils.isblank(token)){
token = request.getparameter(jwtutils.getheader());
}
//token凭证为空
if (stringutils.isblank(token)){
throw new authexception(jwtutils.getheader() + "不能为空" , httpstatus.unauthorized.value());
}
claims claims = jwtutils.getclaimbytoken(token);
if (claims == null || jwtutils.istokenexpired(claims.getexpiration())){
throw new authexception(jwtutils.getheader() + "失效,请重新登录" , httpstatus.unauthorized.value());
}
//设置userid到request里,后续根据userid,获取用户信息
request.setattribute(user_key, long .parselong(claims.getsubject()));
return true ;
}
}
|
注解拦截:
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
|
@component
public class loginuserhandlermethodargumentresolver implements handlermethodargumentresolver {
@autowired
private userservice userservice;
@override
public boolean supportsparameter(methodparameter parameter) {
return parameter.getparametertype().isassignablefrom(user. class ) && parameter.hasparameterannotation(loginuser. class );
}
@override
public object resolveargument(methodparameter parameter, modelandviewcontainer container,
nativewebrequest request, webdatabinderfactory factory) throws exception {
//获取用户id
object object = request.getattribute(authorizationinterceptor.user_key, requestattributes.scope_request);
if (object == null ){
return null ;
}
//获取用户信息
user user = userservice.selectbyid(( long )object);
return user;
}
}
|
webconfig:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@configuration
public class webconfig extends webmvcconfigureradapter {
@autowired
private authorizationinterceptor authorizationinterceptor;
@autowired
private loginuserhandlermethodargumentresolver loginuserhandlermethodargumentresolver;
@override
public void addinterceptors(interceptorregistry registry) {
registry.addinterceptor(authorizationinterceptor).addpathpatterns( "/**" );
}
@override
public void addargumentresolvers(list<handlermethodargumentresolver> argumentresolvers) {
argumentresolvers.add(loginuserhandlermethodargumentresolver);
}
}
|
login:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@postmapping ( "/login" )
@authignore
public r login2( @requestbody user u){
//用户登录
long userid =userservice.adduser(u);
//生成token
string token = jwtutils.generatetoken(userid);
map<string, object> map = new hashmap<>();
map.put( "token" , token);
map.put( "expire" , jwtutils.getexpire());
return r.ok(map);
}
|
loginuser注解使用:
1
2
3
4
|
@requestmapping (value= "/query2" ,method= requestmethod.post)
public user query2( @loginuser user u){
return u;
}
|
http://www.zzvips.com/article/172755.html
https://gitee.com/renrenio/renren-fast
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/hongdada/p/9152291.html