模板扩展指令如何获取request或者session?

比如说我想扩展一个指令,让页面上判断某个按钮用户是否有权限,想扩展一个指令,在页面上根据actionkey判断用户是否有访问该按钮的权限。

#if (permit(“/user/admin”))

<button >xxx</button>

#end

扩展一个指令,根据登录用户session取出所拥有的权限再和actionkey对比,在扩展指令中如何获取页面的session?

现在貌似只能用:

#if (permit(session.user,"/user/admin))先从页面传入user。

评论区

JFinal

2017-04-03 10:08

使用 session 添加一个全局拦截器:
me.add(new SessionInViewInterceptor())
用的时候这样:
#i(session.user)

request 中的数据已经被自动注入进来了,可以直接使用,例如:
setAttr("key", 123);
用的时候这样:
#(key)

icaotw

2017-04-03 17:50

可能还是我没说清楚,我的意思是在是否可以扩展指令中直接获取session,而不必在模板中调用该指令时传入session。

JFinal

2017-04-03 18:18

jfinal template engine 做设计成可以独立于 java web 运行,所以 template engine 自身的接口不会与 Session 耦合,如果需要在自定义指令定使用,建议两个办法:
1:添加拦截器 me.add(new SessionInViewInterceptor()),然后在自定义指令中通过 scope.get("session") 拿到它
2:通过定义一个 Handler,使用一个 ThreadLocal 对每次请求进行 set ,然后在自定义指令中通过 threadLocal.get() 来拿到它

建议采用第一种方式

pp

2017-04-04 08:27

可以
试试

icaotw

2017-04-04 22:36

@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 这样可以控制新增按钮是否显示了。以上代码是否有改进空间,请波总指教

JFinal

2017-04-04 22:39

@pp 这是很好的分享啊,直接发个贴子到分享频道,很多人需要这个,发完贴这个回复可以删掉了

热门反馈

扫码入社