2016-05-22 9 views
2

Я использую встроенный Jetty 9.3.8.v20160314 от Scala (Scala является второстепенным здесь, это чисто Jetty вопрос), сконфигурированный так:Как удалить конечную косую черту из встроенных URL-адресов 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. Когда я свернуться /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, какой контекст вы находитесь? - Per спецификации, вы в контексте a
  • Если вы запрашиваете /a/b/, то вы находитесь в контексте b
+0

Это не ответ на вопрос OPS. Он хотел знать, как обойти это. Как и я, по разным причинам. – kevr

+0

@kevr ответ заключается не в том, чтобы полагаться на контекстный корень, чтобы достичь этой цели. сохраните свой корневой контекст в «/», и ваши реализации могут делать все, что вы хотите от них. –