簡體   English   中英

如何在攔截器中獲取路徑變量

[英]How to get path variable in an intercepter

我正在使用 play 框架 2.0,它有一個非常簡單的流程......路線 -> 控制器 -> 服務 -> 模型 -> 控制器 -> 結果。

好吧,接下來我有一個控制器,它從路由接收路徑變量。

GET /user/:userId controller.user.getUser(userId : String)

正如你所看到的,這實際上是一個用戶 ID,我想驗證這個用戶 ID(檢查它是否存在於我們的數據庫中)但不是在控制器中而是使用一些注釋,像這樣..

//My annotation for validating userId
@ValidateUserId(userId)
public static Result getUser(userId)

這個概念的主要問題是注解的參數必須是一個常量,@see topic about this所以你將不能像代碼中顯示的那樣使用userId 相反,您可以創建一個注釋來讀取上下文本身,然后解析 URI 以獲取用戶的 ID。 IE:

應用程序/myannotations/MyAnnotations.class

package myannotations;

import play.mvc.With;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


public class MyAnnotations {

    @With(ValidateUserIdAction.class)
    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ValidateUserId {
        String patternToReplace();
        String redirectTo();
    }

}

應用程序/myannotations/ValidateUserIdAction.class

package myannotations;

import play.mvc.Action;
import play.mvc.Http;
import play.mvc.Result;

import static play.libs.F.Promise;

public class ValidateUserIdAction extends Action<MyAnnotations.ValidateUserId> {

    public Promise<Result> call(Http.Context ctx) throws Throwable {
        boolean isValid = false;

        // This gets the GET path from request
        String path = ctx.request().path();
        try {
            // Here we try to 'extract' id value by simple String replacement (basing on the annotation's param)
            Long userId = Long.valueOf(path.replace(configuration.patternToReplace(), ""));

            // Here you can put your additional checks - i.e. to verify if user can be found in DB
            if (userId > 0) isValid = true;

        } catch (Exception e) {
            // Handle the exceptions as you want i.e. log it to the logfile
        }

        // Here, if ID isValid we continue the request, or redirect to other URL otherwise (also based on annotation's param)
        return isValid
                ? delegate.call(ctx)
                : Promise.<Result>pure(redirect(configuration.redirectTo()));
    }    
}

因此您可以將它用於您的操作,例如:

@MyAnnotations.ValidateUserId(
   patternToReplace = "/user/", 
   redirectTo = "/redirect/to/url/if/invalid"
)
public static Result getUser(userId){
     ....
}

當然,這是非常基本的示例,您可能希望/需要使您的 validationAction 類中的條件更加復雜或添加更多參數以使其更加通用,一切都取決於您。

request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);

HttpServletRequest : 請求

完整代碼在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM