(以下分享人是:icaotw,波总让转到分享,我就代劳了)
比如说我想扩展一个指令,让页面上判断某个按钮用户是否有权限,想扩展一个指令,在页面上根据actionkey判断用户是否有访问该按钮的权限。
#if (permit(“/user/admin”))
<button >xxx</button>
#end
扩展一个指令,根据登录用户session取出所拥有的权限再和actionkey对比,在扩展指令中如何获取页面的session?
现在貌似只能用:
#if (permit(session.user,"/user/admin))先从页面传入user。
使用 session 添加一个全局拦截器:
me.add(new SessionInViewInterceptor())
用的时候这样:#i(session.user)
request 中的数据已经被自动注入进来了,可以直接使用,例如:
setAttr("key", 123);
用的时候这样:#(key)
jfinal template engine 做设计成可以独立于 java web 运行,所以 template engine 自身的接口不会与 Session 耦合,如果需要在自定义指令定使用,建议两个办法:
1:添加拦截器 me.add(new SessionInViewInterceptor()),然后在自定义指令中通过 scope.get("session") 拿到它
2:通过定义一个 Handler,使用一个 ThreadLocal 对每次请求进行 set ,然后在自定义指令中通过 threadLocal.get() 来拿到它。
建议采用第一种方式
@JFinal 成功扩展了一个ifHasAuth指令,多谢波总指点迷津。上代码:
public class IfHasAuth extends Directive {
private Expr valueExpr;
public void setExprList(ExprList exprList) {
this.valueExpr = exprList.getExprArray()[0];
}
@Override
public void exec(Env env, Scope scope, Writer writer) {
HttpSession session = (HttpSession) scope.get("session");
if (null != session) {
User user = (User) session.getAttribute("user");
String actionKey = (String) valueExpr.eval(scope);
if (auth(user, actionKey)) {
stat.exec(env, scope, writer);
}
}
}
public boolean hasEnd() {
return true;
}
/**
* 判断用户是否有权限
* @param user --用户对象
* @param actionKey --访问地址
* @return
*/
private boolean auth(User user, String actionKey) {
if (user != null && StrKit.notBlank(actionKey)) {
String authUrls = user.getStr("ress");
for (String u : authUrls.split(",")) {
if (actionKey.equals(u)) {
return true;
}
}
}
return false;
}
页面上直接用
#ifHasAuth("/user/add")
新增
#end
这样可以控制新增按钮是否显示。以上代码是否有改进空间,请波总指教
感谢你的分享