2011-11-02 21 views
5

Tôi nhận thấy một số hành vi lạ với redirect khi tôi đặt app.context một cách nhất định. Tôi tìm thấy một lỗi trong Grails JIRA trong đó mô tả vấn đề của tôi hoàn hảo, nhưng nó đã được đánh dấu là UTR: http://jira.grails.org/browse/GRAILS-7546Grails chuyển hướng đến địa chỉ sai khi sử dụng app.context?


Dưới đây là mô tả của tôi về vấn đề:
Tôi hiện đang sử dụng Grails 2.0M2. Tôi đã các thuộc tính sau theo quy định tại application.properties tôi file:

app.context=/ 
app.name=foobar 

Khi tôi gọi redirect trong một bộ điều khiển, redirect sẽ bổ sung tên ứng dụng vào uri tôi cung cấp, sau đó gây ra một 404. Dưới đây là làm thế nào tôi 'm làm điều này:

String partialUrl = createLink(mapping: 'helloworld') // returns `/hello/world` 
redirect(uri: partialUrl) // INCORRECTLY redirects to 
          // `http://mysite.com/foobar/hello/world` 
          // instead of `http://mysite.com/hello/world` 

Giả sử rằng tôi có một ánh xạ URL nào có tên helloworld định nghĩa trong file UrlMappings.groovy của tôi với một con đường /hello/world.

Vì vậy, câu chuyện dài ngắn, nếu tôi đặt app.context để /, tôi sẽ KHÔNG mong đợi app.name để hiển thị trong URL chuyển hướng cuối cùng của tôi.

Đây có phải là lỗi hoặc hành vi dự kiến ​​không? Bất kỳ ý tưởng nào về cách dễ nhất tôi có thể xây dựng URL chuyển hướng mà không thực hiện quá nhiều bước thủ công?

Trả lời

0

Đây không phải là câu trả lời trực tiếp cho câu hỏi của bạn nhưng thực tế của tôi là: Tôi không bao giờ sửa đổi app.context trong thuộc tính grails kể từ khi tomcat ghi đè lên sản xuất và tôi không quan tâm ngữ cảnh nào sử dụng trên dev của tôi.

+1

Phải ... Tomcat có thể ghi đè app.context trong sản xuất, tuy nhiên vấn đề vẫn còn là 'chuyển hướng' mà Grails đang sử dụng app.name khi tạo URL chuyển hướng thay vì sử dụng app.context. – Polaris878

1

Tôi ghét phải nói điều đó, nhưng tôi cũng không thể tái tạo nó. Tôi tạo ra một dự án thử nghiệm với một bộ điều khiển (tên Xin chào), sử dụng mã của bạn để tạo ra một hành động mà không làm gì nhưng chuyển hướng:

HelloController.groovy

package test1 

class HelloController { 
    def index() { 
     def model = [:] 
     model.content = 'content...' 
     model 
    } 

    def redir() { 
     String partialUrl = createLink(mapping: 'helloworld') // returns `/hello/world` 
     redirect(uri: partialUrl) // INCORRECTLY redirects to 
          // `http://mysite.com/foobar/hello/world` 
          // instead of `http://mysite.com/hello/world` 
    } 
} 

Tôi tạo ra một trang index, index.gsp trong quan điểm/hello

index.gsp

<h1>index.gsp</h1> 
<html> 
    <body> 
     <p>This data is coming from the model:</p> 
     <p>content: ${content}</p> 
    </body> 
</html> 

cài đặt helloworld trong UrlMappings để ánh xạ action index của bộ điều khiển hello:

UrlMappings.groovy

class UrlMappings { 
    static mappings = { 
     "/helloworld"(controller: "hello", action: "index") 

     "/$controller/$action?/$id?"{ 
      constraints { 
       // apply constraints here 
      } 
     } 

     "/"(view:"/index") 
     "500"(view:'/error') 
    } 
} 

Và thay đổi application.properties để có app.context =/

application.properties

#Grails Metadata file 
#Sun Nov 06 14:51:56 EST 2011 
app.grails.version=2.0.0.RC1 
app.context=/ 
app.name=test1 
app.servlet.version=2.5 
app.version=0.1 

Khi tôi chạy ứng dụng, tôi có thể đi đến localhost: 8080/hello và nó sẽ hiển thị GSP đơn giản của tôi. Tôi đã thử localhost: 8080/helloworld và cũng nhận được như mong đợi cho mỗi bản đồ. Sau đó, tôi đã thử localhost: 8080/hello/redirect và tôi đã được chuyển hướng đến localhost: 8080/helloworld.

Tuy nhiên, nếu bạn vẫn gặp phải sự cố này, tôi có một vài đề xuất 1) Thử sử dụng trình tạo liên kết mới có sẵn trong 2.0 thay vì createLink. Nó có thể không làm bất cứ điều gì khác nhau, nhưng đáng thử: grailsLinkGenerator.link(mapping: 'helloworld') 2) Nếu nó chỉ trên chuyển hướng từ bên trong bộ điều khiển, bạn chỉ có thể thêm phần http://mysite.com mình vào partialUrl. 3) Cuối cùng, viết một bộ lọc gắn liền với afterView mà thực hiện tìm kiếm regex và thay thế trên nội dung cho mysite.com/foobar. Không chắc chắn điều này sẽ bắt chuyển hướng mặc dù, nhưng nếu bất cứ điều gì sẽ, tôi muốn giả định này sẽ là nó vì các bộ lọc có thể được áp dụng ở cấp độ rộng.

1
def yourAction = { 

     redirect(uri:"helloworld") 

    } 

Điều đó không phù hợp với bạn?

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