0

Я пытаюсь реализовать фильтр для приложения appengine. Фильтр аутентифицирует пользователя и сохраняет текущий пользователь в переменной THREAD_LOCAL. Проблема в том, что поток, выполняющий фильтр, отличается от потока, выполняющего сервлет. Это нормальное поведение appengine или я делаю что-то неправильно?Фильтр Appengine и сервлет на разные темы

Это мой фильтр:

@Override 
public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
    try { 
     Session.removeCurrentSession(); 
     HttpServletRequest httpRequest = (HttpServletRequest) request; 
     SessionFactory.authorize(httpRequest.getHeader("Authorization")); 
     System.out.println("Filter ThreadId: " + Thread.currentThread().getId()); 
     chain.doFilter(request, response); 
     System.out.println("Filter ThreadId: " + Thread.currentThread().getId()); 
    } 
    finally { 
     Session.removeCurrentSession(); 
    } 
} 

и это мой AppEngine Войти конечная точка:

@ApiMethod(name = "users.login", path = "login", httpMethod = HttpMethod.POST) 
      public Message loginUser(HttpServletRequest request) throws UnauthorizedException { 

       System.out.println("Servlet ThreadId: " + Thread.currentThread().getId()); 
       Session session = Session.getCurrentSession(); 
       System.out.println("Session: "+ session.getId() + " ThreadId: " + Thread.currentThread().getId()); 
    } 
+1

Это, безусловно, не является поведение, которое вы введены путем сохранения аутентифицированного пользователя в переменной THREAD_LOCAL. Но что в стороне, почему вы должны это делать? Почему не только в области запроса? – ramp

+0

Я хочу получить доступ к форме currentuser всюду в моем коде, чтобы я мог проверить его роль и уровень доступа в любом классе. Я знаю, что совершать его с помощью области запроса, вероятно, является лучшим решением для обеспечения безопасности, но это также сложнее и дорогостоящим способом справиться с этим. – Weini

+0

Есть ли у вас какие-либо другие фильтры внутри цепочки фильтров? –

ответ

0

Некоторые контейнеры «Execute темы», которые только порождают новые темы для запросов и восходящие прослушивание новые. Но как только конечная точка была достигнута (сервлет), почти вся обработка запросов происходит из потока, который выполняет Servlet.

Таким образом, один из способов заставить его работать так, как вам хотелось бы, - это привязать объект User к локальной переменной потока вашей конечной точки. Между фильтром и самой конечной точкой вы можете перенести пользователя как переменную с областью действия запроса.

0

Если вы хотите сохранить пользователя для текущего запроса, выполните следующие действия:

request.setAttribute("user", user); 

и от методов API сделать это для получения пользователя:

public ApiResponse apiMethod(HttpServletRequest request) { 
    User user = (User) request.getAttribute("user"); 
Смежные вопросы