Я пытаюсь реализовать фильтр для приложения 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());
}
Это, безусловно, не является поведение, которое вы введены путем сохранения аутентифицированного пользователя в переменной THREAD_LOCAL. Но что в стороне, почему вы должны это делать? Почему не только в области запроса? – ramp
Я хочу получить доступ к форме currentuser всюду в моем коде, чтобы я мог проверить его роль и уровень доступа в любом классе. Я знаю, что совершать его с помощью области запроса, вероятно, является лучшим решением для обеспечения безопасности, но это также сложнее и дорогостоящим способом справиться с этим. – Weini
Есть ли у вас какие-либо другие фильтры внутри цепочки фильтров? –