关于JFinal中权限设计的问题
@JFinal 你好,想跟你请教个问题:
用户在成功登陆后将sessionId存入Cookie,并将用户信息保存在缓存中。之后在controller中通过getCookie("sessionId")获取sessionId,通过该sessionId在缓存中获取用户信息。代码如下所示:
public class LoginController extends Controller { /** * 登录 */ @Clear public void login(){ String userName = getPara("loginuser"); String password = getPara("loginpwd"); User user = User.dao.findUserIncludeMenuInfo(userName); if(StringUtil.isEmpty(userName) || StringUtil.isEmpty(password)){ this.setAttr("loginState", "3"); this.setAttr("loginInfo", "用户不存在!"); this.setAttr("userName", userName); render("/ui/login.html"); }else if(user==null){ this.setAttr("loginState", "0"); this.setAttr("loginInfo", "用户不存在!"); this.setAttr("userName", userName); render("/ui/login.html"); }else{ this.setCookie("sessionId", getSession().getId(), 120*60); CacheKit.put("loginUser",this.getCookie("sessionId"), user); this.setAttr("loginState", "10"); this.setAttr("loginInfo", "登录成功!"); this.setAttr("userName", userName); render("/ui/main.html"); } } }
public class NoticeController extends Controller { public void add(){ User user = CacheKit.get("loginUser",getSession().getId()); //do something... } }
我还定义了一些标签类,代码如下所示:
public class TopButtonDirective implements TemplateDirectiveModel { @SuppressWarnings("rawtypes") @Override public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { // TODO Auto-generated method stub Menu menu = Menu.dao.findMenusByEnName(params.get("menuEnName").toString()); //User user = CacheKit.get("loginUser",getSession().getId()); StringBuffer buttonHtml = new StringBuffer("<a href=""); if(user.isHaveThisMenu(menu)){ env.getOut().write(buttonHtml.toString()); } } }
该标签写在页面模板中,通过判断当前用户的权限列表中是否包含当前的菜单按钮,从而决定是否显示。
问题就来了,正如上面的代码中
//User user = CacheKit.get("loginUser",getSession().getId());这一句我需要通过得到cookie或者session来获取当前用户的sessionId,从而在缓存中得到当前的用户权限信息。不知道是否有什么好的解决办法吗?或者说我的这种设计思路本身就有问题?
望不吝赐教,多谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
回复
注意看面代码的这句:inv.getController().setAttr("loginUser", user); 已然将 loginUser 放到 attr 中去了,这样就可以在很多地方拿到了
回复
多谢。如您所说这样一来在controller中、页面中等都可以很容易的获得。可是要想在TopButtonDirective类中直接获得却还是没有办法啊。
回复
怎么没办法啊? 第二个参数 Map params,直接用一下:params.get("sessionId") 即可打完收工,要活学活用
回复
嗯,明白了。多谢您耐心的回复。
谢波总!