2017-09-13 08:33

找到一个类(作者不知道,应该不介意 ~!~),直接 addSharedObject 放入公享对象,搞定。

//放入共享对象
engine.addSharedObject("Shiro", new ShiroExt());

//页面调用
#if(Shiro.hasPermission("sys:edit"))
有权限
#else
无权限
#end


//Shiro 类
public class ShiroExt {
/**
* The guest tag
*
* @return
*/
public boolean isGuest() {
return getSubject() == null || getSubject().getPrincipal() == null;
}

/**
* The user tag
*
* @return
*/
public boolean isUser() {
return getSubject() != null && getSubject().getPrincipal() != null;
}

/**
* The authenticated tag
*
* @return
*/
public boolean isAuthenticated() {
return getSubject() != null && getSubject().isAuthenticated();
}

public boolean isNotAuthenticated() {
return !isAuthenticated();
}

/**
* The principal tag
*
* @param map
* @return
*/
public String principal(Map map) {
String strValue = null;
if (getSubject() != null) {

// Get the principal to print out
Object principal;
String type = map != null ? (String) map.get("type") : null;
if (type == null) {
principal = getSubject().getPrincipal();
} else {
principal = getPrincipalFromClassName(type);
}
String property = map != null ? (String) map.get("property") : null;
// Get the string value of the principal
if (principal != null) {
if (property == null) {
strValue = principal.toString();
} else {
strValue = getPrincipalProperty(principal, property);
}
}

}

if (strValue != null) {
return strValue;
} else {
return null;
}
}

/**
* The hasRole tag
*
* @param roleName
* @return
*/
public boolean hasRole(String roleName) {
return getSubject() != null && getSubject().hasRole(roleName);
}

/**
* The lacksRole tag
*
* @param roleName
* @return
*/
public boolean lacksRole(String roleName) {
boolean hasRole = getSubject() != null
&& getSubject().hasRole(roleName);
return !hasRole;
}

/**
* The hasAnyRole tag
*
* @param roleNames
* @return
*/
public boolean hasAnyRole(String roleNames) {
boolean hasAnyRole = false;

Subject subject = getSubject();

if (subject != null) {

// Iterate through roles and check to see if the user has one of the
// roles
for (String role : roleNames.split(",")) {

if (subject.hasRole(role.trim())) {
hasAnyRole = true;
break;
}

}

}

return hasAnyRole;
}

/**
* The hasPermission tag
*
* @param p
* @return
*/
public boolean hasPermission(String p) {
return getSubject() != null && getSubject().isPermitted(p);
}

/**
* The lacksPermission tag
*
* @param p
* @return
*/
public boolean lacksPermission(String p) {
return !hasPermission(p);
}

@SuppressWarnings({"unchecked"})
private Object getPrincipalFromClassName(String type) {
Object principal = null;

try {
Class cls = Class.forName(type);
principal = getSubject().getPrincipals().oneByType(cls);
} catch (ClassNotFoundException e) {

}
return principal;
}

private String getPrincipalProperty(Object principal, String property) {
String strValue = null;

try {
BeanInfo bi = Introspector.getBeanInfo(principal.getClass());

// Loop through the properties to get the string value of the
// specified property
boolean foundProperty = false;
for (PropertyDescriptor pd : bi.getPropertyDescriptors()) {
if (pd.getName().equals(property)) {
Object value = pd.getReadMethod().invoke(principal,
(Object[]) null);
strValue = String.valueOf(value);
foundProperty = true;
break;
}
}

if (!foundProperty) {
final String message = "Property [" + property + "] not found in principal of type ["
+ principal.getClass().getName() + "]";

throw new RuntimeException(message);
}

} catch (Exception e) {
final String message = "Error reading property [" + property + "] from principal of type ["
+ principal.getClass().getName() + "]";

throw new RuntimeException(message, e);
}

return strValue;
}

protected Subject getSubject() {
return SecurityUtils.getSubject();
}

public static void main(String[] args) {
GroupTemplate gt = new GroupTemplate();
gt.registerFunctionPackage("shiro", new ShiroExt());

}

}

2017-09-07 09:50

@JFinal 在 JFinalViewResolver 添加一个 loadView ,check 一下文件是否存在。不存在返回null 才符合spring 视图链接逻辑,经测试没有问题。这个是否应该算是enjoy的一个小问题,enjoy 3.3 是否加入这样的逻辑,要不然在 spring 下 enjoy只要order值足够小,后面的视图都将无法使用。

@Override
protected View loadView(String viewName, Locale locale) throws Exception {
if (getSuffix().equals(".html")) {
File file = "拼接的路径.....";
if (!file.exists()) {
return null;
}
return super.loadView(viewName, locale);
} else {
return null;
}
}

2017-09-05 10:59

@JFinal 你的这个(如下)逻辑看似没有问题,我调试的时候有些许问题,首先断点进来的时候虽然可以拿到扩展名,但是拿到的是enjoy 渲染的 .html 的扩展名,因为此时此视图渲染并未进入jsp的视图,所以这个 if 理论上是不是会返回return null 的。

if (getSuffix().equals(".jsp")) {
return null;
} else {
return super.buildView(...);
}

2017-09-05 07:52

@JFinal 嗯,感谢 JFinal 不厌其烦的解答。不过不管是JSP还是enjoyt和其它模板引擎混用(可能性)。JFinalViewResolver 在spring下应该按 spring的规则返回,不然问题就跟我现在遇到的一样了。

2017-09-04 23:00

@JFinal 跟 setOrder(0) 关系不大,按照网上说的 InternalResourceViewResolver 必须放在最后,也就是先执行 enjoy>jsp。

2017-09-04 22:35

@JFinal 不是新项目,新项目全用enjoy了。

2017-09-04 22:21

@JFinal 好像就是enjoy配不出来,我试了velocity,没有问题。。。。头痛。。

2017-09-04 14:42

@杜福忠 没有用 jfinal ,只用了 enjoy。

2017-09-04 08:06

@JFinal 试过了不行,我再研究研究。。。。

2017-09-03 23:29

@JFinal 汗,上面已经配置了order了,但是全进 JFinalViewResolver 视图了,然后又找不到页面就报错了。进不了JSP的视图

2017-09-03 23:02

@JFinal 7.4 有。。。我来看看。

2017-09-03 22:51

@JFinal 我只用了enjoy-3.2, enjoy 3.2.PDF 里面并没有你讲的6.11.3 的章节。

2017-09-03 22:40

@JFinal 好像第5章的扩展章节也没有特殊的说明。。。