我正在编写一个servlet-filter作为这个问题的解决方案:
Is it a good idea to filter inside a JSF template?
现在,我们的想法是创建一个大过滤器来检查所有特权,并授予某个用户访问权限。 我创建一个Map来包含所有子应用程序的所有特权,它将子应用程序的id(Long值)作为Key,另一个Map包含其他重要信息。 控制器类名为class1Controller,class2Controller ecc,子应用程序存储在名为class1,class2 ecc的许多文件夹中... 我必须说的最后一件事是所有类都有一个名为applicationID的参数,它与我之前提到的Map的键相同。 那么,我会做什么? 我可以使用来自HttpServletRequest的getRequestURI()方法检索用户访问的子应用程序,问题是我应该从链接到该应用程序的类中获取应用程序ID,所以我编写了这段代码:
Long id= ((Class.forName(packageName+applicationName+"Controller"))session.getAttribute(applicationName+"Controller")).getApplicationId();
问题是编译器返回它找不到方法getApplicationId()! 我可以做些什么来解决这个问题吗?或者我必须找到另一种方法来做到这一点?
答案 0 :(得分:1)
我必须说的最后一件事是所有类都有一个名为applicationID的参数
听起来你想要一个带有getApplicationId
方法的接口;让所有控制器实现该接口,然后您需要做的就是转换为该接口。
// TODO: Work out a better interface name than "Application" :)
Object attribute = session.getAttribute(applicationName+"Controller");
Long id = ((Application) attribute).getApplicationId();
(您可能希望使用BalusC描述的抽象基类 - 它们是同一主题的变体,真的。)
答案 1 :(得分:1)
您正在Class
个实例上调用getApplicationId()
,但它根本没有该方法。
通常的做法是让所有这些类扩展一些公共基本抽象类或一个定义了方法的接口,然后转换为该基本抽象类或接口。
E.g。使用基本抽象类:
public class FooController extends BaseController {}
public class BarController extends BaseController {}
等。
基本抽象类看起来像这样:
public abstract class BaseController {
public Long getApplicationId() {
return applicationId;
}
}
然后你可以按如下方式得到它:
Long id = ((BaseController) session.getAttribute(applicationName + "Controller")).getApplicationId();