2011-10-30 28 views
5

Có cách nào cho mỗi ứng dụng web/ngữ cảnh để chỉ định tệp ghi đè chỉ dành cho ứng dụng web cụ thể đó không? Cách duy nhất tôi thấy điều này hiện đang làm việc là thông qua dòng lệnh khi bạn khởi động nó. Tôi đã suy nghĩ có lẽ một thiết lập trong tập tin override.xml hoặc thậm chí trong tập tin xml bối cảnh.Bạn có thể chỉ định cho mỗi tệp jetty-rewrite.xml của ứng dụng web trong Jetty không?

+0

Có thể có điều gì đó liên quan đến việc này tại https://github.com/eclipse/jetty.project/blob/master/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/ RewriteHandler.java nhưng nó không rõ ràng. –

Trả lời

1

Nếu bạn sử dụng context.xml deployables, bạn có thể tích hợp các quy tắc RewriteHandler vào ngữ cảnh cụ thể của ứng dụng xml.

Ví dụ: đây là tệp ngữ cảnh thay thế của số ${jetty.home}/contexts/test.xml được tìm thấy trong phân phối cầu nối. Nó thêm một quy tắc chỉ đơn giản là thêm một cookie (truy cập = có) vào phản hồi cho tất cả các yêu cầu.

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"> 

<Configure class="org.eclipse.jetty.server.handler.ContextHandler"> 
    <Set name="contextPath">/</Set> 
    <Set name="handler"> 
    <New id="Rewrite" class="org.eclipse.jetty.rewrite.handler.RewriteHandler"> 
     <Set name="handler"> 
     <New class="org.eclipse.jetty.webapp.WebAppContext"> 
      <Set name="contextPath">/</Set> 
      <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/test.war</Set> 
      <Set name="extractWAR">true</Set> 
      <Set name="copyWebDir">false</Set> 
      <Set name="defaultsDescriptor"><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Set> 
      <Set name="overrideDescriptor"><SystemProperty name="jetty.home" default="."/>/contexts/test.d/override-web.xml</Set> 
     </New> 
     </Set> 
     <Set name="rewriteRequestURI">true</Set> 
     <Set name="rewritePathInfo">false</Set> 
     <Set name="originalPathAttribute">requestedPath</Set> 

     <!-- add a cookie to each path visited --> 
     <Call name="addRule"> 
     <Arg> 
      <New class="org.eclipse.jetty.rewrite.handler.CookiePatternRule"> 
      <Set name="pattern">/*</Set> 
      <Set name="name">visited</Set> 
      <Set name="value">yes</Set> 
      </New> 
     </Arg> 
     </Call> 
    </New> 
    </Set> 
</Configure> 

Để xác minh rằng quy tắc này hoạt động, bắt đầu cầu cảng, goto http://localhost:8080/ và sau đó sử dụng các "phiên" thành phần kiểm tra, bạn sẽ thấy rằng visited=true sẽ được hiển thị như một cookie ở đầu trang.

+0

_ "Nếu bạn sử dụng context.xml deployables" _ - Tôi không biết điều đó có nghĩa là gì, nhưng tôi có từng ngữ cảnh riêng lẻ được định nghĩa trong '{jetty}/contexts/{name} .xml' - Tôi không có kiểm tra .xml hoặc bất kỳ thành phần thử nghiệm nào. –

+0

Tôi đã cố gắng áp dụng ví dụ này cho một cấu hình ngữ cảnh hiện có (bằng cách chuyển lệnh Set từ Cấu hình WebAppContext sang thẻ Mới tương ứng trong ví dụ của bạn), nhưng kết quả là một StackOverflowError tại 'org.eclipse.jetty.server.Dispatcher $ ForwardAttributes.setAttribute (Dispatcher.java:410) '([full trace] (http://pastebin.com/vZEvmDRj)) khi cố gắng truy cập'/'- có vẻ như nó hoạt động (bao gồm header set-cookie với response) khi truy cập một tệp cụ thể. –

+0

Tôi không biết đây có phải là lỗi Jetty hay do một số cấu hình sai hoặc một số thứ khác không? Một lời giải thích về cách thức xử lý các công cụ gói này có lẽ sẽ hữu ích. (Cố gắng gỡ lỗi vấn đề, tôi đã lấy bối cảnh cấp cao nhất ra - nó dường như không thay đổi bất cứ điều gì, vì vậy tôi tự hỏi nếu nó cần thiết?) –

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