Issue #3487 WebAppClassLoader does not definePackage
Added a test to the test-server-spec to demonstrate the issue
This commit is contained in:
parent
8427c52c8f
commit
ed03682071
|
@ -231,7 +231,8 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.eclipse.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-util</artifactId>
|
<artifactId>jetty-util</artifactId>
|
||||||
<version>${project.version}</version>
|
<!-- deliberately old version to test classloading -->
|
||||||
|
<version>9.3.0.RC0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -0,0 +1,132 @@
|
||||||
|
//
|
||||||
|
// ========================================================================
|
||||||
|
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// All rights reserved. This program and the accompanying materials
|
||||||
|
// are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
// and Apache License v2.0 which accompanies this distribution.
|
||||||
|
//
|
||||||
|
// The Eclipse Public License is available at
|
||||||
|
// http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
//
|
||||||
|
// The Apache License v2.0 is available at
|
||||||
|
// http://www.opensource.org/licenses/apache2.0.php
|
||||||
|
//
|
||||||
|
// You may elect to redistribute this code under either of these licenses.
|
||||||
|
// ========================================================================
|
||||||
|
//
|
||||||
|
|
||||||
|
package com.acme.test;
|
||||||
|
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.security.CodeSource;
|
||||||
|
import java.security.ProtectionDomain;
|
||||||
|
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.annotation.WebServlet;
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.util.IO;
|
||||||
|
|
||||||
|
@WebServlet(urlPatterns="/classloader")
|
||||||
|
public class ClassLoaderServlet extends HttpServlet
|
||||||
|
{
|
||||||
|
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
|
||||||
|
throws ServletException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
PrintWriter writer = resp.getWriter();
|
||||||
|
writer.println("<html>");
|
||||||
|
writer.println("<HEAD><link rel=\"stylesheet\" type=\"text/css\" href=\"stylesheet.css\"/></HEAD>");
|
||||||
|
writer.println("<body>");
|
||||||
|
writer.println("<h1>ClassLoader Isolation Test</h1>");
|
||||||
|
|
||||||
|
Class<?> webappIO = IO.class;
|
||||||
|
URI webappURI = getLocationOfClass(webappIO);
|
||||||
|
String webappVersion = webappIO.getPackage().getImplementationVersion();
|
||||||
|
Class<?> serverIO = req.getServletContext().getClass().getClassLoader().loadClass("org.eclipse.jetty.util.IO");
|
||||||
|
URI serverURI = getLocationOfClass(serverIO);
|
||||||
|
String serverVersion = serverIO.getPackage().getImplementationVersion();
|
||||||
|
|
||||||
|
writer.printf("<p>Webapp loaded <code>org.eclipse.jetty.util.IO</code>(%s) from %s%n",webappVersion,webappURI);
|
||||||
|
writer.printf("<br/>Server loaded <code>org.eclipse.jetty.util.IO</code>(%s) from %s%n",serverVersion, serverURI);
|
||||||
|
if (webappVersion.equals(serverVersion))
|
||||||
|
writer.println("<br/><b>Version Result: <span class=\"fail\">FAIL</span></b>");
|
||||||
|
else
|
||||||
|
writer.println("<br/><b>Version Result: <span class=\"pass\">PASS</span></b>");
|
||||||
|
if (webappURI.equals(serverURI))
|
||||||
|
writer.println("<br/><b>URI Result: <span class=\"fail\">FAIL</span></b></p>");
|
||||||
|
else
|
||||||
|
writer.println("<br/><b>URI Result: <span class=\"pass\">PASS</span></b></p>");
|
||||||
|
|
||||||
|
writer.println("</body>");
|
||||||
|
writer.println("</html>");
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
throw new ServletException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
public static URI getLocationOfClass(Class<?> clazz)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ProtectionDomain domain = clazz.getProtectionDomain();
|
||||||
|
if (domain != null)
|
||||||
|
{
|
||||||
|
CodeSource source = domain.getCodeSource();
|
||||||
|
if (source != null)
|
||||||
|
{
|
||||||
|
URL location = source.getLocation();
|
||||||
|
|
||||||
|
if (location != null)
|
||||||
|
return location.toURI();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String resourceName = clazz.getName().replace('.', '/') + ".class";
|
||||||
|
ClassLoader loader = clazz.getClassLoader();
|
||||||
|
URL url = (loader == null ? ClassLoader.getSystemClassLoader() : loader).getResource(resourceName);
|
||||||
|
if (url != null)
|
||||||
|
{
|
||||||
|
return getJarSource(url.toURI());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (URISyntaxException e)
|
||||||
|
{
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static URI getJarSource(URI uri)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!"jar".equals(uri.getScheme()))
|
||||||
|
return uri;
|
||||||
|
// Get SSP (retaining encoded form)
|
||||||
|
String s = uri.getRawSchemeSpecificPart();
|
||||||
|
int bang_slash = s.indexOf("!/");
|
||||||
|
if (bang_slash>=0)
|
||||||
|
s=s.substring(0,bang_slash);
|
||||||
|
return new URI(s);
|
||||||
|
}
|
||||||
|
catch(URISyntaxException e)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,6 +19,7 @@
|
||||||
package com.acme.test;
|
package com.acme.test;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import javax.servlet.ServletConfig;
|
import javax.servlet.ServletConfig;
|
||||||
|
@ -30,7 +31,6 @@ import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.servlet.http.Part;
|
import javax.servlet.http.Part;
|
||||||
|
|
||||||
import org.eclipse.jetty.util.IO;
|
|
||||||
/**
|
/**
|
||||||
* MultiPartTest
|
* MultiPartTest
|
||||||
*
|
*
|
||||||
|
@ -42,9 +42,11 @@ import org.eclipse.jetty.util.IO;
|
||||||
@MultipartConfig(location="foo/bar", maxFileSize=10240, maxRequestSize=-1, fileSizeThreshold=2048)
|
@MultipartConfig(location="foo/bar", maxFileSize=10240, maxRequestSize=-1, fileSizeThreshold=2048)
|
||||||
public class MultiPartTest extends HttpServlet
|
public class MultiPartTest extends HttpServlet
|
||||||
{
|
{
|
||||||
|
private static int bufferSize = 4096;
|
||||||
private ServletConfig config;
|
private ServletConfig config;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void init(ServletConfig config) throws ServletException
|
public void init(ServletConfig config) throws ServletException
|
||||||
{
|
{
|
||||||
super.init(config);
|
super.init(config);
|
||||||
|
@ -76,7 +78,35 @@ public class MultiPartTest extends HttpServlet
|
||||||
if (p.getContentType() == null || p.getContentType().startsWith("text/plain"))
|
if (p.getContentType() == null || p.getContentType().startsWith("text/plain"))
|
||||||
{
|
{
|
||||||
out.println("<p>");
|
out.println("<p>");
|
||||||
IO.copy(p.getInputStream(),out);
|
InputStream in = p.getInputStream();
|
||||||
|
long byteCount = -1;
|
||||||
|
byte buffer[] = new byte[bufferSize];
|
||||||
|
int len= bufferSize;
|
||||||
|
|
||||||
|
if (byteCount>=0)
|
||||||
|
{
|
||||||
|
while (byteCount>0)
|
||||||
|
{
|
||||||
|
int max = byteCount< bufferSize?(int)byteCount: bufferSize;
|
||||||
|
len=in.read(buffer,0,max);
|
||||||
|
|
||||||
|
if (len==-1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
byteCount -= len;
|
||||||
|
out.write(buffer,0,len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
len=in.read(buffer,0, bufferSize);
|
||||||
|
if (len<0 )
|
||||||
|
break;
|
||||||
|
out.write(buffer,0,len);
|
||||||
|
}
|
||||||
|
}
|
||||||
out.println("</p>");
|
out.println("</p>");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,8 +41,8 @@ public class SecuredServlet extends HttpServlet
|
||||||
PrintWriter writer = resp.getWriter();
|
PrintWriter writer = resp.getWriter();
|
||||||
writer.println( "<html>");
|
writer.println( "<html>");
|
||||||
writer.println("<HEAD><link rel=\"stylesheet\" type=\"text/css\" href=\"../stylesheet.css\"/></HEAD>");
|
writer.println("<HEAD><link rel=\"stylesheet\" type=\"text/css\" href=\"../stylesheet.css\"/></HEAD>");
|
||||||
writer.println("<h1>@ServletSecurity</h1>");
|
|
||||||
writer.println("<body>");
|
writer.println("<body>");
|
||||||
|
writer.println("<h1>@ServletSecurity</h1>");
|
||||||
writer.println("<pre>");
|
writer.println("<pre>");
|
||||||
writer.println("@ServletSecurity");
|
writer.println("@ServletSecurity");
|
||||||
writer.println("public class SecuredServlet");
|
writer.println("public class SecuredServlet");
|
||||||
|
|
|
@ -65,10 +65,14 @@ Test of the annotation:
|
||||||
<button type="submit">Test AsyncListener</button>
|
<button type="submit">Test AsyncListener</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<center>
|
<h3>Test ClassPath Isolation </h3>
|
||||||
|
<p>Click the link to test classpath isolation of system and server classes</p>
|
||||||
|
<a href="classloader">ClassPathServlet</a>
|
||||||
|
|
||||||
|
<div style="text-align: center;">
|
||||||
<hr/>
|
<hr/>
|
||||||
<a href="http://www.eclipse.org/jetty"><img style="border:0" src="images/small_powered_by.gif"/></a>
|
<a href="http://www.eclipse.org/jetty"><img style="border:0" src="images/small_powered_by.gif"/></a>
|
||||||
</center>
|
</div>
|
||||||
|
|
||||||
</BODY>
|
</BODY>
|
||||||
</HTML>
|
</HTML>
|
||||||
|
|
Loading…
Reference in New Issue