论坛首页 Java版 Webwork

Tapestry中那里做统一的权限验证比较好

浏览 5392 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2005-09-30
在 struts中由于框架使用了 ActionServlet,可以在里面做统一的权限验证,但是在 tapestry中,url请求的方式变了,它有没有集中控制页面跳转的类可以做权限验证呢? 我看到它在Page接口中有 IValidate方法可以覆盖,做验证,但是这需要每一个page都这样, 现在想得最好的方法就是 做一个 类继承自 BasePage,在我这个类里面覆盖 Validate方法做验证,然后其他所有的page类都继承自这个 验证类:
[code:1]
public class ValidatePage extends BasePage{

public boolean IValidate(.....){
//这里做验证
..................................
}
.....................................................
}
[/code:1]

然后我得其他page extends 这个 ValidatePage类就可以了。不知道有没有更好的方法? 比如使用 他的 全局 Engeen类做统一处理会不会更合适?
   
时间:2005-10-07
lyo 写道
在 struts中由于框架使用了 ActionServlet,可以在里面做统一的权限验证,但是在 tapestry中,url请求的方式变了,它有没有集中控制页面跳转的类可以做权限验证呢? 我看到它在Page接口中有 IValidate方法可以覆盖,做验证,但是这需要每一个page都这样, 现在想得最好的方法就是 做一个 类继承自 BasePage,在我这个类里面覆盖 Validate方法做验证,然后其他所有的page类都继承自这个 验证类:
[code:1]
public class ValidatePage extends BasePage{

public boolean IValidate(.....){
//这里做验证
..................................
}
.....................................................
}
[/code:1]

然后我得其他page extends 这个 ValidatePage类就可以了。不知道有没有更好的方法? 比如使用 他的 全局 Engeen类做统一处理会不会更合适?

恩,好象IValidate不是做这个用处的吧。
实现PageValidateListener的pageValidate就可以了
Tapestry会自己校验
可以这样
[code:1]
public abstract class ProtectedPage extends BasePage implements PageValidateListener {
public abstract boolean hasPermission();
public void pageValidate(PageEvent event) {
Visit visit = (Visit)getVisit();
if(visit == null || !visit.isUserLoggedIn()) {
LoginPage login = (LoginPage) getRequestCycle().getPage("Login");
login.setCallback(new PageCallback(this));
throw new PageRedirectException(login);
}
if(!hasPermission()) {
throw new PageRedirectException(NO_Permission_Page);
//或者直接记录下来,显示错误信息
//
}
}
}
[/code:1]
   
0 请登录后投票
时间:2005-10-07
多谢,那我以后的所有类都继承自这“ProtectedPage “ 类就可以了. IValidate不可以么 ;-( 我一直认为 Tapestry中的 IEngine类相当于 Struts中的ActionServlet,是整个框架的控制中心,不知道这样理解对不对,如果能在这里面做验证就很优雅了,也符合T4的设计原则,还不用继承这个ProtectedPage类了。这个地方 :
[code:1]
if(!hasPermission()) {
throw new PageRedirectException(NO_Permission_Page);
//或者直接记录下来,显示错误信息
//
}
[/code:1]
如果不用抛异常的方式,用IValidate可以做到重定向页面的效果么?
   
0 请登录后投票
时间:2005-10-08
还有个问题请教一下,如果我不使用“<page-specification>”的形式,用了 “page-class-packages”模式,那麽Tapestry查找 Class对应的html模板文件的时候,是不是 *.java和 *.html的文件名一定要一致? 否则T4怎麽知道html模板对应的是哪个java类?
   
0 请登录后投票
时间:2005-10-08
lyo 写道
还有个问题请教一下,如果我不使用“<page-specification>”的形式,用了 “page-class-packages”模式,那麽Tapestry查找 Class对应的html模板文件的时候,是不是 *.java和 *.html的文件名一定要一致? 否则T4怎麽知道html模板对应的是哪个java类?

T4还没研究过,召唤gzdlw达人
   
0 请登录后投票
时间:2005-10-08
可以看一下以前的帖子
http://forum.hibernate.org.cn/viewtopic.php?t=13718&highlight=
粘贴过来:
Tapestry4新特性(六)-自动定位页面类文件
说明:
通俗点说就是您可以不定义.page文件或者定义的.page文件中不指定class 属性,而让服务器自动根据.html文件的路径来寻找对应的类文件。
配置:
在.application的定义文件中添加: <meta key="org.apache.tapestry.page-class-packages" value="org.edynasty.pages"/> 这样如果在文档根目录下有个Home.html文件,你就可以将Home.java放到 org.edynasty.pages(实际开发中配置为您自己的包名)包中,tapestry自动根据 Home.hmtl构造org.edynasty.pages.Home来定位页面的类文件,当然您也可以在WEB -INF目录下放一个Home.page,不需要定义class属性,tapestry自动按照上边的原 理定位。
效果:
这样您可以不需要维护.page中的class属性,直接根据.html文件来写对应 的类文件。而且可以根据业务逻辑来定义目录结构,例如将 org.edynasty.pages.user定义为user相关的类,.html也就可以放到user目录下 边,目录结构如下:
user/ListUsers.html
user/EditUser.html
course/ListCourses.html
course/EditCourses.html
Home.html
   
0 请登录后投票
时间:2005-10-08
在T4里面,我所知道的服务器端效验有很多种方式,而且用途不同的话,效验方式也可以不同。一般情况下,使用得最多的情况是在表单提交时。


1)进行表单提交时最为简单的一种就是在Form或者Submit的监听方法里面进行效验;当然,这种方式虽然简单,但是不利于进行统一的效验。

2)由于Form进行效验时,一般都会使用delegate(在T3中是必须使用的,在T4中则可以不用)。那么,自定义一个类extends org.apache.tapestry.valid.ValidationDelegate,那么以后凡是在使用delegate的地方使用自定义的这个delegate类,就可以实现统一效验。这种方式在T3时代,比较常用。关于这种方式的详细用法,可以查看一下官方的Workbench示例

3)在T4中,大家可能会发现TextField组件多了一个参数validators。不光TextField组件,其他关于表单效验的组件比如TextArea等,都多了类似的参数。这个参数的作用,实际上是将delegate的功能细化,仅仅针对某个特定的组件。举例如下:
[code:1]
<bean name="patronCodeValidator" class="com.tapestry4.test.PatronCodeValidator">
<set name="knownPatrons" value="ognl:knownPatrons"/>
</bean>

<component id="patronCode" type="TextField">
<binding name="value" value="patronCode"/>
<binding name="validators" value="bean:patronCodeValidator"/>
</component>
[/code:1]
[code:1]
public class PatronCodeValidator implements Validator {

private KnownPatrons knownPatrons;

public void validate(IFormComponent field, ValidationMessages message,
Object object) throws ValidatorException {
String patronId = (String)object;
if(!knownPatrons.isKnown(patronId)) {
throw new ValidatorException("当前Patron不存在,请重新输入!", null);
}
}

/**
* 是否把null作为效验的值。如果返回true,则不输入任何值也会触发validate方法,只是第三个参数为Object的值null。
* 如果返回为false,则不触发validate方法。
*/
public boolean getAcceptsNull() {
return false;
}

/**
* tapestry并不会使用这个方法,该方法只是为了方便自己标识。
*/
public boolean isRequired() {
return true;
}


/**
* 这个方法可以用来放置JavaScript。
*/
public void renderContribution(IMarkupWriter arg0, IRequestCycle arg1,
FormComponentContributorContext arg2, IFormComponent arg3) {

}

public void setKnownPatrons(KnownPatrons knownPatrons) {
this.knownPatrons = knownPatrons;
}

}
[/code:1]
上面的knownPatrons仅仅是一个成员变量,也许<set name="knownPatrons" value="ognl:knownPatrons"/>的方式看起来很奇怪,它仅仅是用于给PatronCodeValidator类的成员变量赋于任意你向给定的值。这个PatronCodeValidator类必须实现Validator接口,该接口最重要的是方法:
[code:1]
public void validate(IFormComponent field, ValidationMessages message,
Object object) throws ValidatorException {
}
[/code:1]
一旦表单进行提交的时候,就可以在这个方法中进行效验。

4)第四种就是楼主提到的方式,如果进行的效验并非针对表单提交,比如一个业务系统里面,可能必须对用户点击的每一个页面进行用户效验,那么我就会使用楼主提到的这种方式。

对于T4,我目前在刚开始使用到第一个项目,而且该项目与业务系统关联非常密切。所以更多的功能我也正处于探索中。



对于T4中所谓“自动定位页面类文件”,其实很好理解,如果在application中定义了page-class。那么page就会自动去该类包寻找相同的java类,如果找不到,就自动使用BasePage类。。。。同样Html会自动寻找同名的page。。。。所以如果为了方便,可以将html,page和java设置为相同名称。。。。如果想设置不同的名称,可以沿用T3中在application中指定html与page的关联,在page的class属性里面指定page与java的关联。
   
0 请登录后投票
时间:2005-10-10
gzdlw 写道
如果在application中定义了page-class。那么page就会自动去该类包寻找相同的java类,如果找不到,就自动使用BasePage类。。。。同样Html会自动寻找同名的page。。。。所以如果为了方便,可以将html,page和java设置为相同名称。。。。如果想设置不同的名称,可以沿用T3中在application中指定html与page的关联,在page的class属性里面指定page与java的关联。


这种情况的局限就是 *.page文件和*.html与 *.java的名称必须一致?因为我没有在 .page中指定 class属性,否则 t4是无法知道 page对应的java类吧?
而且如果不使用 t3的方式(在.application中指定 html和page的对应关系),那麽好像只有 *.page必须放到 WEB-INF 下 t4 才能找到,而且 html和page必须放到一起,否则page会报错说找不到 html模板文件的。 如果 page,html,java的文件名称可以不一致,而且 page文件可以不放到 WEB-INF 下就好了(应该能放到指定的目录下,比如 context/html/test.html, context/page/test.page ),不知道有没有其他好的方法解决?
   
0 请登录后投票
时间:2005-10-10
引用
这种情况的局限就是 *.page文件和*.html与 *.java的名称必须一致?因为我没有在 .page中指定 class属性,否则 t4是无法知道 page对应的java类吧?



引用
而且如果不使用 t3的方式(在.application中指定 html和page的对应关系),那麽好像只有 *.page必须放到 WEB-INF 下 t4 才能找到,而且 html和page必须放到一起,否则page会报错说找不到 html模板文件的。 如果 page,html,java的文件名称可以不一致,而且 page文件可以不放到 WEB-INF 下就好了(应该能放到指定的目录下,比如 context/html/test.html, context/page/test.page ),不知道有没有其他好的方法解决?

page默认的放置目录是web-inf下,如果想要把page放到任意目录,就必须在application里面指定html与page的关联。
而html可以放在context/下或者context/web-inf/下,如果有多个项目的情况,可以将同一个项目的所有HTML放在同一个子目录中,但是需要在web.xml中设置tapestry的启动路径:
[code:1]<servlet-mapping>
<servlet-name>athena</servlet-name>
<url-pattern>/xxxx/app</url-pattern>
</servlet-mapping>[/code:1]
同一个项目的所有HTML页面必须放在同一个目录下,不能够再分包。
   
0 请登录后投票
时间:2005-10-11
多谢回复,我还是用 “在application里面指定html与page的关联” 的方式吧,最灵活~
   
0 请登录后投票
论坛首页 Java版 Webwork

跳转论坛:
JavaEye推荐