2016-05-22 15 views
2

Ich benutze Jetty eingebettet 9.3.8.v20160314 von Scala (Scala ist hier nebensächlich, das ist eine reine Jetty Frage ist), wie diese konfiguriert:So entfernen Sie den abschließenden Schrägstrich von eingebetteten Jetty-URLs?

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() 

Hinweis den Kontext für die listAccountsController: /api/accounts. Wenn ich /api/accounts kräuseln, erhalte ich eine Umleitung zu /api/accounts/ (beachten Sie den Schrägstrich):

$ 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 

Ich habe versucht, einen Anruf zu clearAliasChecks() hinzufügen, was ich bin nicht sicher, auch im Zusammenhang mit dieser ist. Ich habe auch versucht, mapping.setPathSpec("/*") zu mapping.setPathSpec("/") zu ändern, weil ich eine answer on Tomcat not adding the trailing slash gelesen habe, aber das gilt wahrscheinlich nicht für mich sowieso.

Was muss ich ändern, um den Schrägstrich zu vermeiden?

Antwort

3

Die Art und Weise, wie Sie Ihre Kontexte definiert haben, ist der Grund dafür.

Ein ContextHandler ist ein "root" für eine Reihe von Ressourcen, und dieser Stamm ist definiert als immer ein Ressourcenverzeichnis (in Struktur).

Da Sie ContextHandler("/api/accounts") definiert und auf /api/accounts zugegriffen haben, "hilft" die Implementierung, indem Sie /api/accounts/ das richtige Kontextstammverzeichnis erstellen.

Stellen Sie sich vor ...

  • Sie haben val b = ContextHandler("https://stackoverflow.com/a/b")
  • Sie haben val a = ContextHandler("/a") - die Geräte (intern) Unterstützung für Unterressource /b
  • Wenn Sie anfordern /a/b, welchem ​​Kontext sind Sie? - Per spec, sind Sie in Zusammenhang a
  • Wenn Sie /a/b/ anfordern, dann sind Sie in Zusammenhang b
+0

Das ist nicht OPs Frage nicht beantworten. Er wollte wissen, wie man das schafft. Ich auch, aus verschiedenen Gründen. – kevr

+0

@kevr Die Antwort ist, sich nicht auf den Kontextstamm zu verlassen, um dieses Ziel zu erreichen. Behalte den Kontextstamm bei "/" und deine Implementierungen können tun, was immer sie wollen. –

Verwandte Themen