JFinal实现账号登陆限制

我这边原本是想通过实现过滤器 在自定义过滤器中判断用户名与当前sessionId是否一样,可是在web.xml中添加自定义过滤器项目编译会报错,然后我考虑通过implements Interceptor 方法  在controller前调用@before来实现 不知道这两种方法是否都可以实现?

评论区

JFinal

2017-06-24 10:26

几乎都是用的全局拦截器来实现这个功能,下面贴出本站的相关代码片段:

public class LoginSessionInterceptor implements Interceptor {

public void intercept(Invocation inv) {
Controller c = inv.getController();
String sessionId = c.getCookie(LoginService.sessionIdName);
if (sessionId != null) {
Account loginAccount = LoginService.me.getLoginAccountWithSessionId(sessionId);
if (loginAccount == null) {
loginAccount = LoginService.me.loginWithSessionId(sessionId);
}
if (loginAccount != null) {
// 用户登录账号
c.setAttr(LoginService.loginAccountCacheName, loginAccount);
} else {
// cookie 登录未成功,证明该 cookie 已经没有用处,删之
c.removeCookie(LoginService.sessionIdName);
}
}

inv.invoke();
}
}

JFinal

2017-06-24 10:27

JFinal 官方广告:如果想得到本站所有源代码可以考虑加入俱乐部 http://jfinal.com/club

白山

2017-06-24 10:42

@JFinal 那这边需要将这个全局拦截器配置到web.xml里面么?还是这样就可以了?

JFinal

2017-06-24 10:54

@白山 全局拦截器与 web.xml 无关,拦截器的配置在 jfinal 手册中有详细的说明,在本站首页下载 jfinal 手册,一看就全明白了

白山

2017-06-24 11:00

@JFinal 好的 谢谢了

maxwade

2019-03-20 16:09

@JFinal 这个踢人操作是根据sessoinId来控制的,如果是不同浏览器客户端跟应该根据accountId来踢人?

JFinal

2019-03-20 22:15

@maxwade 不管客户端是什么浏览器,从数据库的 session 表中删掉 accountId 所对应的记录,然后 ehcache 中的缓存也删掉即可

即便 sessionId 还存在也没关系,因为使用 sessionId 去读数据时发现 session 表以及 ehcache 中的数据不存在了,那么浏览器中的 sessionId 会立即被删掉,即便没被删掉也是无效值

因此,总的来说,只要处理好服务端的事情就可以了

yunqi

2019-11-22 14:28

@JFinal 那如果没有选择 保持登录 登录成功 关掉浏览器 在打开在登陆 在关掉 这样session 表中 就有很多条那个用户id的信息了 能不能监听到 如果关了浏览器 没有勾选保持登录 就把缓存和数据库中的删掉

JFinal

2019-11-22 15:29

@yunqi 可以直接让浏览器关闭就失效,不需要这么麻烦

yunqi

2019-11-22 16:04

@JFinal 那该如何获取关闭浏览器的事件 SessionListener 的 sessionCreated 方法 只是session 失效了 才触发,关闭浏览器并不会触发, 还有什么方法能捕获关闭浏览器的事件

JFinal

2019-11-22 16:27

@yunqi 在 jfinal club 项目中就是简单一行代码打完收工:
setCookie(LoginService.sessionIdName, sessionId, maxAgeInSeconds, true);

yunqi

2019-11-22 16:31

@JFinal 好的 谢谢

热门反馈

扫码入社