不知道现在有多少人 正在/打算 使用 commontemplate,这个文章就算是与使用 commontemplate 的朋友的经验的分享吧!
这里主要说的是 commontemplate(以下简称 ct) 与 struts 结合的问题。
在 ct 的官方站点中有 struts 集成的例子,非常简单,首先是要有一个自己的 commontemplate.properties 了,里面有如下的配置:
然后在 struts 的配置文件中进行如下的跳转:
([b]注:其他 web.xml 中配置略过[/b])
这样,当我们访问 test.do 的时候,ct 的 servlet 就会去解析 test.ctl。
但是,我们不要忽略其中的安全问题。
当我们直接访问 test.ctl 的时候,ct 的 servlet 一样会解析 test.ctl。
这样问题就来了,对于后台管理,或者需要校验的页面,用户完全可以跳过 .do ,而去直接访问 .ctl ,这样, .do 中的校验就完全没有作用了!
如何避免这个问题?其实在使用jsp的时候,我们就遇到过这个问题。解决的措施是我们把jsp放到 WEB-INF 目录下,这样浏览器就不能直接访问 jsp 了。
所以我们要采取同样的措施。等等,那个例子中模板文件已经放在了 WEB-INF 目录里了。恩,是的,不过我们需要修改一下,配置文件中:
struts 中修改如下:
这样,当我们访问 test.do 的时候,仍然会显示 test.ctl 的内容。但是我们却无法通过浏览器访问 test.ctl 了!
为什么会这样呢?因为 ct 的 servlet 解析模板的时候,寻找模板的路径是 virtualDirectory + struts中forward 。所以,如果 virtualDirectory = /WEB-FIN/pages/ 的时候,在浏览器中输入 http://localhost:8080/test/test.ctl 的时候,能找到那个模板文件。
但是如果 virtualDirectory = / 的时候,在浏览器中输入 http://localhost:8080/test/test.ctl 的时候,就找不到模板文件了。如果你输入 http://localhost:8080/test/WEB-INF/pages/test.ctl,也一样无效,因为 WEB-INF 目录是无法访问的。
这里主要说的是 commontemplate(以下简称 ct) 与 struts 结合的问题。
在 ct 的官方站点中有 struts 集成的例子,非常简单,首先是要有一个自己的 commontemplate.properties 了,里面有如下的配置:
virtualDirectory=/WEB-INF/pages
然后在 struts 的配置文件中进行如下的跳转:
<action path="/test" forward="/test.ctl"/>
([b]注:其他 web.xml 中配置略过[/b])
这样,当我们访问 test.do 的时候,ct 的 servlet 就会去解析 test.ctl。
但是,我们不要忽略其中的安全问题。
当我们直接访问 test.ctl 的时候,ct 的 servlet 一样会解析 test.ctl。
这样问题就来了,对于后台管理,或者需要校验的页面,用户完全可以跳过 .do ,而去直接访问 .ctl ,这样, .do 中的校验就完全没有作用了!
如何避免这个问题?其实在使用jsp的时候,我们就遇到过这个问题。解决的措施是我们把jsp放到 WEB-INF 目录下,这样浏览器就不能直接访问 jsp 了。
所以我们要采取同样的措施。等等,那个例子中模板文件已经放在了 WEB-INF 目录里了。恩,是的,不过我们需要修改一下,配置文件中:
virtualDirectory=/
struts 中修改如下:
<action path="/test" forward="/WEB-INF/pages/test.ctl"/>
这样,当我们访问 test.do 的时候,仍然会显示 test.ctl 的内容。但是我们却无法通过浏览器访问 test.ctl 了!
为什么会这样呢?因为 ct 的 servlet 解析模板的时候,寻找模板的路径是 virtualDirectory + struts中forward 。所以,如果 virtualDirectory = /WEB-FIN/pages/ 的时候,在浏览器中输入 http://localhost:8080/test/test.ctl 的时候,能找到那个模板文件。
但是如果 virtualDirectory = / 的时候,在浏览器中输入 http://localhost:8080/test/test.ctl 的时候,就找不到模板文件了。如果你输入 http://localhost:8080/test/WEB-INF/pages/test.ctl,也一样无效,因为 WEB-INF 目录是无法访问的。