2017-08-30 1 views
2

Je suis relativement nouveau au printemps MVC et je suis actuellement dans le besoin d'inclure un intercepteur d'authentification pour les services Web. J'ai besoin de l'intercepteur pour lancer une exception AccessForbiddenException si l'authentification échoue en retournant true si elle réussit. J'ai également créé un AuthenticationExceptionController pour attraper l'exception et renvoyer un ResponseEntity avec un HttpStatus. Cependant, quand j'ai rencontré l'erreur interne 500 et je suspecte que c'est dû au AuthenticationExceptionController étant incapable d'attraper l'exception. Voici mes codes. Des conseils sur la façon dont je peux le résoudre?Le conseil du contrôleur ne peut pas attraper l'exception

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

package path.controller; 

@ControllerAdvice 
public class AuthenticationExceptionController {  

    @ExceptionHandler(AccessForbiddenException.class) 
    public ResponseEntity<?> handleException(AccessForbiddenException e) { 
     return new ResponseEntity<String>(e.getMessage(), HttpStatus.FORBIDDEN); 
    } 
} 

racine 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> 

servlet-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. Si vous êtes nouveau, ne commencez pas avec Spring XML; le monde a évolué. 2. Publiez l'erreur 500. 3. Publiez la trace de pile, qui en contient une. 4. Affichez la demande. –

Répondre

0

@ControllerAdvice attire des exceptions soulevées au niveau du régulateur. Donc, si l'exception est lancée au niveau d'authentification avant l'appel du contrôleur, elle est inutile. Au lieu de cela, vous pouvez essayer d'ajouter un filtre avant l'authentification et d'intercepter les exceptions dans le filtre.