Использовать сервлет для пользовательских ошибок HTTP?(Кот) - PullRequest
0 голосов
/ 10 января 2012

Я использую Struts 1.3.10 для запуска сайта. Все работает хорошо, но я хотел бы добавить некоторую настраиваемую обработку ошибок для HTTP 404 и другие подобные ошибки. Куда бы я ни посмотрел, я вижу, что пользовательские страницы ошибок должны быть jsp (например, 404.jsp), которые определены в файле Web.xml.

В моем приложении я создал глобальный обработчик ошибок, который использует сервлет обработки ошибок для отображения динамической страницы ошибок для других ошибок сервлета (например, время выполнения, логика шины и т. Д.). Будет ли что-то не так с перенаправлением на этот сервлет из 404.jsp (как определено в Web.xml)? Идея состояла бы в том, чтобы нажать 404.jsp, получить перенаправление на сервлет, сделать запись, которую я хочу, а затем показать страницу с ошибкой. Я хотел бы в первую очередь записать причину ошибки, такую ​​как IP-адрес, запрошенный URI, создать список IP-адресов для блокировки и т. Д.

Я попробовал это, и в принципе это работает ... проблема в том, что я иногда получаю недопустимые ошибки состояния ... Мне интересно, неправильный подход или это просто плохая идея ??? Кажется, я получил много 404 от троллинга IP для неправильно настроенных сайтов PHP (см. Ниже).

Вот пример ошибки:

    :: HTTP 404 ERROR -- page not found.  URL requested = /scripts/setup.php
2012-01-09 20:23:39,375 | ERROR | (ApplicationDispatcher.java:691) - Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException
    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:433)
    at org.apache.struts.taglib.logic.RedirectTag.doRedirect(RedirectTag.java:314)
    at org.apache.struts.taglib.logic.RedirectTag.doEndTag(RedirectTag.java:268)
    at org.apache.jsp._404_jsp._jspx_meth_logic_005fredirect_005f0(_404_jsp.java:118)
    at org.apache.jsp._404_jsp._jspService(_404_jsp.java:74)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:659)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:395)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311)
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:364)
    at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:285)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200)
    at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
    at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:775)
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:704)
    at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:897)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    at java.lang.Thread.run(Thread.java:619)
Jan 9, 2012 8:23:39 PM org.apache.catalina.core.StandardHostValve custom
SEVERE: Exception Processing ErrorPage[errorCode=404, location=/404.jsp]
org.apache.jasper.JasperException
    at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:498)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:405)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:659)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:395)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311)
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:364)
    at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:285)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200)
    at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
    at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:775)
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:704)
    at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:897)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    at java.lang.Thread.run(Thread.java:619)

1 Ответ

3 голосов
/ 10 января 2012

Вы не должны контролировать запрос / ответ внутри JSP. JSP в основном является частью ответа. Попытка изменить ответ внутри JSP может привести к недопустимым исключениям состояния, когда ответ уже зафиксирован. В общем, написание необработанного кода Java и / или управление запросом / ответом в JSP является плохой практикой .

Просто отобразите местоположение страницы ошибки непосредственно на сервлет.

<error-page>
    <error-code>404</error-code>
    <location>/someErrorServlet</location>
</error-page>

, где /someErrorServlet соответствует <url-pattern> вашего сервлета обработки ошибок. Там вы можете свободно управлять запросом / ответом, например, пересылкой в ​​произвольную JSP.

...