2016-05-22 68 views
2

我使用嵌入式码头9.3.8.v20160314从斯卡拉(Scala是附带在这里,这是一个纯粹的码头问题),配置是这样的:如何从嵌入式Jetty URL中删除尾部斜杠?

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。当我蜷缩/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,但这可能不适用于我。

我必须改变以防止结尾的斜杠?

回答

3

您定义您的上下文的方式是原因。

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

由于您定义了ContextHandler("/api/accounts")并且访问了/api/accounts,因此通过使/api/accounts/为正确的上下文根实现“帮助”您。

想象一下...

  • 你有val b = ContextHandler("https://stackoverflow.com/a/b")
  • val a = ContextHandler("/a") - 为子资源/b
  • 如果您要求/a/b它实现(内部)的支持,这方面是你的? - 按规格,你是在上下文中a
  • 如果要求/a/b/,那么你就是在上下文中b
+0

那并没有回答OP的问题。他想知道如何解决这个问题。和我一样,由于各种原因。 – kevr

+0

@kevr答案是不依赖上下文根来完成这个目标。保持你的上下文根在“/”,你的实现可以做你想做的任何事情。 –