gpt4 book ai didi

embedded-jetty - 如何从嵌入的 Jetty URL 中删除尾部斜杠?

转载 作者:行者123 更新时间:2023-12-04 06:37:20 24 4
gpt4 key购买 nike

我使用来自 Scala 的嵌入式 Jetty 9.3.8.v20160314(Scala 是偶然的,这是一个纯粹的 Jetty 问题),配置如下:

val loginService = new RepoLoginService(usersRepository, signInsRepo)

val server = new Server(8080)
server.addBean(loginService)

val security = new ConstraintSecurityHandler()
server.setHandler(security)

val constraint = new Constraint()
constraint.setName("auth")
constraint.setAuthenticate(true)
constraint.setRoles(Array[String]("user", "admin"))

val mapping = new ConstraintMapping()
mapping.setPathSpec("/*")
mapping.setConstraint(constraint)

security.setConstraintMappings(Collections.singletonList(mapping))
security.setAuthenticator(new BasicAuthenticator())
security.setLoginService(loginService)

val mapper = prepareJacksonObjectMapper

val listAccountsController = new ContextHandler("/api/accounts")
listAccountsController.setHandler(new ListAccountsController(mapper, accountsRepository))

val importBankAccountsController = new ContextHandler("/api/bank-account-transactions/import")
importBankAccountsController.setHandler(new ImportBankAccountTransactionsController(mapper, bankAccountTransactionsRepo))

val contexts = new ContextHandlerCollection()
contexts.setHandlers(Array(listAccountsController, importBankAccountsController))

security.setHandler(contexts)

server.start()
server.join()

注意 listAccountsController 的上下文: /api/accounts .当我 curl 时 /api/accounts , 我收到重定向到 /api/accounts/ (注意尾部斜杠):
$ curl --silent --verbose --user francois:francois http://localhost:8080/api/accounts
* Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
* Server auth using Basic with user 'francois'
> GET /api/accounts HTTP/1.1
> Host: localhost:8080
> Authorization: Basic ZnJhbmNvaXM6ZnJhbmNvaXM=
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 302 Found
< Date: Sun, 22 May 2016 03:54:44 GMT
< Location: http://localhost:8080/api/accounts/
< Content-Length: 0
< Server: Jetty(9.3.8.v20160314)
<
* Connection #0 to host localhost left intact

我尝试向 clearAliasChecks() 添加电话,我不确定这是否与此有关。我也试过改变 mapping.setPathSpec("/*")mapping.setPathSpec("/") ,因为我读了 answer on Tomcat not adding the trailing slash ,但这可能无论如何都不适用于我。

我必须更改什么才能防止尾随斜杠?

最佳答案

您定义上下文的方式就是这样做的原因。

一个 ContextHandler是一组资源的“根”,并且该根被定义为始终是资源目录(在结构中)。

由于您定义了 ContextHandler("/api/accounts")并访问 /api/accounts该实现通过制作 /api/accounts/ 来“帮助”您正确的上下文根。

想象一下这...

  • 您有 val b = ContextHandler("/a/b")
  • 您有 val a = ContextHandler("/a") - 实现(内部)对子资源的支持 /b
  • 如果您要求 /a/b ,你在哪个上下文? - 根据规范,您在上下文中 a
  • 如果您要求 /a/b/ ,那么你在上下文 b
  • 关于embedded-jetty - 如何从嵌入的 Jetty URL 中删除尾部斜杠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37370407/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com