2016-04-09 4 views
0

Я хотел бы установить некоторые значения по умолчанию в сеансе в приложении SpringBoot. В идеале я думал использовать класс, аннотированный с @ControllerAdvice, чтобы установить значения по умолчанию. Это полезно, особенно потому, что фрагмент кода должен быть выполнен для всех страниц.Доступ к HttpSession в ControllerAdvice в приложении SpringBoot

Есть ли способ доступа к HttpSession в классе, аннотированном с @ControllerAdvice?

+0

Почему бы не использовать перехватчики для этого? – JSONStatham

+0

@ JSONStatham - отличная идея! –

ответ

1

Вы можете получить сеанс из вашего @ControllerAdvice, используя:

Вариант 1:

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

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

Вариант 2:

@Autowired(required=true) 
private HttpServletRequest request; 

Вариант 3:

@Context 
private HttpServletRequest request; 

Вот пример o f как я разработал аспект контроллера, который перехватывает все методы конечной точки контроллера:

@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

Это действительно хорошо. Во всяком случае, 'getRequest()' не существует. Более того, я вижу из [this] (http://stackoverflow.com/a/1629239/1983997) ответ, что он должен использоваться 'currentRequestAttributes()' вместо 'getRequestAttributes()' –

+0

Кроме того, как я должен аннотировать метод в контроллере, чтобы он мог быть вызван при вызове каждого контроллера? –

+0

getRequestAttributes и getCurrentRequestAttrributes выполняют ту же функцию, за исключением того, что getCurrentRequestAttributes: выдает ранее связанный экземпляр RequestAttributes, если таковой имеется. Возвращается к текущему JSF FacesContext, если таковой имеется. – pczeus

0

Я бы рекомендовал вам использовать Spring Interceptors вместо @ControllerAdvice. Позже вы можете легко настроить поведение с помощью сопоставлений Interceptor.

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

@ControllerAdvice действительно сияет, когда вы хотите, чтобы справиться с некоторыми исключениями в глобальном масштабе.

+0

Можете ли вы также показать, как класс перехватчика должен перехватывать сеанс? –

+0

Что вы используете для управления сессиями? Весенняя сессия с Редисом? – JSONStatham

+0

Да, у меня встроенный экземпляр REDIS. Но я не думаю, что это что-то изменит, верно? –

Смежные вопросы