(转载)Tapestry最新版5.1.0.5教程(九):权限控制框架的实现-进阶篇

本文介绍如何在Tapestry5.1中实现权限过滤控制,通过创建自定义Filter实现对页面组件级别的权限检查,利用Tapestry的IOC容器简化配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇中我们研究了如何实现SpringSecurity中Jsp Tag的<security:authorize ifAllGranted="ROLE_SUPERVISOR">的功能。这一次我们一起研究一下如何实现在Tapestry5.1中添加一个 Filter来对所有的操作进行权限的过滤控制。
在SpringSecurity中,我们一般是在application-context.xml中,添加一个SpringSecurity的 Filter,然后在另外一个xml中详细配置如何根据Url的规则进行权限的控制。而Tapestry的哲学是尽量减少Xml中的配置(其IOC容器也基本上是借鉴Guice而不Spring的),所以我们也是在代码中实现权限规则的控制。
总体上来看,可以用两种方式来实现url规则,一种是Request级别的Filter,一种是页面组件级别的Filter,如果是Request级别的话,可以从Request对象中获取Url路径,这样就与SpringSecurity基本一样了。本文主要介绍页面组件级别的Filter,从中我们也可以体会到Tapestry5.1中的IOC容器的强大和便利。

下面就是Filter的代码,这个Filter必须实现ComponentRequestFilter接口。值得注意的是其构造函数所需要用到的4个参数,这4个参数都是Tapestry5本身自有的服务,所以我们什么也不用做,Tapestry5自动会将服务的实例注入进来,这就是 Tapestry-IOC的威力。
ComponentRequestFilter接口一共有4个方法需要实现,具体代码如下:

public class RequiresLoginFilter implements ComponentRequestFilter {
private final PageRenderLinkSource renderLinkSource;

private final ComponentSource componentSource;

private final Response response;

private final ApplicationStateManager appStateManager;

public RequiresLoginFilter(PageRenderLinkSource renderLinkSource,
ComponentSource componentSource, Response response,
ApplicationStateManager appStateManager) {
this.renderLinkSource = renderLinkSource;
this.componentSource = componentSource;
this.response = response;
this.appStateManager = appStateManager;
}

public void handleComponentEvent(
ComponentEventRequestParameters parameters,
ComponentRequestHandler handler) throws IOException {

if (dispatchedToLoginPage(parameters.getActivePageName())) {
return;
}

handler.handleComponentEvent(parameters);

}

public void handlePageRender(PageRenderRequestParameters parameters, ComponentRequestHandler handler) throws IOException {
if (dispatchedToLoginPage(parameters.getLogicalPageName())) {
return;
}
handler.handlePageRender(parameters);

}

private boolean dispatchedToLoginPage(String pageName) {
Component page = componentSource.getPage(pageName);

if (page.getClass().isAnnotationPresen(RequiresLogin.class)){
if ( ! appStateManager.exists(Authentication.class)) {
redirect();
return true;
}
Authentication auth = appStateManager.get(Authentication.class);
if ( auth == null ) {
redirect();
return true;
}

if ( ! auth.isLoggedIn()) {
redirect();
return true;
}

RequiresLogin requireLogin = page.getClass().getAnnotation(RequiresLogin.class);
String ifNotGranted = requireLogin.ifNotGranted();
String ifAllGranted = requireLogin.ifAllGranted();
String ifAnyGranted = requireLogin.ifAnyGranted();
boolean permitted = auth.checkPermission(ifNotGranted,ifAllGranted, ifAnyGranted);
if ( ! permitted ) {
return true;
}
}

return false;
}

private void redirect() {
Link link = renderLinkSource.createPageRenderLink("Logout");

try {
response.sendRedirect(link);
} catch (Exception e) {

}
}
}


在ComponentRequestFilter中,我们无法使用@SessionState注解来直接注入Session中的变量,但是我们可以通过ApplicationStateManager来取得。

现在我们需要把刚定义的Filter注册到系统中,很简单,只要在AppModule中添加以下函数就行了:

public static void contributeComponentRequestHandler(
OrderedConfiguration<ComponentRequestFilter> configuration) {
configuration.addInstance("RequiresLogin",RequiresLoginFilter.class);
}


从本例子中我们可以看到Tapesty Ioc容器使用的便利性,也认识到了Ioc容器在Tapestry体系中的重要性。

[size=medium][color=blue]原文地址:[url]http://www.blogjava.net/usherlight/archive/2010/02/04/312016.html[/url][/color][/size]
内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值