rt
我是新手,经理用了这种方式,我的一个同事跟我说这样做不好,不安全.不知道为什么...
求解

解决方案 »

  1.   

    相比较于struts1,struts2有了本质的该变。action不再强制要求继承系统的action这对于编程的灵活性有显著提高。同事业务方法不再强制使用execute方法,而且可以动态调用业务方法,这样的好处是节省了代码,有助于代码重用。对于相似业务可以写到同一个action中。         业务方法的调用方式主要有三种。1.在actionName后直接加上!fn例如login!fn.action,该action地址将直接调用action中的fn方法。2.通过struts2配置文件指定方法名称使用action标签的method属性,例如method="fn",该方法虽然也可以动态调用方法,但是配置文件本身就不是动态的,所以该方法不是最佳选择。3.使用配置文件结合占位符,name="actionName_{1}",该方法使用占位符调用业务方法,action访问地址使用actionName_fn.action。       毋庸质疑struts2这个特性对于编程来说方便了很多,但是在安全方面有些问题,由于业务方法是动态调用,参数是用户传递的,我们不要期待用户按照我们的意愿传递参数,毕竟还是有很多不安份的“用户”,b比如有的用户使用了actionName_fn2.action如果该action中存在该方法而且该方法没有参数而且返回String类型的数据的时候,fn2所定义的功能就会被执行,也许fn2是我们程序员使用的,本来不打算暴露给用户的,同时我们又习惯性的定义成了public方法,那么该方法会正确的执行。即使不是这样,我们的方法没有返回String类型的数据,而是返回了其他的类型,该方法同样会被执行,只要这个方法被定义成了public而其没有参数。虽然会抛出异常但是不可否认的是这个方法被完全执行了,异常实在Action的业务方法return以后抛出的,也就是说这个方法完全的暴露给了用户。比如说,一个处理用户注册的业务方法f1在经过必要的判断以后调用f2把用户添加到数据库,如果f2函数符合条件,用户就可以跳过f1直接访问f2。对于安全来说这确实是个问题。        如果要避免这个问题养成良好的编程习惯,使用结构化的程序设计是必不可少的。没必要暴露给用户的方法定义成private类型,一个业务方法不同步骤尽量不都放到Action中,使用分层设计程序,把业务方法的后期步骤放到下一层逻辑中。
      

  2.   

    啥叫动态调用啊。。这么高级的主题,难不成就是在一个ACTION里有多个方法供调用。没什么问题吧ACTION每次都是新一个实例。