`
liuyuedeyu163
  • 浏览: 8209 次
社区版块
存档分类
最新评论

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

    博客分类:
  • web
 
阅读更多

 

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

2011-07-24 21:14 161人阅读 评论(0) 收藏 举报

 

本人在看《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就会显示“跳转成功!”这条信息,这表示系统允许这样的跳转。

 

注意:CSS文件要存放在根目录,此时引用要用绝对路径!!!引用格式如:/项目名/css文件夹/*.css

 

来自:http://blog.sina.com.cn/s/blog_4baadb1f01009fin.html

 

================jsp访问WEB-INF下面的资源=============

 

方法1

本来WEB-INF中的jsp就是无法通过地址栏访问的.所以安全.如果说你要访问这个文件夹中的jsp文件需要在项目的web.xml文件中去配置servlet格式差不多的配置就ok了.

 

如下:

<servlet>

         <servlet-name>runtain</servlet-name>

         <jsp-file>/WEB-INF/INF.jsp</jsp-file>

</servlet>

<servlet-mapping>

         <servlet-name>runtain</servlet-name>

         <url-pattern>/XXX</url-pattern>

 

访问地址:http://localhost:8080/runtain/xxx

就可以看见内容了.!

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

方法3:request.getRequestDispatcher("/WEB-INF/a.jsp").forward(request, response);

 

 

怎么样让servlet访问web-inf下的网页或jsp文件呢.因为web-inf下,应用服务器把它指为禁访目录,即直接在浏览器里是不能访问到的.

因些,可以让servlet进行访问,如web-inf下有a.jsp则可以用request.getRequestDispatcher("/WEB-INF/a.jsp").forward(request,response);进行派遣访问.但如果web-inf下有a.htm,则用request.getRequestDispatcher("/WEB-INF/a.htm").forward(request,response);就不能访问.

 

一开始想不通,觉得怪.后来想想,jsp其实也是servlet,会自动编译的,于是work目录下会有/web-inf/a$jsp.class类型,于是有头绪了,让应用服务器能够编译.htm,如a$htm.class.抱有这个想法,开始动手

 

在tomcat下的conf/web,找到jsp的访问方式,

 

<servlet-mapping>

     <servlet-name>jsp</servlet-name>

     <url-pattern>*.jsp</url-pattern>

   </servlet-mapping>

 

于是在下面添加

 

<servlet-mapping>

     <servlet-name>jsp</servlet-name>

     <url-pattern>*.htm</url-pattern>

   </servlet-mapping>

   <servlet-mapping>

     <servlet-name>jsp</servlet-name>

     <url-pattern>*.html</url-pattern>

   </servlet-mapping>

 

结果:一切OK,访问a.htm,和a.html在work/web-inf/下者有a$htm.class,a$html.class生成

 

转自:http://blog.csdn.net/yangzl2008/article/details/6630202

分享到:
评论

相关推荐

    java读取WEB-INF或src目录下的properties配置文件

    大家都喜欢把配置文件放在src目录下,如果有10个以上的配置文件为什么不考虑在WEB-INF目录下新建一个文件夹,专门放配置文件;这样即好管理,文件安全性又高。亲问题已经解决,把源代码共享给大家,已经通过测试;...

    struts 教程 很好很详细

    把JSP放到WEB-INF后以保护JSP源代码 22 使用 Prebuilt Action类提升开发效率 23 Struts标记库 25 定制JSP标记 25 资源束 26 Bean标记 27 Bean复制标记 27 定义脚本变量的标记 28 显示Bean属性 29 消息标记和国际化 ...

    java Struts教程

    把JSP放到WEB-INF后以保护JSP源代码 22 使用 Prebuilt Action类提升开发效率 23 Struts标记库 25 定制JSP标记 25 资源束 26 Bean标记 27 Bean复制标记 27 定义脚本变量的标记 28 显示Bean属性 29 消息标记和国际化 ...

    struts 入门教程

    把JSP放到WEB-INF后以保护JSP源代码 22 使用 Prebuilt Action类提升开发效率 23 Struts标记库 25 定制JSP标记 25 资源束 26 Bean标记 27 Bean复制标记 27 定义脚本变量的标记 28 显示Bean属性 29 消息标记和国际化 ...

    struts的教程.doc

    把JSP放到WEB-INF后以保护JSP源代码 22 使用 Prebuilt Action类提升开发效率 23 Struts标记库 25 定制JSP标记 25 资源束 26 Bean标记 27 Bean复制标记 27 定义脚本变量的标记 28 显示Bean属性 29 消息标记...

    JSP动态网页制作基础培训教程源代码.rar

    此部分是指文件夹名为第1~9章中的内容(如表1),这些是书中介绍JSP相关知识的源代码。文件的命名规则与书中相应源代码文件名一致。读者可将相关文件夹(如ch2)拷贝到Tomcat服务器安装目录的子目录webapps下,并...

    JSP案例开发集锦--源代码

    学习JSP开发的典型案例,1.... 如果某些章节中要使用Bean或Servlet或嵌入Applet,那么需将本章下.java文件编译,然后复制到JSP文件所在目录的\WEB-INF\classes目录下,并以章节名如ch4建立文件夹。

    Java Struts教程

    INF后以保护JSP源代码............................................................................21 使用 Prebuilt Action类提升开发效率...................................................................

    MeyboMail Web(Java) 邮件 群发源代码

    一、安装简要说明 1、安装JDK1.4.2以上版本(注意配置java_home路径) ...\WEB-INF\src:MeyboMail Web开源简化版的java源代码。 \WEB-INF\easyjweb:系统动态页面模板。 \WEB-INF\lib:系统的支持库文件。

    基于jsp的通讯录系统

    基于j1、直接将解压后的文件(totgb)复制到你的webapps目录下 2、修改totgb/WEB-INF/classes目录下的log4j.properties文件中log4j.appender.file.File为你的log文件存放目录。 3、安装数据库:mysql -u root -p 存放...

    溢洋论坛1.12版 JSP bbs 源代码

    先将\\WEB-INF\classes\ 目录下的“yy”目录拷贝到你的虚拟目录下的:\\WEB-INF\classes\下。 溢洋论坛这里使用的ACCESS数据数据库。 数据源名称:yyForum,用户名:xyworker,密码:999 也可以改变jdbc.java ...

    使用SpringBoot创建web项目,并使用外部Tomcat,并且使工程支持JSP(源代码)

    4.创建webapp、WEB-INF、web.xml 二、使用外部Tomcat 三、测试是否支持jsp controller 跳转页面 访问页面 application.properties 测试 简单介绍: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化...

    基于JSP的BBS论坛的源代码

    BBS论坛的源代码 运行方式如下: 1.将SimpleBBS\database\Student.mdf以及SQLTest.mdf这两个数据库附加到SQLServer 2005中 2.将SimpleBBS整个文件夹复制到MyEclipse的“个人工作空间(WorkSpace)”。 3.启动...

    JSP案例开发集锦源代码

    1. 本书的代码大部分在Tomcat5.0和MYSQL下开发,... 如果某些章节中要使用Bean或Servlet或嵌入Applet,那么需将本章下.java文件编译,然后复制到JSP文件所在目录的\WEB-INF\classes目录下,并以章节名如ch4建立文件夹。

    jsp网站设计经典教程

    1. 本书的代码大部分在Tomcat5.0和MYSQL下开发,... 如果某些章节中要使用Bean或Servlet或嵌入Applet,那么需将本章下.java文件编译,然后复制到JSP文件所在目录的\WEB-INF\classes目录下,并以章节名如ch4建立文件夹。

    Eclipse开发的JSP科技企业信息管理系统源码

    密码为空,如果为sa用户设置了密码,请修改源代码\修改需要的源文件[Eclipse]\tech\jdbc\jdbc.java中的数据库连接代码,然后重新编译这个类,编译后把编译成的class,复制到Tomcat的webapps目录下的tech\WEB-INF\...

    javeweb实训六源代码

    这是javaweb实训六的源代码。 资源结构 └─chapter06 ├─.settings ├─build │ └─classes │ └─cn │ └─itcast │ └─jsp ├─src │ └─cn │ └─itcast │ └─jsp └─WebContent ├─...

    jsp源码-网络交易系统

    jsp源码实例-网络交易系统 import="java.util.*,domain.*,struts.page.*" pageEncoding="GB2312" errorPage="error.jsp"%&gt; &lt;!DOCTYPE ...

Global site tag (gtag.js) - Google Analytics