2011-01-07 56 views
10

使用@before時,僅在一個類中使用。如何在遊戲框架中應用全局過濾器?因此,所有控制器類都使用一個過濾器。如何在遊戲框架中應用全局過濾器

+0

這關係到我的問題http://stackoverflow.com/questions/4597766/easy-way-to-use-secure-模塊或類似於所有控制器的遊戲。我試圖使用字節碼增強器爲所有控制器添加一個「@ With」註釋,但是這引起了我的這個問題:http://stackoverflow.com/questions/4608883/problem-with-classes-not-found-during -playplugin-enhance – 2011-01-08 19:27:35

+0

http://www.playframework.com/documentation/2.1.0/ScalaInterceptors – ThePizzle 2013-03-06 18:06:30

回答

6

一個簡單的解決方案是擴展所有控制器的基礎控制器,並在基礎控制器中擁有@Before。

其他選項(以及更好的解決方案,因爲它更靈活)是使用@With註釋。播放文檔中的示例是

實施例:

public class Secure extends Controller { 

    @Before 
    static void checkAuthenticated() { 
     if(!session.containsKey("user")) { 
      unAuthorized(); 
     } 
    } 
}  

並在另一個控制器:

@With(Secure.class) 
public class Admin extends Application { 

    ... 

} 

這意味着管理控制器將處理所有的攔截(@Before,@After,@最後)包含在安全控制器中。

+2

不幸的是,這仍然要求您將`@ With`註釋添加到所有控制器。特別是在安全插件的情況下,最好能夠使所有控制器默認安全,然後將那些應該可公開訪問的白名單列入白名單。但我還沒有想出如何做到這一點。 – 2011-01-08 19:31:37

+0

表示同意,我不喜歡這裏的解決方案,因爲每個開發人員都必須記住,並且人類行爲表示它會在某個時候被遺忘。 – 2012-02-17 03:05:18

1

您可以簡單地在這個問題上使用PlayPlugin。有關更多詳細信息,請參見here

2

我做了這事通過在GlobalSettings全局類處理傳入的請求:

此描述類: http://www.playframework.org/documentation/2.0/JavaGlobal

這說明你想要覆蓋的方法。 http://www.playframework.org/documentation/2.0/JavaInterceptors

這裏是我如何使用它在我自己的項目的例子(當然,這是你在找什麼的簡化版本):

@Override 
public play.mvc.Action onRequest(play.mvc.Http.Request request, java.lang.reflect.Method method) { 
    if (request.path().startsWith("/secret/locked")) { 
     return new Action.Simple() { 
      @Override 
      public Result call(play.mvc.Http.Context ctx) throws Throwable { 
       return redirect(routes.Application.forbidden()); 
      } 
     }; 
    } 

    return super.onRequest(request, method); 
} 
0

這不是一個很好的解決方案來擴展一個用於所有控制器的基礎控制器,並在基礎控制器中擁有@Before。

您可以擴展過濾器或essensialfilter .e.g。

級過濾器1擴展器{}

和應用過濾器1至全球