Перенаправление на страницу Angular2 из сервлета приводит к 404

У меня есть старое приложение на Java 1.6, Servlet 2.5, развернутое как WAR на сервере приложений Websphere 7.x. Теперь я пытаюсь добавить недавно написанную страницу с фреймворком Angular2 и машинописным текстом.

Мой web.xml имеет следующее сопоставление сервлета.

<servlet>
        <servlet-name>MyControllerServlet</servlet-name>
        <servlet-class>com.company.path.MyControllerServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>MyControllerServlet</servlet-name>
    <url-pattern>/MyControllerServlet</url-pattern>
</servlet-mapping>

В нашем существующем приложении мы передаем запросы GET с параметром запроса нашему сервлету для перенаправления адреса.

http://localhost:9081/rootContext/MyControllerServlet?brand=brand1 http://localhost:9081/rootContext/MyControllerServlet?brand=brand2 и так далее. К этому мы должны добавить только что созданную страницу Angular2, когда бренд равен brand3. Таким образом, http://localhost:9081/rootContext/MyControllerServlet?brand=brand3 должен перенаправить на страницу Angular2.

MyControllerServlet.com

if(brand.equalsIgnoreCase(BRAND1)){
  response.sendRedirect(BRAND1_PAGE);
}else if(brand.equalsIgnoreCase(BRAND2)){
  response.sendRedirect(BRAND2_PAGE);
}

Это хорошо работало с существующими страницами, которые все являются JSP. Недавно добавленная страница Angular2 называется brand3.jsp со следующей конфигурацией.

webpack-dist-conf.js

new HtmlWebpackPlugin({
   template: conf.path.src('index.html'),                   
   filename: 'brand3.jsp'
})

Выходной блок выглядит так.

 output: {
    path: path.join(process.cwd(), conf.paths.dist),
    filename: '[name]-[hash].js',
    publicPath: '${pageContext.request.contextPath}/'
 }

PublicPath был добавлен, так как main*.js и vendor*.js давали 404 без корневого контекста.

routes.ts имеет следующую корневую конфигурацию.

{
 path: '',
 redirectTo: 'landingpage',
 pathMatch: 'full'
},
{
 path: 'landingpage',
 component: LandingPageComponent
}

Проблема в том, что когда мы перенаправляем на brand3.jsp, мы получаем 404 со следующей ошибкой.

ОШИБКА Ошибка: Неперехваченный (в промисе): Ошибка: Не удается сопоставить ни один маршрут. Сегмент URL: 'rootContext/MyControllerServlet' Ошибка: не удается сопоставить ни одного маршрута. Сегмент URL: 'rootContext/MyControllerServlet'

Это перенаправление работало довольно хорошо раньше, когда страница была разработана с версией Angular 1.6. Нам даже не понадобился publicPath для рендеринга файлов main*.js и vendor*.js, которые находятся в той же папке, что и capmf.jsp.

Проблема начала возникать только после перехода на TypeScript и Angular2.

Я читал, что маршруты Angular2 требуют некоторой конфигурации на стороне сервера. Для этого я попытался использовать UrlRewriteFilter tuckey со следующей конфигурацией.

web.xml

<filter>
 <filter-name>UrlRewriteFilter</filter-name>
 <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
 <init-param>
  <param-name>logLevel</param-name>
  <param-value>DEBUG</param-value>
 </init-param>
</filter>
<filter-mapping>
 <filter-name>UrlRewriteFilter</filter-name>
 <url-pattern>/*</url-pattern>
 <dispatcher>REQUEST</dispatcher>
 <dispatcher>FORWARD</dispatcher>
</filter-mapping>

urlrewrite.xml

<rule enabled="true">
    <note>Do not process URL ending at index.html</note>
    <from>contextRoot/brand3.jsp$</from>
    <to last="true">-</to>
</rule>

<rule>
    <from>contextRoot/landingpage</from>
    <to>contextRoot/brand3.jsp</to>
</rule>

Я знаю, что перезапись URL-адреса работает, поскольку я мог видеть операторы отладки. Однако я не использовал его раньше и не уверен, правильно ли я его настроил.

Дополнительное примечание. Мы используем Maven3 для создания приложения и для страниц Angular, которые мы используем.

<groupId>com.github.eirslett</groupId>
  <artifactId>frontend-maven-plugin</artifactId>
<version>1.4</version>

У меня вопрос -

  • Это происходит из-за тега ? Я не могу изменить базовый тег href с помощью плагинов npm. Я получаю не ошибку конструктора с base-href-webpack-plugin и webpack-base-href plugin
  • Является ли publicPath правильным способом решения проблемы, когда rootContext не добавляется для файлов src javascript?
  • Что еще я могу сделать, чтобы избежать ошибки 404 для brand3.jsp?

person Kabira Speaking    schedule 01.05.2017    source источник
comment
Я смог использовать BaseHrefWebpackPlugin и добавить тег ‹base href=/rootContext/brand3.jsp› в brand3.jsp. После этого файлы javascript загружались без необходимости использования publicPath. Однако есть одна небольшая проблема. По умолчанию маршруты добавляются с завершающей косой чертой. Из-за этого страница по умолчанию не загружается. Если я удалю косую черту вручную, я смогу перейти на целевую страницу.   -  person Kabira Speaking    schedule 01.05.2017


Ответы (1)


Добавление корня контекста в базовый href было правильным решением.

new BaseHrefWebpackPlugin({ baseHref: '${pageContext.request.contextPath}/contextRoot' })

После добавления базового href поправил, не было необходимости в publicPath в выходном блоке, а так же файлы JS тоже нашлись и не выдавали 404.

output: {
 path: path.join(process.cwd(), conf.paths.dist),
 filename: '[name]-[hash].js'
} 

Перезапись URL по-прежнему требуется для работы системы, если вы обновляете страницу. Это не имело ничего общего с ошибкой 404, которую мы получали, когда отсутствовал базовый тег href.

person Kabira Speaking    schedule 12.05.2017