Jfinal 3.1 怎么使用redis实现Token

jfinal 本身的createToken 和validateToken 是通过session来实现的,我现在想把token放在redis中 请问怎么实现@Jfinal

评论区

linuxea

2017-09-27 16:23

改。按照想法就是把存储在session中的那代码改成存储在redis中。验证的时候也要去redis拿。key 值当然是当前 session。所以
--- 感觉没必要改成redis。

fengting

2017-09-27 16:36

现在问题是后台是集群部署的 几个tomcat容器 放session肯定会出现取不到的情况的。其实我想知道就jfinal先有的代码来说,稍微扩展下就能实现就好了。不行的话,还不如我自己全部重写来的快。

JFinal

2017-09-27 21:18

实现一下 ITokenCache 接口,然后通过 me.setTokenCache(new MyTokenCache()) 即可切换到自己的实现

ITokenCache 接口只有 put remove 等基本的方法,具体实现为 redis 还是数据库都很方便,别忘了搞定后回来分享一下哈

杜福忠

2017-09-28 08:38

http://www.jfinal.com/share/299
EhCache与Redis自由切换

fengting

2017-09-28 10:13

@谢谢各位的回复!这个问题我已经解决了,写了一个类MyTokenCache实现ITokenCache接口。然后再configConstant(Constants me){} 方法中 me.setTokenCache(new MyTokenCache());
下面是MyTokenCache 类的全部代码。有写的不恰当或需要优化的地方,烦请指出!
public class MyTokenCache implements ITokenCache {

private static final String CACHE_PREFIX = "myToken:";

@Override
public void put(Token token) {
if (null != token) {
Long expirationTime = (token.getExpirationTime() - System.currentTimeMillis()) / 1000;
ToolCache.set(CACHE_PREFIX + token.getId(), token, expirationTime.intValue());
}
}

@Override
public void remove(Token token) {
if (null != token) {
ToolCache.remove(CACHE_PREFIX + token.getId());
}
}

@Override
public boolean contains(Token token) {
return null != token && token.equals(this.get(token.getId()));
}

@Override
public List getAll() {
Set keys = ToolCache.getKeys(CACHE_PREFIX + "*");
if (keys != null) {
List list = new ArrayList<>();
for (String key : keys) {
list.add(ToolCache.get(key));
}
return list;
}
return null;
}

/**
* 获取单个token
* @param tokenId tokenId
* @return Token
*/
public Token get(String tokenId) {
if(StrKit.notBlank(tokenId)) {
return ToolCache.get(CACHE_PREFIX + tokenId);
}
return null;
}

JFinal

2017-09-28 21:55

@fengting jfinal 几乎所有的模块都预留了扩展机制,例如 Handler、Render、Plugin、TokenCache、CaptchaCache 等等,稍微看看代码就知道如何扩展了

fengting

2017-09-29 14:32

@JFinal 嗯嗯 谢谢波总的指点 。其实也知道Jfinal的扩展机制的,只是当时不知道怎么使用我自己扩展的MyTokenCache 后面看源码才发现是在constant里面set的。