我从我的前端拨打到userPrivateProfile控制器。路由是 / api / user / private /:id 所以我要说我在 /打电话API /用户/私有/ 65 。在我执行控制器之前,SecurityAuthAction会拦截请求,我确保请求标头包含令牌,如果是这样,我想将:id 更改为不同的。 / p>
Controller.java
@With(SecurityAuthAction.class)
public Result userPrivateProfile(Long id) {
//LOGIC
}
SecurityAuthAction.java
public Promise<SimpleResult> call(Http.Context ctx) throws Throwable {
String[] authTokenHeaderValues = ctx.request().headers()
.get(AUTH_TOKEN_HEADER);
if ((authTokenHeaderValues != null) && (authTokenHeaderValues.length == 1) && (authTokenHeaderValues[0] != null)) {
Long userId = sessionService
.findUserByToken(authTokenHeaderValues[0]);
ctx.args.put("id",userId.toString());
return delegate.call(ctx);
}
我的问题是
我无法使用ctx检索原始调用中指定的:id
由于我无法找到请求参数的位置,因此无法更改
我尝试迭代ctx.args地图,但我在那里找不到东西。输出是:
ROUTE_VERB ROUTE_
ACTION_METHOD
ROUTE_CONTROLLER
ROUTE_COMMENTS
ROUTE_PATTERN
获取
userPrivateProfile
controllers.Controller
/ API /用户/私有/ $ ID的百分比抑制率^ /] + GT;
Thanx求助:)
答案 0 :(得分:1)
不幸的是,Play Framework(当然在版本2.1中)在执行操作组合时不能让您轻松访问URL查询参数。您可能会对This discussion on the Play Google group感兴趣。提到的一种解决方法是解析SecurityAuthAction
中的URL以获取id
查询参数的值。但是这有点混乱,并且无法帮助您处理问题的下一部分,即在进入下游操作之前更改id。
在服务器处理请求时更改请求的详细信息对我来说似乎并不常见。通常,如果您想要更改客户端请求的内容,您可以发出HTTP 303响应,将它们重定向到您希望它们转到的URL。但这并不像是重定向的情况。我认为你应该做的就是把你的sessionService
号召唤到你的主控制器类:
public Promise<SimpleResult> call(Http.Context ctx) throws Throwable {
if (authorisation token header is present in request) {
return delegate.call(ctx);
}
return unauthorised();
}
@With(SecurityAuthAction.class)
public Result userPrivateProfile(Long id) {
// We've already established that an auth token header is present in the request
final String authToken = ctx.request().headers().get(AUTH_TOKEN_HEADER)[0];
final Long userId = sessionService.findUserByToken(authToken);
// TODO: Proceed...
}
如果你的应用程序需要userId
,那么它可能是包含在你的应用程序cookie中的候选者。