`

jsp放在web-inf下,原因

    博客分类:
  • Java
 
阅读更多

jsp放在web-inf下,原因主要有两个 

1. 远古时代的模式会把业务逻辑,数据库连接等敏感信息写在jsp里面,被用户直接访问会有安全问题。 
现代模式里这个不再成为问题,不应该成为问题。 

2. jsp是在服务器端运行的,而且通常都需要其他程序支持——比如后台处理好数据再让jsp渲染等,用户直接访问一则没有意义,二则会抛异常,这些都浪费服务器资源。 



其次,如果你一定要放在web-inf下。 
需要弄个servlet来forward,或者读取文件后写在response上。 

如果是spring,可以参考 
http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html 

 

 

 

 

 

本人在看《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 被放置在不同的目录下

这种方法的问题是这些页面文件容易被偷看到源代码,或被直接调用。某些场合下这可能不是个大问题,可是在特定情形中却可能构成安全隐患。用户可以绕过Strutscontroller直接调用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进行配置,如下:

4WEB-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生成

分享到:
评论

相关推荐

    JSP文件是否有必要放在WEB-INF下

    真正的原因是,对于早期直接嵌入Java代码的JSP,是直接给出JSP路径给用户访问的,这种情况恰恰不能放在WEB-INF目录下。而到了现在的MVC模式,JSP已经不是曾经那个包含完整逻辑的JSP,而仅仅充当View层的模板,必须要...

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

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

    详解直接访问WEB-INF目录下的JSP页面的方法

    需要注意的是,尽管这样做可以访问WEB-INF下的资源,但并不意味着可以随意将JSP页面放在WEB-INF目录下。最佳实践是将JSP页面和Java类放在WEB-INF目录中,而将静态资源(如HTML、CSS、JavaScript文件)放在Web应用的...

    WEB-INF.tar.gz

    然而,在某些情况下,为了安全或管理目的,开发者可能会选择将静态文件放在`WEB-INF`下,但这不是标准做法。 关联的标签“tomcat”表明这个Web应用是部署在Apache Tomcat服务器上的。Tomcat是一个开源的Servlet容器...

    JSP.rar_web-inf

    这个目录下的文件不能通过URL直接访问,只能由Web应用内部的组件如Servlet或JSP页面访问,这增加了应用的安全性。 **Eclipse IDE for JSP开发** Eclipse是一款强大的集成开发环境(IDE),尤其适合Java开发者。它...

    WEB-INF.zip_.inf ocx

    在JSP中,如果需要访问服务器端的Java代码,这些代码通常会放在`WEB-INF/classes`或`WEB-INF/lib`下的jar文件中。 6. ActiveX控件:描述中提及的".ocx"文件可能用于在支持ActiveX的浏览器(主要是旧版Internet ...

    SpringMVC如何访问WEB-INF jsp过程解析

    在SpringMVC框架中,访问`WEB-INF`下的`jsp`页面是常见的需求,因为将视图文件放在`WEB-INF`目录下可以增加安全性,防止直接通过URL访问。本篇文章将详细解析SpringMVC访问`WEB-INF/jsp`的过程。 首先,让我们了解...

    WEB-INFO参考资料

    `WEB-INF`是Web应用的标准组成部分,根据Java Servlet规范定义,它位于Web应用的根目录下。这个目录包含了对用户不可见的敏感信息和资源,如Servlet类、配置文件等。 首先,我们来详细了解一下`WEB-INF`目录的主要...

    javax.servlet.jsp.jstl-1.2.zip

    在Web应用中,通常将这个jar文件放在WEB-INF/lib目录下,以便服务器能够加载并使用JSTL的类和功能。 **4. 源码和API** 源码对于开发者来说是极其宝贵的资源,它可以帮助我们理解JSTL的内部工作原理,进行调试或...

    搭建ssm所使用的jar包!放到lib文件夹下的jar包

    在搭建SSM项目时,我们需要在项目的`lib`文件夹下放置一系列的jar包,这些jar包是SSM框架运行的基础。 首先,Spring框架是整个SSM的核心,它提供了依赖注入(DI)和面向切面编程(AOP)的能力。在`lib`文件夹中,...

    springboot-jspweb应用开发(使用内部tomcat)

    JSP文件应放在`/WEB-INF/jsp/`路径下。例如,创建一个名为`index.jsp`的文件。 4. **定义Controller** - 在Java源码中创建一个Controller类,例如`DemoController`,并编写处理请求的方法。使用`@RestController`...

    jsp环境搭建web编程

    6. **运行JSP**:将JSP文件放在Tomcat的`webapps`目录下的一个Web应用目录内,然后启动服务器。通过浏览器访问`http://localhost:8080/yourwebapp/yourjspfile.jsp`,即可查看和测试JSP页面。 7. **Servlet基础**:...

    学籍管理系统1-jsp

    项目文件名为stu放在tomcat中webapps下,项目文件下建了WEB-INF和iamges文件夹,WEB-INF下有classes和lib文件夹和一个xml配置文档,classes文件夹用于存放自己编写的类,lib文件夹下存放tomcat服务器及web应用程序都...

    myeclipse的WebRoot下的jsp访问不了

    ### MyEclipse中WebRoot下的JSP访问问题详解 #### 一、问题概述 在使用MyEclipse开发Java Web应用程序时,可能会遇到一种情况:放置在项目目录下的JSP文件可以正常访问,但如果将这些JSP文件放置在项目的WebRoot...

    JSP-and-JavaBeans

    将JavaBeans部署到服务器上涉及编译JavaBeans源代码,并将编译后的`.class`文件放置到Web应用的`WEB-INF/classes`目录下,或者打包成`.jar`文件放在`WEB-INF/lib`目录中。服务器会自动加载这些类,使其可供JSP页面或...

    JSP交友网站系统,源码,论文项目说明,数据库

    3.所有的JSP文件放在makefriend下,makefriend放在webapps/下,在makefriend下还放着images文件夹(里面分别存放着项目所用到的图片.和WEB-INF. 4.在WEB-INF文件夹下的classes文件夹下存放着tom/jiafei文件夹,文件夹...

    FCK editor的一个改好了的简单例子,可以直接部署使用

    一个已经改好的FCK的例子,可以直接部署到工程里使用 其中: UserFiles、FCKeditor放在WEB-ROOT下;*.JAR放到LIB里;*.TLD放在WEB-INF下;测试页TEST.JSP放在WEB-ROOT下,方便使用。

    omck.rar_www./inf988.com_文件操作

    开发者通常不希望这些文件直接被Web客户端访问,因此放在WEB-INF下。 6. **xe5META-INF**:这看起来像是一个错误的目录名,标准的JAR或WAR文件中,元数据通常位于"META-INF"目录下,包含MANIFEST.MF文件和其他元...

    jstl.jar和 standard.jar包

    在部署Web应用程序时,将这两个jar包放入`WEB-INF/lib`目录是非常重要的步骤。这是因为Web容器(如Tomcat、Jetty等)会自动扫描这个目录,加载其中的库文件,使得Web应用能够使用JSTL的功能。如果缺少这些库,JSP...

Global site tag (gtag.js) - Google Analytics