Play 2.6 拦截Http请求

拦截Http请求

英文原文
https://playframework.com/documentation/2.6.x/JavaActionCreator

Play提供的Java API提供了两种方式拦截action请求。第一种为ActionCreator,这种方法提供了一个creationAction方法用来创建action组合中使用的初始action。

第二种为实现HttpRequestHandler,这是Play中所有http请求的首要入口。

ActionCreator

ActionCreator有两个方法可以实现:
- createAction: 根据传递的request请求,可以获取request对象及controller方法。该action可以配置为第一个执行或最后一个执行,配置项为play.http.actionComposition.executeActionCreatorActionFirst
- wrapAction,已废弃

注意:如果是需要在action方法执行前进行切片,使用filter是更符合习惯的做法

常见的creator是在根包下创建一个名为ActionCreator的类,该类实现play.http.ActionCreator

import play.mvc.Action;
import play.mvc.Http;
import play.mvc.Result;
import java.util.concurrent.CompletionStage;

import java.lang.reflect.Method;

public class ActionCreator implements play.http.ActionCreator {
    @Override
    public Action createAction(Http.Request request, Method actionMethod) {
        return new Action.Simple() {
            @Override
            public CompletionStage<Result> call(Http.Context ctx) {
                return delegate.call(ctx);
            }
        };
    }
}

如果不想放在root package下,也可在application.conf中进行配置

play.http.actionCreator = "com.example.MyActionCreator"
注意:如果使用了action composition,那么createAction方法所返回的action默认将在所组合的action之后执行,可以通过设置application.conf中的play.http.actionComposition.executeActionCreatorActionFirst = true 来改变顺序

HttpRequestHandler

有时候Play所提供的抽象无法满足更高级的需求,在这种情况下可以实现Play更为低层的API来满足需求。

HttpRequestHandler是最后的手段,大多数需求都可以通过路由和filter实现。

实现自定义的HttpRequestHandler

HttpRequestHandler有一个handlerForRequest方法需要实现,该方法接收一个需要被处理的request请求,返回一个HadlerForRequest对象,该对象包含了RequestHeader和一个Handler

将请求头返回的原因是一些信息,例如路由信息,可以被添加到header中。在这种情况下,router可以对请求进行标记(哪个路由与该请求匹配),这对于监控或者注入切片会非常有用。

import javax.inject.Inject;

import play.core.j.JavaContextComponents;
import play.routing.Router;
import play.api.mvc.Handler;
import play.http.*;
import play.mvc.*;
import play.libs.streams.Accumulator;
import play.core.j.JavaHandler;
import play.core.j.JavaHandlerComponents;

public class SimpleHttpRequestHandler implements HttpRequestHandler {
    private final Router router;
    private final JavaHandlerComponents handlerComponents;

    @Inject
    public SimpleHttpRequestHandler(Router router, JavaHandlerComponents components) {
        this.router = router;
        this.handlerComponents = components;
    }

    public HandlerForRequest handlerForRequest(Http.RequestHeader request) {
        Handler handler = router.route(request).orElseGet(() ->
            EssentialAction.of(req -> Accumulator.done(Results.notFound()))
        );
        if (handler instanceof JavaHandler) {
            handler = ((JavaHandler)handler).withComponents(handlerComponents);
        }
        return new HandlerForRequest(request, handler);
    }
}

对于Java handler,需要注入JavaHandlerComponents,并调用handler.withComponents。这样才能保证Java action正常工作。This will also be handled for you automatically if you extend DefaultHttpRequestHandler and call super.handlerForRequest().

配置handler

如果使用BuiltInComponents来创建应用,复写httpRequestHandler方法来返回自己的handler实例。

如果使用runtime DI,request handler在运行时会动态载入。最简单的方式是在root package下创建一个名为RequestHandler的类。或者在play.http.requestHandler中指明路径

play.http.requestHandler = "com.example.RequestHandler"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值