精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-12-05
<o:p> </o:p> 在Tapestry+Spring+Hibernate的框架中,安全控制可以直接采用Spring的拦截机制实现整个系统的安全,这一机制主要在页面层调用服务层方法时才会起作用, 为了实现页面级的安全控制,如用户点某个链接,服务端马上就可以在页面层实现拦截,用以解决类似如下的问题:<o:p></o:p> 用户点击[新增定单]—>定单添加页面—>[定单提交],假如用户没有新增定单的权限,因为点击[新增定单]没有调用服务层方法,所以第一时间没有被拦住,而只有在[定单提交]调用新增定单的服务层方法时才会被拦下来,影响用户的体验。<o:p></o:p> 实现中,主要要在你想拦截的方法声明前配置一个annotation,不想拦截的可以不配置,本实现可以重用已配置好的针对服务层拦截的权限数据。代码在Tapesty4.0上测试通过,以下是核心代码。<o:p></o:p> //以下为页面基类 package com.demo.tapestry; import java.io.IOException; import org.apache.hivemind.ApplicationRuntimeException; import com.demo.annotation.Security;
return null; /**
<o:p></o:p> //以下为页面类中的一个监听方法
/**
*方法用途和描述:回复短消息
*服务层方法com.demo.service.IMemberManager.addMemberMsg与该监听
*方法绑定,访问该监听方法必须具有访问
*com.demo.service.IMemberManager.addMemberMsg的权限
*/
@Security(methodName="com.demo.service.IMemberManager.addMemberMsg") public IPage answerMessage(String msgID) {
//......
}
//以下为自定义的Annotation package com.demo.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 功能描述: 页面类安全代码配置
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Security {
String methodName();
}
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-12-20
|
|
返回顶楼 | |
发表时间:2006-12-20
你好,我用你的方法试了一下,但是好像不行,lmb = (ListenerMethodBinding)this.getComponent(componentName).getBindings().get("listener");获得不到内容。我的一个链接在form中的时候,获得的component是form对象,而form的linstener并没有触发,不知道你遇到这种问题没有。
|
|
返回顶楼 | |
发表时间:2006-12-21
如果你提交表单时,URL带有该Form组件对应的名字(id)时,就能在服务端能获得该组件名字对应的监听方法名(服务端就是通过这个URL获取用户触发了哪个组件,T4运行时环境有配置信息来记录组件名与监听方法名的对应).
一句话就是:请求中的URL如果带有组件名(id)信息,就能在服务端获得对应的监听方法名. 不太清楚你所描述的情况...不知可不可以让我看看你的页面与页面类代码??? |
|
返回顶楼 | |
发表时间:2006-12-21
我使用的是在html中<form jwcid="pageform@Form"> <input name="pageNum" type="text" class="inputGO" jwcid="pagenum"/>页 <a jwcid="go">go</a></form>
配置文件: <component id="pagenum" type="TextField"> <binding name="value" value="pageNum"/> </component> <component id="go" type="LinkSubmit"> <binding name="listener" value="listener:onPage"/> <binding name="tag" value="pageNum"/> <binding name="selected" value="selectedPage"/> </component> java代码: public abstract int getPageNum(); public void onPage(IRequestCycle objCycle) { System.out.println(getPageNum()); } 通过你提供的方法我这里面提交后组件ID是pageform,而监听方法是帮定在go这个元素上的, lmb = (ListenerMethodBinding)this.getComponent(componentName).getBindings().get("listener"); lmb得到的null |
|
返回顶楼 | |
发表时间:2006-12-22
这周工作太忙...见谅.
确实存在这个问题.简单的解决办法就是 在String componentName = this.getRequestCycle().getParameter("component");后加上以下代码: String submitname = this.getRequestCycle().getParameter("submitname"); if (submitname!=null && !"".equals(submitname)) componentName = submitname; |
|
返回顶楼 | |
发表时间:2006-12-25
我这里还有一种情况也是获得不了的。
<form jwcid="taskForm@Form" clientValidationEnabled="true" > <input jwcid="tasks@Submit" value="add" listener="listener:addTask" /> 这个时候也是获得不了的。因为有时候一个form里面有多个submit每个submit帮定的方法都是不同的,这个时候就不给form帮定方法了,而是给submit直接帮定。 另外:有时候在写成sucessful="listener:addTask"或者action="listener:addTask"这个时候也是获得不了的 |
|
返回顶楼 | |
发表时间:2006-12-26
你可以在浏览器中的页面源代码中找到这个tasks,应该会有<input type="hidden" name="xxx" value="tasks"/>的语句(request.getParameter("xxx") )...解决办法同linksubmit....
T4的源码还有待研究...目前我也只能做到这种简洁一点的办法了! |
|
返回顶楼 | |
发表时间:2006-12-26
忙...
稍后给与答复... |
|
返回顶楼 | |
发表时间:2007-02-13
完整版已贴上去!!!!!
注:Tapesty 5 的URL已出现层次目录,可以通过Filter更容易的拦截页面权限. |
|
返回顶楼 | |
浏览 5575 次