我已将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.class
和ValidateLoginUser.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
答案 0 :(得分:2)
由于security reasons,com.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
希望这有帮助。