[英]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.