2017-08-30 7 views
2

私は比較的新しいMVCですが、現在はWebサービスの認証インターセプタを含める必要があります。認証が失敗した場合は、傍受者がAccessForbiddenExceptionをスローする必要があります。また、例外をキャッチしてHttpStatusでResponseEntityを返すAuthenticationExceptionControllerを作成しました。しかし、内部エラー500が発生し、AuthenticationExceptionControllerが例外をキャッチできないことが原因であると思われます。以下は私のコードです。どのように私はそれを解決することができますに関するアドバイス?コントローラのアドバイスは例外をキャッチできません

AuthenticationInterceptor.java

package path.controller; 

public class AuthenticationInterceptor implements HandlerInterceptor { 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { 
     // handle the authentication check 

     if(authentication fails) { 
      throw new AccessForbiddenException("access forbidden"); 
     } 
     return true; 
    } 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
    } 

    @Override 
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 
     throws Exception { 
    } 
} 

AccessForbiddenException.java

package path.controller; 

public class AccessForbiddenException extends RunTimeException{ 
    public AccessForbiddenException(String message) { 
     super(message); 
    } 
} 

AuthenticationExceptionController.java

ルートのcontext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans.xsd 
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context.xsd 
         http://www.springframework.org/schema/tx 
         http://www.springframework.org/schema/tx/spring-tx.xsd"> 

    <context:annotation-config /> 
    <bean id="contextApplicationContextProvider" class="path.context.provider.ApplicationContextProvider"></bean> 

    <context:property-placeholder location="classpath:application.properties" /> 

    <context:component-scan base-package="path.**" /> 
</beans> 

サーブレットのcontext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 

    <context:property-placeholder location="classpath:application.properties" /> 

    <context:annotation-config /> 

    <annotation-driven /> 

    <view-controller path="" view-name="index.html" /> 

    <resources mapping="**" location="/" /> 

    <beans:bean 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <beans:property name="prefix" value="/" /> 
     <beans:property name="suffix" value="" /> 
    </beans:bean> 

    <interceptors> 
     <interceptor> 
      <mapping path="/**" /> 
      <exclude-mapping path="/login"/> 
      <exclude-mapping path="/authenticate"/> 
      <beans:bean class="path.controller.AuthenticationInterceptor" /> 
     </interceptor> 
    </interceptors> 

    <context:component-scan base-package="path" use-default-filters="false"> 
     <context:include-filter expression="path.Controller" type="annotation" /> 
    </context:component-scan> 
</beans:beans> 
+2

1.新規の場合は、Spring XMLを使用しないでください。世界は変わりました。 2. 500エラーを送信します。 3.スタックトレースをポストします。 4.リクエストをポストします。 –

答えて

0

@ControllerAdviceは、コントローラレベルで発生した例外をキャッチ。

コントローラが呼び出す前に例外がauthレベルでスローされた場合、それは無駄です。

代わりに、認証する前にフィルタを追加して、フィルタ内の例外をキャッチすることができます。

関連する問題