解决tapestry中由于使用对象池而造成信息泄露的问题

在tapestry中,由于每个页面都需要使用一个页面对象,为了提高系统的性能和节约资源,考虑使用对象池,即多个页面模板在渲染的时候可能使用的是一个页面对象,那么此时就可能出现用户A看见了用户B的数据,这个是绝对不允许的,存在信息的泄露,解决的办法是,实现initialize()方法,在页面对象放入对象池之前对属性数据进行初始化:
public class Result extends BasePage
{
    int stockValue;
    protected void initialize()
    {
       stockValue=0;
    }
}
这样每个页面模板在使用对象池中的页面对象进行渲染时,那个页面对象肯定是经过初始化的了。

还有一种解决办法,可以让Tapestry自动帮你在进行初始化:
在.page规范文件中指定属性,然后在.java页面类中不定义属性,只是定义抽象的get和set方法,那么tapestry会自动实现initialize()方法
<page-specification class="com.gwssi.bjais.tapestry.page.Home">
<property name="stockValue"/>
</page-specification>
public abstract class Result extends BasePage
{
    abstract public void setStockValue(int stockValue);
}
那么Tapestry会自动继承Result类,并实现相应的setStockValue()和initialize()方法,但是这时只是将类的实例属性初始化为默认值,及int初始化0、String初始化为null,如果想初始化为指定的值怎么办?可以在.page规范文件中进行指定:
<page-specification class="com.gwssi.bjais.tapestry.page.Home">
<property name="stockValue" initial-value="literal:100"/>
</page-specification>
当然上面的stockValue的初始值也可以通过OGNL来获取。

你可能感兴趣的:(tapestry)