2014-10-05 1 views
1

Я использую Jetty-9 во встроенном режиме и нуждаюсь только в одном веб-приложении. Поэтому я хотел бы корневой URL, чтобы перейти на домашнюю страницу этого приложения, то есть что-то вродеПеренаправление пути корневого контекста или привязка его к сервлету или его сопоставление с приветственным файлом

http://localhost:4444/ 

должен закончиться в сервлет. Я начинаю с:

ServletContextHandler scContext = 
     new ServletContextHandler(ServletContextHandler.SESSIONS); 
scContext.setContextPath("/"); 

Ни одно из следующих работал, ни

scContext.addServlet(ListsServlet.class, "/"); 

ни

scContext.setWelcomeFiles(new String[]{"/lists}) 

где /lists сопоставлен с ListsServlet сервлета. Все, что я получаю, - это 403 (Запрещено).

Я не использую DefaultServlet, который, кажется, обрабатывает файлы приветствия. Но так как ServletContextHandler имеет setWelcomeFiles, я ожидал, что он будет содержать логику их использования.

Любые идеи?

ответ

1

Для ошибки 403 Forbidden у вас есть некоторая настройка безопасности, которая не позволяет вам получить доступ к обработчикам/сервлетам.

Устраните эту безопасность (пока), убедитесь, что все остальное работает, а затем добавьте защиту чуть позже, чтобы заблокировать специфику.

Если вы хотите увидеть некоторые из приведенных ниже рекомендаций, рассмотрите пример кода в ответе из другого stackoverflow: How to correctly support html5 <video> sources with jetty.

Файлы приветствия добавляются к пути входящего запроса, если в этом месте ничего нет. Например, запрос на каталог, а затем приветственный файл «index.html» добавляется к пути запроса.

В то время как это будет работать ...

scContext.setWelcomeFiles(new String[]{"lists"}) 

// Add Default Servlet (must be named "default") 
ServletHolder holderDefault = new ServletHolder("default",DefaultServlet.class); 
holderDefault.setInitParameter("resourceBase",baseDir.getAbsolutePath()); 
holderDefault.setInitParameter("dirAllowed","true"); 
holderDefault.setInitParameter("welcomeServlets","true"); 
holderDefault.setInitParameter("redirectWelcome","true"); 

scContext.addServlet(holderDefault,"/"); 

Это, скорее всего, не то, что вы стремитесь, как вы сказали, только корневой путь. выше будет также вносить изменения в запросы как /foo/ к /foo/lists

Вместо этого, он может иметь больше смысла использовать правило Rewrite + обработчик вместо подхода приветственных-файлы.

RewriteHandler rewrite = new RewriteHandler(); 
rewrite.setHandler(scContext); 

RewritePatternRule rootRule = new RewritePatternRule(); 
rootRule.setPattern("/"); 
rootRule.setReplacement("/list"); 
rootRule.setTerminating(true); 
rewrite.addRule(rootRule); 

server.setHandler(rewrite); 

Это RewritePatternRule просто изменяет любой путь запроса / к /list и затем передает эту просьбу к обернутой ssContext (если вы хотите, чтобы увидеть /list в браузере, изменить его на RedirectPatternRule вместо.

+0

Прохладной, это должно работать, за исключением того, что я не могу в настоящее время проверить его, потому что, что бы я ни делал, я получаю «Проблема с доступом /. Причина: Запрещено». Необходимо исследовать, как обойти это. – Harald

+0

Вау, это занимало много времени. У меня был «ResourceHandler» 'перед« HandlerList », и он увлекается« Запрещенным », когда видит«/». Обертка' Rewr iteHandler' тоже вокруг, но я не мог использовать «RedirectRule» для ''/'' to '"/lists "', потому что это создает цикл переадресации. Что работает - 'RegexRedirectRule' для'^/? $ '.В любом случае, вы дали правильный намек. – Harald

+0

@Harald Я обнаружил, что 'RedirectPatternRule.setPattern (" ")', в отличие от '("/")', предотвращает цикл. –

 Смежные вопросы

  • Нет связанных вопросов^_^