Writing custom filters for Play! 2.2 in Java

后端 未结 3 825
别那么骄傲
别那么骄傲 2020-12-09 05:06

I have a simple scenario: automatically add a response header to every HTTP response; and I want to do this in Java.

Looking at src/play-filters-helpers/src/ma

3条回答
  •  暖寄归人
    2020-12-09 05:48

    There isn't a nice Java API available for creating Play Filters. However, you can adapt the existing Scala APIs into a nice Java template.

    For example:

    import play.api.mvc.*;
    import scala.Function1;
    import scala.concurrent.Future;
    import scala.runtime.AbstractFunction1;
    
    public abstract class JavaFilter implements Filter {
    
    @Override
    public Future apply(Function1> nextFilter, RequestHeader requestHeader) {
        return nextFilter
                .apply(requestHeader)
                .map(new AbstractFunction1() {
                         @Override
                         public Result apply(Result currentResult) {
                             return Apply(currentResult, requestHeader);
                         }
                     },
                        play.api.libs.concurrent.Execution.defaultContext());
    }
    
    @Override
    public EssentialAction apply(EssentialAction next) {
        return Filter$class.apply(this, next);
    }
    
    public abstract Result Apply(Result currentResult, RequestHeader requestHeader);
    }
    

    Example implementation:

    import play.api.mvc.RequestHeader;
    import play.api.mvc.Result;
    
    public class HelloFilter extends JavaFilter {
    
    @Override
    public Result Apply(Result currentResult, RequestHeader requestHeader) {
        if (requestHeader.headers().get("X-Filter").isDefined()) {
            ResultAdapter resultAdapter = new ResultAdapter(currentResult);
            return resultAdapter.WithHeader("X-Hello", "World!");
        }
        return currentResult;
      }
    }
    

    For a further explanation of how this works, see my blog post about it here

提交回复
热议问题