2012-05-27 34 views
5

Tôi đã bị kẹt trên thẻ này một lúc. Tôi đang cố gắng để truy cập vào ContainerServlet tôi thực hiện bằng cách sử dụng HttpClient với Tomcat 7. Tôi tiếp tục nhận được thông báo lỗi "Restricted (ContainerServlet)". Tôi đã thêm Basic Authentication và cố gắng thiết lập nó giống như ứng dụng Host-Manager tích hợp mà không có may mắn.Lỗi Tomcat 7 (ContainerServlet) bị hạn chế

My HostManagerServlet bắt đầu với:

public class HostManagerServlet 
extends HttpServlet implements ContainerServlet {... 

web.xml của tôi chứa:

<servlet> 
      <servlet-name>virtualHostCreator</servlet-name> 
      <servlet-class>com.eatmyfish.servlets.HostManagerServlet</servlet-class> 
      </servlet> 
      <servlet-mapping> 
      <servlet-name>virtualHostCreator</servlet-name> 
      <url-pattern>/virtualhostcreator/*</url-pattern> 
      </servlet-mapping> 
    <security-constraint> 
     <web-resource-collection> 
      <web-resource-name>HostManager commands</web-resource-name> 
      <url-pattern>/virtualhostcreator/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <!-- NOTE: This role is not present in the default users file --> 
      <role-name>admin-script</role-name> 
     </auth-constraint> 
     </security-constraint> 
     <security-constraint> 
     <web-resource-collection> 
      <web-resource-name>HTMLHostManager commands</web-resource-name> 
      <url-pattern>/virtualhostcreator/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <!-- NOTE: This role is not present in the default users file --> 
      <role-name>admin-gui</role-name> 
     </auth-constraint> 
     </security-constraint> 
<login-config> 
    <auth-method>BASIC</auth-method> 
    </login-config> 
<security-role> 
    <description> 
     The role that is required to log in to the Host Manager Application HTML 
     interface 
    </description> 
    <role-name>admin-gui</role-name> 
    </security-role> 
    <security-role> 
    <description> 
     The role that is required to log in to the Host Manager Application text 
     interface 
    </description> 
    <role-name>admin-script</role-name> 
    </security-role> 

My tomcat-users.xml chứa:

. 
. 
. 
<role rolename="admin-gui"/> 
    <role rolename="admin-script"/> 
    <role rolename="manager-gui"/> 
    <role rolename="tomcat"/> 
    <role rolename="role1"/> 
    <user username="tomcat" password="tomcat" roles="tomcat,admin-gui,admin-script,manager-gui"/> 
. 
. 
. 

Các mã mà làm cho HttpClient cuộc gọi (Tôi đã thử một vài cách tiếp cận khác):

Tiếp cận Một -

String url = environment.getProperty("baseurl"); 
     url += "virtualhostcreator/createVirualHost?name="+group.getGroupName(); 
     HttpClient httpclient = new DefaultHttpClient(); 

     HttpGet httpget = new HttpGet(url); 
     httpget.addHeader(BasicScheme.authenticate(
       new UsernamePasswordCredentials("tomcat", "tomcat"), 
       "UTF-8", false)); 
     HttpResponse response = httpclient.execute(httpget); 

Tiếp cận Hai -

String url = environment.getProperty("baseurl"); 
     url += "virtualhostcreator/createVirualHost?name="+group.getGroupName(); 
     DefaultHttpClient httpclient = new DefaultHttpClient(); 
     httpclient.getCredentialsProvider().setCredentials(
       new AuthScope("localhost", 8080), 
       new UsernamePasswordCredentials("tomcat", "tomcat")); 
     // Create AuthCache instance 
     AuthCache authCache = new BasicAuthCache(); 
     // Generate BASIC scheme object and add it to the local 
     // auth cache 
     HttpHost targetHost = new HttpHost("localhost", 8080, "http"); 
     BasicScheme basicAuth = new BasicScheme(); 
     authCache.put(targetHost, basicAuth); 

     // Add AuthCache to the execution context 
     BasicHttpContext localcontext = new BasicHttpContext(); 
     localcontext.setAttribute("http.auth.auth-cache", authCache); 

     HttpGet httpget = new HttpGet(url); 

     HttpResponse response = httpclient.execute(targetHost, httpget,localcontext); 

của lỗi stacktrace:

SEVERE: Allocate exception for servlet virtualHostCreator 
java.lang.SecurityException: Restricted (ContainerServlet) class com.eatmyfish.servlets.HostManagerServlet 
    at org.apache.catalina.core.DefaultInstanceManager.checkAccess(DefaultInstanceManager.java:536) 
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:509) 
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:124) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1136) 
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:857) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:581) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 

Bất kỳ ý tưởng những gì tôi đang làm sai? Tôi không thể vượt qua lỗi Restricted (ContainerServlet).

+0

Dean - khi bạn đặt câu hỏi như thế này, bạn nên bao gồm stacktrace báo cáo lỗi. Nếu không có gì khác, nó sẽ làm cho nó dễ dàng hơn cho những người khác với cùng một vấn đề để tìm câu hỏi/câu trả lời của bạn. –

+0

Tôi đã chỉnh sửa câu hỏi của mình để bao gồm dấu vết ngăn xếp theo yêu cầu của bạn. –

+0

@Dean, những gì bạn đã viết trong 'getWrapper()' và 'setWrapper()' phương pháp – Kainix

Trả lời

15

Tôi đã có một vấn đề tương tự trong Tomcat 7 và đã có thể làm việc xung quanh nó bằng cách chỉnh sửa các yếu tố cấp cao nhất trong ./conf/context.xml để trông giống như

<Context privileged="true"> 

Điều tôi không thể hiểu là cách servlet của người quản lý riêng của Tomcat có thể tải mà không có cấu hình này. Có ai có manh mối nào không?

1

Tôi đã tìm thấy câu trả lời. Tôi cần thiết để thiết lập ưu tiên = true trong bối cảnh của chủ nhà bên server.xml

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