2016-04-09 8 views
0

Ich möchte einige Standardwerte in der Sitzung in einer SpringBoot-Anwendung festlegen. Idealerweise dachte ich darüber nach, eine Klasse mit @ControllerAdvice zu verwenden, um die Standardwerte festzulegen. Dies ist besonders nützlich, da das Code-Snippet für alle Seiten ausgeführt werden muss.Zugreifen auf HttpSession in einem ControllerAdvice in einer SpringBoot-Anwendung

Gibt es eine Möglichkeit, auf die HttpSession in einer Klasse zuzugreifen, die mit @ControllerAdvice gekennzeichnet ist?

+0

Warum nicht Interceptors dafür verwenden? – JSONStatham

+0

@JSONStatham das ist eine ausgezeichnete Idee! –

Antwort

1

Sie können die Sitzung aus Ihrem @ControllerAdvice erhalten, mit:

Option 1:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); 

HttpSession session = requeset.getSession(true);//true will create if necessary 

Option 2:

@Autowired(required=true) 
private HttpServletRequest request; 

Option 3:

@Context 
private HttpServletRequest request; 

Hier ist eine Prüfung Wie ich einen Controller-Aspekt entwickelt habe, der alle Controller-Endpunkt-Methoden abfängt:

@Component 
@Aspect 
class ControllerAdvice{ 

    @Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)") 
    void hasRequestMappingAnnotation() {} 

    @Pointcut("execution(* your.base.package..*Controller.*(..))") 
    void isMethodExecution() {} 

    /** 
    * Advice to be executed if this is a method being executed in a Controller class within our package structure 
    * that has the @RequestMapping annotation. 
    * @param joinPoint 
    * @throws Throwable 
    */ 
    @Before("hasRequestMappingAnnotation() && isMethodExecution()") 
    void beforeRequestMappedMethodExecution(JoinPoint joinPoint) { 
     String method = joinPoint.getSignature().toShortString(); 
     System.out.println("Intercepted: " + method); 

     //Now do whatever you need to 
    } 
} 
+0

Das ist wirklich nett. Anyway, 'getRequest()' existiert nicht. Außerdem sehe ich von [this] (http://stackoverflow.com/a/1629239/1983997), dass es 'currentRequestAttributes()' anstelle von 'getRequestAttributes()' –

+0

verwendet werden sollte. Außerdem, wie soll ich die Methode kommentieren im Controller-Gerät, damit es aufgerufen werden kann, wenn jeder Controller aufgerufen wird? –

+0

getRequestAttributes und getCurrentRequestAttrributes führen die gleiche Funktion mit der Ausnahme aus, dass getCurrentRequestAttributes: Die zuvor gebundene RequestAttributes-Instanz, falls vorhanden, verfügbar macht. Geht zurück zum aktuellen JSF FacesContext, falls vorhanden. – pczeus

0

Ich würde Ihnen empfehlen, Spring Interceptors anstatt @ControllerAdvice zu verwenden. Später können Sie Verhalten mit Interceptor-Zuordnungen leicht anpassen.

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-handlermapping-interceptor

@ControllerAdvice wirklich glänzt, wenn man global einige Ausnahmen behandeln wollen.

+0

Können Sie auch zeigen, wie die Interceptor-Klasse die Sitzung abfangen soll? –

+0

Was verwenden Sie genau für das Sitzungsmanagement? Frühjahrssession mit Redis? – JSONStatham

+0

Ja, ich habe eine eingebettete REDIS-Instanz. Aber ich denke nicht, dass das etwas ändert, oder? –

Verwandte Themen