You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Play框架中如何为指定的SIRD路由禁用CSRF校验?

解决方案

+nocsrf 是Play内置路由文件的静态编译标记,仅对conf/routes里直接定义的静态路由生效,通过->挂载的SIRD动态路由无法识别该标记,可根据场景选择以下两种实现方案:

方案1:整个SIRD路由前缀统一跳过CSRF校验

如果挂载的SIRD路由下所有接口都不需要CSRF校验(比如纯对外API服务),可以直接修改全局过滤器的CSRF触发逻辑,匹配对应路径前缀直接跳过:

import play.api.mvc._
import play.api.filters._
import play.filters.csrf.CSRFFilter
import javax.inject._

@Singleton
class Filters @Inject()(csrfFilter: CSRFFilter) extends DefaultHttpFilters {
  override def filters: Seq[EssentialFilter] = Seq(
    csrfFilter.withApplyOnRequest { req =>
      // 路径以/api开头的请求全部跳过CSRF校验
      !req.path.startsWith("/api")
    }
  )
}

方案2:SIRD路由内指定单个接口跳过

如果仅需要给部分接口跳过校验,可以在SIRD路由匹配时,用Play提供的CSRF.Ignore动作组合器包裹对应Action即可:

  1. 首先在ApiRouter中导入CSRF工具类:
import play.filters.csrf.CSRF
  1. 路由匹配时给需要跳过的接口加包裹逻辑:
override def routes: Routes = {
  // 该接口跳过CSRF校验
  case POST(p"/new") => CSRF.Ignore(controller.newThing)
  // 其他接口仍走正常CSRF校验
  case GET(p"/") => controller.index
}

也可以直接在Controller的Action定义处包裹,效果完全一致。


内容的提问来源于stack exchange,提问作者Suga Raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:18:01