2013-06-17 32 views
5

Tôi cố gắng phát hiện xem ứng dụng có đang chạy trên Eclipse Jetty như thùng chứa servlet hay không. Tôi đã tìm thấy solution for Mortbay Jetty, nhưng không tìm thấy phiên bản thực tế từ Eclipse. Tôi đã sửa đổi kiểm tra hiện tại và thay thế Classpath từ "/org/mortbay/jetty/Server.class" thành "/org/eclipse/jetty/server/Server.class" nhưng kiểm tra không thành công trên Jetty 9. Chạy cùng một ứng dụng trên tomcat đã thành công. Tôi đã làm gì sai?Phát hiện nếu chạy thùng chứa servlet là Eclipse Jetty

Mã này trông giống như:

private boolean detect(final String clazz) { 
    try { 
    final ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); 
    systemClassLoader.loadClass(clazz); 
    return true; 
    } catch (final ClassNotFoundException cnfe) { 
    final Class<?> classObj = getClass(); 
     if (classObj.getResource(clazz) != null) { 
     return true; 
    } else { 
     return false; 
     } 
    } 
} 

Chức năng gọi với:

detect("/org/eclipse/jetty/server/Server.class"); 

Trả lời

3

Tiếp cận lớp máy chủ có thể được thực hiện từ chế độ nhúng, nhưng không phải là một Jetty độc lập. Điều này là do WebAppClassloader tách biệt quyền truy cập vào lớp org.eclipse.jetty.server.Server đối với các ứng dụng web. Tuy nhiên, bạn có thể sử dụng thực tế là tất cả thùng chứa servlet phải thực hiện default servlet, chỉ cần sử dụng ServletContext để truy cập RequestDispatcher cho servlet mặc định và chú ý đến tên lớp triển khai. Dường như hoạt động tốt trên cả Jetty 8.1.10 và 9.0.3 khi sử dụng được nhúng. (Sẽ thử lại trên cầu cảng độc lập trong thời gian ngắn)

Full lớp làm ví dụ:

package com.company.foo; 

import java.io.IOException; 
import java.io.PrintWriter; 
import java.lang.reflect.Method; 

import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

@WebServlet(urlPatterns = { "/detect" }) 
@SuppressWarnings("serial") 
public class DetectServlet extends HttpServlet 
{ 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
    { 
     resp.setContentType("text/plain"); 
     PrintWriter out = resp.getWriter(); 
     detect(out,"org.eclipse.jetty.server.Server"); 
     detect(out,"/org/eclipse/jetty/server/Server.class"); 
     detect(out,"org.eclipse.jetty.server.Request"); 
     detect(out,"/org/eclipse/jetty/server/Request.class"); 
     detect(out,"org.mortbay.jetty.Server"); 
     detect(out,"/org/mortbay/jetty/Server.class"); 

     detectDefaultServlet(out, req, "org.eclipse.jetty"); 
     detectDefaultServlet(out, req, "org.apache.catalina"); 

     String version = getReflectedMethodValue("org.eclipse.jetty.server.Server", "getVersion"); 
     out.printf("Server.getVersion() = %s%n", version); 
    } 

    private void detectDefaultServlet(PrintWriter out, HttpServletRequest req, String keyword) 
    { 
     // Request the default servlet (its pretty safe to say it will always be there) 
     RequestDispatcher dispatcher = req.getServletContext().getNamedDispatcher("default"); 
     if(dispatcher == null) { 
      out.printf("detectDefaultServlet(out, req, \"%s\") = <no default servlet>%n", keyword); 
      return; 
     } 

     // If the request dispatcher implementation contains the keyword, we can claim a match 
     boolean detected = dispatcher.getClass().getName().contains(keyword); 
     out.printf("detectDefaultServlet(out, req, \"%s\") = %b (%s)%n", keyword, detected, dispatcher.getClass().getName()); 
    } 

    private String getReflectedMethodValue(String clazzName, String methodName) 
    { 
     ClassLoader loader = ClassLoader.getSystemClassLoader(); 
     try 
     { 
      Class<?> clazz = Class.forName(clazzName,false,loader); 
      Class<?> parameterTypes[] = new Class<?>[0]; 
      Method method = clazz.getDeclaredMethod(methodName,parameterTypes); 
      Object args[] = new Object[0]; 
      return (String)method.invoke(clazz,args); 
     } 
     catch (ClassNotFoundException e) 
     { 
      return "<class-not-found>"; 
     } 
     catch (Throwable t) 
     { 
      return "<" + t.getClass().getName() + ": " + t.getMessage() + ">"; 
     } 
    } 

    private void detect(PrintWriter out, String resource) 
    { 
     out.printf("detect(\"%s\") = %b%n",resource,detected(resource)); 
    } 

    private boolean detected(String clazz) 
    { 
     try 
     { 
      ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); 

      systemClassLoader.loadClass(clazz); 

      return true; 
     } 
     catch (ClassNotFoundException cnfe) 
     { 
      Class<?> classObj = getClass(); 

      if (classObj.getResource(clazz) != null) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 
} 

Mà sẽ cho kết quả sau trên Jetty 8.1.10 Embedded

detect("org.eclipse.jetty.server.Server") = true 
detect("/org/eclipse/jetty/server/Server.class") = true 
detect("org.eclipse.jetty.server.Request") = true 
detect("/org/eclipse/jetty/server/Request.class") = true 
detect("org.mortbay.jetty.Server") = false 
detect("/org/mortbay/jetty/Server.class") = false 
detectDefaultServlet(out, req, "org.eclipse.jetty") = true (org.eclipse.jetty.server.Dispatcher) 
detectDefaultServlet(out, req, "org.apache.catalina") = false (org.eclipse.jetty.server.Dispatcher) 
Server.getVersion() = 8.1.10.v20130312 

Và đầu ra tương tự như trên Cầu cảng 9.0.3 Nhúng

detect("org.eclipse.jetty.server.Server") = true 
detect("/org/eclipse/jetty/server/Server.class") = true 
detect("org.eclipse.jetty.server.Request") = true 
detect("/org/eclipse/jetty/server/Request.class") = true 
detect("org.mortbay.jetty.Server") = false 
detect("/org/mortbay/jetty/Server.class") = false 
detectDefaultServlet(out, req, "org.eclipse.jetty") = true (org.eclipse.jetty.server.Dispatcher) 
detectDefaultServlet(out, req, "org.apache.catalina") = false (org.eclipse.jetty.server.Dispatcher) 
Server.getVersion() = 9.0.3.v20130506 

Nhưng khác nhau cho Jetty 9.0.3 độc

detect("org.eclipse.jetty.server.Server") = false 
detect("/org/eclipse/jetty/server/Server.class") = false 
detect("org.eclipse.jetty.server.Request") = false 
detect("/org/eclipse/jetty/server/Request.class") = false 
detect("org.mortbay.jetty.Server") = false 
detect("/org/mortbay/jetty/Server.class") = false 
detectDefaultServlet(out, req, "org.eclipse.jetty") = true (org.eclipse.jetty.server.Dispatcher) 
detectDefaultServlet(out, req, "org.apache.catalina") = false (org.eclipse.jetty.server.Dispatcher) 
Server.getVersion() = <class-not-found> 
+0

Hãy đến với suy nghĩ của nó, bạn có thể sử dụng bất kỳ giao diện Servlet và xem nếu tên lớp thực hiện bắt đầu với ' "org.eclipse.jetty."' –

+0

Tính năng này hoạt động. Cảm ơn nhiều! – DaSilva2010

Các vấn đề liên quan