专栏首页源哥的专栏把JSP放到WEB-INF后以保护JSP源代码

把JSP放到WEB-INF后以保护JSP源代码

    本人在看《J2EE核心模式》(“Core J2ee Patterns”,刘天北、熊节译),里面提到了一种实现资源保护的方法,那就是把那些限制访问的资源(比如说jsp源代码)放到Web应用的WEB-INF目录下,对于/web-INF/及其子目录,不允许直接的公共访问,所以就可以起到保护这些代码未经授权的访问和窥视,更好的保护了源代码(19页)。

这么书只是对这种方法进行了简单的介绍,没有描述详细处理方法,我测试了一下,没有办法对放到/WEB-INF的文件进行访问,所以我就上网搜索了一下,才明白了具体的处理方法,感觉非常适合用在STRUTS结构上的系统。下面请听我详细说明。

通常JSP开发人员会把他们的页面文件存放在Web应用相应的子目录下。一个典型的商店应用程序的目录结构如图2所示。跟catalog (商品目录)相关的JSP被保存在catalog子目录下。跟customer相关的JSP,跟订单相关的JSP等都按照这种方法存放。 图 2.基于不同的功能 JSP 被放置在不同的目录下

这种方法的问题是这些页面文件容易被偷看到源代码,或被直接调用。某些场合下这可能不是个大问题,可是在特定情形中却可能构成安全隐患。用户可以绕过Struts的controller直接调用JSP同样也是个问题。 为了减少风险,可以把这些页面文件移到WEB-INF 目录下。基于Servlet的声明,WEB-INF不作为Web应用的公共文档树的一部分。因此,WEB-INF 目录下的资源不是为客户直接服务的。我们仍然可以使用WEB-INF目录下的JSP页面来提供视图给客户,客户却不能直接请求访问JSP。 采用前面的例子,图3显示将JSP页面移到WEB-INF 目录下后的目录结构 图 3. JSP存放在 WEB-INF 目录下更为安全

如果把这些JSP页面文件移到WEB-INF 目录下,在调用页面的时候就必须把"WEB-INF"添加到URL中。

我们知道,实现页面的跳转有两种方式,一种是通过redirect的方式,一种是通过forward的方式。redirect方式的跳转,系统会在一个新的页面打开要跳转的网页;而forward方式跳转,系统会在原来的页面上打开一个要跳转的网页。所以放到WEB-INF目录下的文件是不允许采用redirect方式的跳转来访问的,如下

例1:/test/test1.jsp文件

<html>

<body>

<form name="testform" action="/WEB-INF/jsp/test/test.jsp">

<input type = "submit" value="test">

</form>

</body>

</html>

上面这段语句只有一个名为test的按钮,如果单击这个按钮是,系统就会跳转到/WEB-INF/jsp/test/test.jsp,它的代码如下:

例2:/WEB-INF/jsp/test/test.jsp文件

<html>

<body>

跳转成功!

</body>

</html>

事实上,这个跳转是无法成功的,点击按钮后,IE会报“403 Forbidden”的错误。

而forward方式的跳转则可以成功,如下代码:

例3:/test/test2.jsp文件

<html>

<body>

<form name="testform">

<jsp:forward page = "/WEB-INF/jsp/test/test.jsp" />

</form>

</body>

</html>

请注意上面红色的语句,这段就是通过forward的形式来访问/WEB-INF/jsp/test/test.jsp文件,在IE输入地址http://localhost/test1/test2.jsp,网页上就显示“跳转成功!”的信息了,这表示放到了WEB-INF可以通过forward的方式来访问。

个人认为,像这种方式的可能不大时候采用一般jsp进行编程的系统,因为很多页面上都有采用submit这样的方式来进行跳转,但这种方式却非常适合采用struts结构的系统。因为采用这个结果大多是先跳转到一个Action类,然后在Action类进行相关处理后(比如说获取相关的信息保存到session中,进行有效性的判断),然后再forward到另外一个页面,这样放到WEB-INF中的jsp代码可以被正常访问,也防止了对这些页面的直接访问,下面我来举例说明。

下面我们先对配置文件struts-config.xml进行配置,如下:

例4:WEB-INF/struts-config.xml文件

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>

<!-- ========== Action Mapping Definitions ============================== -->

<action-mappings>

<action path="/test"

type=" test.TestAction"

scope="request">

<forward name="test" path="/WEB-INF/jsp/test/test.jsp"/>

</action>

</action-mappings>

</struts-config>

上面这个配置非常简单,请看红色部分,这里定义了一个action类,它的路径为/test,所对应的类为test.TestAction.java,它都一个跳转页面,别名为test,对应的页面为/WEB-INF/jsp/test/test.jsp。

下面我们对例1的内容进行修改,使其跳转到/test去。

例5:修改后的/test/test1.jsp文件

<html>

<body>

<form name="testform" action="/test">

<input type = "submit" value="test">

</form>

</body>

</html>

这样我们在IE中访问http://localhost/test/test1.jsp,然后点击test按钮,页面就会跳转到test.TestAction.java这个类来,下面是这个类的内容。

package test;

import javax.servlet.http.*;

import org.apache.struts.action.ActionMapping;

import org.apache.struts.action.Action;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

public class TestAction extends Action

{

public ActionForward perform(ActionMapping mapping,

ActionForm form, HttpServletRequest req,

HttpServletResponse res)

{

return mapping.findForward("test");

}

}

可以看到,这个类是继承Action类的,所有的控制类都必须继承Action类,这个类里面有一个perform方法,跳转到这个类都是从这个方法进行访问的(新版本可以是execute方法),现在这个方法里面只有一条语句,这句话的意思就是跳转到一个别名为test的页面,也就是/WEB-INF/jsp/test/test.jsp页面,这样我们点击test按钮后,IE就会显示“跳转成功!”这条信息,这表示系统允许这样的跳转。

上面只是我对将jsp代码放到WEB-INF里面的好处的一点理解,如果大家有什么更好的想法或者有什么异议,欢迎告知。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 红米是个失败,雷军是个笨蛋

    最近关于小米和华为手机的争论甚嚣尘上,我也忍不住出来写这篇文章,我想告诉大家的是,大家的说法都是错误,大家没有抓住事情的本质。

    源哥
  • 大数据系列之----海量数据下是kafka设计和实战演练

           网上有很多Kafka的文章,但大多写得千篇一律,要么偏理论化,无实战数据参考。要么写了发现的某个问题的解决方案,对于想在实际环境上搭建真实的Kaf...

    源哥
  • 杀毒软件需要改变开发模式

    在现在的网络世界里,各类病毒、木马泛滥,虽然有各式各样的杀毒软件,而这些杀毒软件在病毒面前,显得是那么的脆弱,无论你安装了多少杀毒软件,当你在网络世界穿行的时...

    源哥
  • JSP存放在 WEB-INF 跟webroot的区别

    放在webroot下面:优点,程序结构清晰,便于编码和维护;缺点,要加过滤器。 放在web-inf下面:优点,不用过滤器;缺点,打乱了程序结构,编...

    西门呀在吹雪
  • Linux下手动编译安装PHP扩展的例子分享

    这篇文章主要介绍了Linux下手动编译安装PHP扩展的例子分享,本文以PDO_MYSQL为例,讲解手动编译安装PHP扩展的方法,需要的朋友可以参考下

    习惯说一说
  • 【经验分享】做计算机视觉的你,如何拿到大厂的Offer的?

    楼主研二计算机视觉方向的,水平不高,实习面试被拒,好奇大家是怎么利用自己的专业知识拿到Offer的?

    AI算法与图像处理
  • MySQL慢查询(上):你知道为啥会慢么?

    在过去的半年时间里,研发团队内部尝试抓了一波儿慢查询SQL跟进处理率。发现有些同学对于慢查询处理的思路就是看看有没有用到索引,没有用到就试图加一个,实在不行就甩...

    架构精进之路
  • 如何把MysSQL设置为大小写敏感

    MySQL在windows下是不区分大小写的,将script文件导入MySQL后表名也会自动转化为小写,结果再 想要将数据库导出放到linux服务器中使用时就出...

    葆宁
  • SQL优化案例 | 从Exadata迁移到国产沃趣一体机一般方法探究(四)

    存储技术的发展,闪存的出现,大大提升了数据库一体机的性能,随着闪存成本的降低,我相信未来Exadata也不会再有flashcache、flashlog相关的特性...

    沃趣科技
  • LeetCode 82. 删除排序链表中的重复元素 II(链表)

    给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

    Michael阿明

扫码关注云+社区

领取腾讯云代金券