Study
Play Framework

Middleware & Filter (Play Filters)

Penjelasan

Filter di Play adalah komponen yang membungkus setiap request sebelum mencapai Action tujuan, cocok untuk kebutuhan lintas-request seperti logging, pengukuran waktu respons, penambahan header keamanan, atau autentikasi global. Filter dibuat dengan meng-extend `Filter` dan mengimplementasikan method `apply`, yang menerima fungsi `next` (Action berikutnya dalam rantai) dan `RequestHeader`. Semua filter didaftarkan di class `Filters` (biasanya `app/Filters.scala`) yang meng-extend `DefaultHttpFilters`, urutan pendaftaran menentukan urutan eksekusi filter dari luar ke dalam. Play sendiri sudah menyertakan beberapa filter bawaan seperti `CSRFFilter` dan `SecurityHeadersFilter` yang aktif secara default.

Contoh Konsep

import akka.stream.Materializer
import javax.inject._
import play.api.mvc._
import scala.concurrent.{ExecutionContext, Future}

@Singleton
class LoggingFilter @Inject()(implicit val mat: Materializer, ec: ExecutionContext) extends Filter {
  def apply(next: RequestHeader => Future[Result])(request: RequestHeader): Future[Result] = {
    val mulai = System.currentTimeMillis
    next(request).map { hasil =>
      val durasi = System.currentTimeMillis - mulai
      println(s"${request.method} ${request.uri} selesai dalam ${durasi}ms")
      hasil
    }
  }
}

Praktikum

Buat filter HeaderFilter yang menambahkan header response "X-App-Name: TokoOnline" ke setiap request yang lewat.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Hindari operasi berat atau blocking di dalam filter karena berjalan untuk SETIAP request — filter yang lambat memperlambat seluruh aplikasi, bukan cuma satu endpoint tertentu.