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.
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.