2011-03-06 73 views
2

任何人都可以建議一種可行的解決方案,以防止直接訪問Grails上的* .gsp頁面?如何防止直接訪問Grails中的* .gsp頁面

審查攔截「/**.gsp」後,我發現這是不可能使用,因爲它不僅過濾掉的直接訪問,同時也是頁面從控制器渲染等

我試圖設置在UrlMapping.groovy中,儘管我可以阻止* .gsp直接訪問,但我也弄亂了頁面的導航;所有的鏈接似乎都會回到主頁。

"/**.gsp" { 
isEligible = { 
    System.err.println("ALL PARAMS: " + params) 
    request.requestURL.toString().endsWith(".gsp") 
} 
controller = { 
    if (request.requestURL.toString().endsWith(".gsp")) { 
     "public" 
    } else { 
     "*" 
    } 
} 
action = { 
    if (request.requestURL.toString().endsWith(".gsp")) { 
     "home" 
    } else { 
     "*" 
    } 
} 
} 

一旦我想過像org.springframework.web.filter.OncePerRequestFilter設置過濾器,但不太清楚怎麼可能將其定義爲Grails的傾向於通過自身產生的web.xml中過濾器部分。

有什麼想法?

非常感謝! tom

+1

只是想到這一點,你有沒有測試過,以確認你有測試和生產環境中的直接訪問?我有一種感覺,當你的環境設置爲Development時,Grails可能只允許直接訪問。 – Melv 2011-03-06 23:35:18

+0

非常有趣的問題。我從來沒有注意到它,但即使在生產中它也發生在我身上。雖然頁面會非常像返回錯誤,因爲它沒有來自控制器的信息。 – 2011-03-07 07:08:44

+0

我剛剛在生產模式下運行完畢,存在同樣的問題;無論如何,謝謝你的提示!我只是想知道如何在示例代碼中設置一些代理以防止這些非直接訪問的匹配;你看,我試過'合格',但它不起作用。 – 2011-03-07 10:45:25

回答

0

根據grails FAQ UrlMapping.groovy中的「/**.gsp」配置應該工作。

還無法嘗試。

你是如何將鏈接添加到頁面的? 當您使用鏈接標籤時鏈接是否也被破壞?

<g:link controller="book" action="list">Book List</g:link> 
+0

對不起,我不確定我是否理解你的問題...如果直接設置'/**.gsp'來過濾和路由到'索引'視圖,甚至不能打開頁面作爲指向'索引的死循環'的觀點。 – 2011-03-07 12:23:31

+0

實際上,我認爲這個問題是關於如何通過鏈接停止直接訪問像'http:// MyApp/book/list.gsp' – 2011-03-07 15:05:26

+0

也許我的問題是不夠清楚:P但我現在嘗試「/ **。 gsp「在UrlMapping.groovy中,這不能正常工作。仍然在尋找一個解決方案.... – superbly 2011-03-07 15:45:50

1

不幸的是我沒有找到UrlMappings的解決方案。 這是一個有點難看的解決方案,但是如果在所有頁面上使用相同的佈局(例如main.gsp),則可以將這些行添加到佈局(main.gsp)。

<% if (request.requestURL.toString().endsWith(".gsp")) { 
     response.sendRedirect("${request.contextPath}/") 
    } %> 

如果用戶試圖直接訪問gsp頁面,他將被重定向到主頁。

可能不是最好的解決方案,但到目前爲止我確實爲我工作。

cheers shifty

+0

工作!感謝您的幫助:)但是,如果頁面沒有引用模板main.gsp,它們仍然有同樣的問題。也許我應該花一點時間閱讀Grails中的URL映射機制。不管怎麼說,還是要謝謝你! – 2011-03-08 05:46:52

+0

我剛剛用app-engine插件測試了這個,它給了我一個重定向循環異常。 :( – superbly 2011-03-08 09:05:14

0

如何編寫將在每個請求上執行的過濾器?

+0

我會嘗試這也作爲模板上的技巧不能完全解決問題; – 2011-03-10 04:16:43

+0

我找不到使用過濾器的解決方案:while definter filter as excludeDirectAccess(uri:'/ **'){.. request.requestURL.toString()。endsWith(「。gsp」)...}我發現表達式不可能是真的; request.requestURL只是一個奇怪的url,它不是地址欄上的輸入。這太惱人了...... :( – 2011-03-10 08:12:33

+0

我稍後再嘗試,我會讓你知道結果 – 2011-03-10 13:38:39

1

這些添加到UrlMappings:

"/**.gsp" { 
    controller = { 
     if(request.requestURL.toString().endsWith(".gsp")) { 
      "forbidden" 
     } else params.controller 
    } 
} 

,並創建一個ForbiddenController並與index.gsp中「千萬不要以爲直接訪問GSP的紈絝子弟。」作爲其內容。

乾杯。