2

セットアップ: Tomcat での Resteasy + Spring Security。クライアント/サーバー間で交換されるデータは JSON 形式です。アプリが例外をスローしたときに、例外マッパーが JSON 形式のメッセージを返すようにします。

目標: 何か問題が発生した場合は常に、適切な形式の JSON エラー メッセージをサーバーから返します。

何が起こっているか: Spring Security レイヤーは、メソッド foo() がサーブレット コンテナーによって呼び出される前に呼び出されます。このレイヤーが失敗した場合 (ユーザー ID が間違っているなど)、サーブレットが呼び出される前であっても例外がスローされるため、エラーは適切にフォーマットされません。この場合、これを回避して 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>
4

2 に答える 2

1

web.xmlに以下を追加することでこれを回避しました

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

反対に、処理する必要があるエラー コードごとに 1 つのエントリが必要です。しかし、Spring でも例外ハンドラーを微調整する必要がある場合は、同じことをしなければならないと思います。

于 2011-03-04T22:02:22.030 に答える
0

もう少し深く掘り下げる必要がありますが、RESTeasy または Spring 内から例外マッパーを使用してこれを解決できる場合があります。

于 2011-01-24T19:04:20.807 に答える