在做SSI架构的项目,其中有大量的jsp页面,关于jsp的安全性问题,主要体现在web工作目录的WEB-INF文件夹下,可以将页面保存在WEB-INF文件下,这样用户就不能访问该页面了。它为什么能体现安全性能,就好比小偷要偷东西,但是他根本看不到我有的东西,他肯定偷不成功。因此将jsp页面保存在WEB-INF文件下,可以提高页面的安全性。
但是放到该文件夹下后,可能会出现我们要访问的时候却也无法访问了,查了相关资料了解到,在Structs中每一个跳转都是通过一个action来处理的,处理完后forward到相对地址。如果想不通过action处理跳转,而是直接让WEB-INF/a.jsp跳转到WEB-INF/b.jsp页面,则使用相对地址/b.jsp,绝对地址/WEB-INF/b.jsp或者<%=request.getContext()=%>/WEB-INF/b.jsp,均跳转不成功,这是因为安全性在搞怪,放到WEB-INF文件下web容器是对外不可见的,我们看不到他的跳转路径,所以直接跳转不行,需要间接跳转,可要通过structs的action,他的跳转是一种间接跳转,其跳转地址是在web.xml里面配好的,访问的人看不到,具有安全性。如果没有structs难道就不能间接跳转,jsp页面就没有安全保障了吗?答案是否定的,因为structs的action的本质 还是一个servlet,所以可以通过servlet来做。
先在web.xml里面配置servlet和servlet mapping:
<servlet>
<servlet-name>goto</servlet-name>
<jsp-file>/WEB-INF/jsp/test.jsp</jsp-file>--要跳转到的页面
</servlet>
<servlet-mapping>
<servlet-name>goto</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
配置好了之后在jsp页面里用a就可以跳转了<a href="/工程名/test">测试页面跳转</a>--这里一定要“/工程名/test”
通过servlet跳转还是比较麻烦了,但是这样能保证JSP页面的安全性,想两全其美是比较难的了。
当然如果安全要求不高,那就可以做成很简单的了,直接把所有的jsp页面全部放在webRoot底下,在WebRoot下页面用户可以直接输入地址访问。