getRequestDispatcher(。)。forward(req,res)抛出java.io.FileNotFoundException

时间:2016-02-25 10:06:03

标签: servlets websphere-8 requestdispatcher

我已将Servlet从2.4升级到3.0,并在Websphere 8.5.5.8上部署了我的应用程序。 Application Server正常启动。 当我尝试在浏览器中访问我的home.jsp页面时,它会抛出:

  

控制器主错误OG1000SRVE0190E:找不到文件:/servlet/com.platform7.affina.operations.servlet.ValidateLoginUser

当我尝试调试时,代码命中我的主控制器Servlet(在同一个包中)但在我调用的Controller servlet类中:

this.getServletContext().getRequestDispatcher("Servlet/com.platform7.affina.operations.servlet.ValidateLoginUser").forward(request, response);

引发:

  

Servlet / com.platform7.affina.operations.servlet.ValidateLoginUser的FileNotFoundException。

ValidateLoginUser位于相同的包和类文件夹位置!

文件夹结构:

\NEED4SPEEDCell02\operations_1.ear\OperationsWeb.war\WEB-INF\classes\com\platform7\affina\operations\servlet

ControllerMain.classValidateLoginUser.class位于相同的servlet包中。

我的Web.xml文件:

<servlet>
    <servlet-name>servletMain</servlet-name>
    <servlet-class>com.platform7.affina.operations.servlet.ControllerMain</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>servletMain</servlet-name>
    <url-pattern>/controllerMain</url-pattern>
</servlet-mapping>

所以,当我访问我的网址时:它会点击ControllerMain.class但是在这个类中,我正在调用另一个不属于web.xml但位于ControllerMain.class的相同包中的servlet。 / p>

当我打印realpath时:this.getServletContext().getRealPath("/"));

我明白了:

  

C:\ WebSphere858 \ AppServer的\型材\ AppSrv01 \ installedApps \ NEED4SPEEDCell02 \ operations_1.ear \ OperationsWeb.war

我也尝试使用getNamedDispatcher(..),但抛出:null

相同的代码在Websphere 7上运行良好,甚至适用于Websphere 8.5.5.5

3 个答案:

答案 0 :(得分:2)

由于security reasonscom.ibm.ws.webcontainer.disallowServeServletsByClassname属性的默认设置已更改。

  

请注意:此APAR已更改了默认值   WebContainer自定义属性   从 false com.ibm.ws.webcontainer.disallowServeServletsByClassname    true ,以便不会发生安全威胁。在此之前,它   由开发人员记住要将自定义属性更改为   在部署到生产中之前是真的。

     

物业名称:   com.ibm.ws.webcontainer.disallowServeServletsByClassname描述:   如果设置为true,则禁止使用serveServletsByClassnameEnabled   在应用程序服务器级别,覆盖任何设置   serveServletsByClassnameEnabled在应用程序级别。这个   属性影响所有应用程序值:true(默认)/ false

您需要将该自定义属性添加到Web容器,并将其设置为 false ,以便按类名提供servlet。

但是正如BalusC建议的那样,你应该以下面的形式将你的servlet添加到web.xml

<servlet>
    <servlet-name>servletMain</servlet-name>
    <servlet-class>com.platform7.affina.operations.servlet.ValidateLoginUser</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>servletMain</servlet-name>
    <url-pattern>/validateLoginUser</url-pattern>
</servlet-mapping>

并将其更改为:

this.getServletContext().getRequestDispatcher("/validateLoginUser").forward(request, response);

对同一个包中的其他类做同样的事情。

答案 1 :(得分:1)

您似乎依赖已知具有重大安全漏洞的遗留InvokerServlet。这在Tomcat 5和克隆(WebSphere 4)中已弃用,并在Tomcat 7和克隆(WebSphere 6)中删除。

你不应该再使用它了。只需将servlet映射到普通的URL模式并调用它。假设servlet在servlet类上通过/validateLoginUser注释的@WebServlet("/validateLoginUser")映射,或者通过servlet上的<url-pattern>/validateLoginUser</url-pattern>映射中的web.xml映射,那么你可以得到请求调度程序如下:

request.getRequestDispatcher("/validateLoginUser");

或者,只需使用方法将共享代码重构为普通Java类,并以通常的Java方式调用它。现在有一种奇怪的做法是将共享验证逻辑紧密耦合在一个servlet中。

另见:

答案 2 :(得分:0)

为了使上述升级工作,我做了一些其他更改,以便将来参考。

主要是,我必须更改websphere的绑定文件。 以前,我有两个绑定 ibm-web-bnd.xmi ibm-web-ext.xmi

IBM的Web-bnd.xmi

<?xml version="1.0" encoding="UTF-8"?>
<com.ibm.ejs.models.base.bindings.webappbnd:WebAppBinding xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:com.ibm.ejs.models.base.bindings.webappbnd="webappbnd.xmi" xmi:id="WebAppBinding_1226331113121" virtualHostName="default_host">
  <webapp href="WEB-INF/web.xml#WebApp"/>
    <resRefBindings xmi:id="ResourceRefBinding_1226331113121" jndiName="AffinaDataSource_pma">
      <bindingResourceRef href="WEB-INF/web.xml#ResourceRef_AffinaDataSource_pma"/>
    </resRefBindings>
</com.ibm.ejs.models.base.bindings.webappbnd:WebAppBinding>

IBM的Web-ext.xmi文件

<?xml version="1.0" encoding="UTF-8"?>
<com.ibm.ejs.models.base.extensions.webappext:WebAppExtension 
    xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" 
    xmlns:com.ibm.ejs.models.base.extensions.webappext="webappext.xmi" 
    xmi:id="WebAppExtension_1226331113121"
    serveServletsByClassnameEnabled="true">
  <webApp href="WEB-INF/web.xml#WebApp"/>
  <jspAttributes xmi:id="JSPAttribute_1226331113121" name="reloadEnabled" value="true"/>
  <jspAttributes xmi:id="JSPAttribute_1226331113122" name="reloadInterval" value="10"/>
</com.ibm.ejs.models.base.extensions.webappext:WebAppExtension>

因此,根据servlet3和Websphere 8.5.5.8,我更改为使用 ibm-web-bnd.xml

替换上述两个.xmi文件
<?xml version="1.0" encoding="UTF-8"?>
<web-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd" version="1.0">

  <virtual-host name="default_host"/>
  <resource-ref name="AffinaDataSourceAlias_pma" binding-name="AffinaDataSource_pma"/>

</web-bnd>

然后在Websphere 8.5.5.8上安装应用程序时,它用于抛出outofmemmory错误,所以要修复我在wsadmin.bat中将最大内存参数从256m更改为512m

C:\ WebSphere858 \ AppServer的\ BIN \ wsadmin.bat

set PERFJAVAOPTION=-Xms256m -Xmx512m -Xquickstart

希望这有帮助。