Форматирование сообщения об исключении, выдаваемого системой безопасности Spring в цепочке фильтров - PullRequest
2 голосов
/ 19 января 2011

Настройка: Resteasy + Spring Security на Tomcat. Обмен данными между клиентом и сервером осуществляется в формате JSON. Имейте средства отображения исключений, чтобы возвращать сообщения в формате JSON, когда приложение генерирует любое исключение.

Цель: Всегда возвращайте правильно отформатированное сообщение об ошибке JSON с сервера всякий раз, когда что-то идет не так.

Что происходит: Уровень Spring Security вызывается до вызова метода foo () контейнером сервлета. Если этот уровень завершается с ошибкой (например, неправильный идентификатор пользователя), исключение выдается даже до того, как сервлет вызван, и, следовательно, ошибка не отформатирована должным образом. Любая идея, как обойти это и вернуть ошибку JSON в этом случае?

Спасибо.

Часть моего web.xml, если это вообще полезно:

<filter>
    <filter-name>securityPropagationFilter</filter-name>
    <filter-class>com.foo.bar.context.servlet.SecurityContextPropagationFilter</filter-class>
</filter>

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter>
    <filter-name>loggingFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>securityPropagationFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>loggingFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<listener>
    <listener-class>
        org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
    </listener-class>
</listener>

<servlet>
    <servlet-name>
        Resteasy
    </servlet-name>
    <servlet-class>
        org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
    </servlet-class>
</servlet>

Ответы [ 2 ]

1 голос
/ 05 марта 2011

Я обошел это, добавив следующее в мой web.xml

<error-page>
    <error-code>403</error-code>
    <location>403.json</location>
</error-page>

С другой стороны, мне понадобится одна запись для каждого кода ошибки, который мне нужно обработать. Но я думаю, мне пришлось бы сделать то же самое, если бы мне пришлось настраивать обработчики исключений и в Spring.

0 голосов
/ 24 января 2011

Мне пришлось бы копать немного глубже, но вы могли бы решить эту проблему с помощью картографа исключений либо из RESTeasy, либо из Spring.

...