GWT servlet filter, как определить специальный запрос на обслуживание?


Я создал приложение с GWT + requestfacotry (MVP)+GAE. Существуют некоторые службы или методы, доступные клиенту GWT, такие как

1.create 
2.remove
3.query

Я хочу добавить функцию авторизации для "создания" и "удаления", но не для "запроса". Я сделал это с фильтром сервлета:

 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
      FilterChain filterChain) throws IOException, ServletException {
    UserService userService = UserServiceFactory.getUserService();
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;

    if (!userService.isUserLoggedIn()) {

        response.setHeader("login", userService.createLoginURL(request.getHeader("pageurl")));
     // response.setHeader("login", userService.createLoginURL(request.getRequestURI()));
      response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
      return; 
    } 

    filterChain.doFilter(request, response);
  }

Мой вопрос заключается в том, как определить, какой запрос (я имею в виду, что запрос будет перенаправляться в какой класс и службу )поступает ? Есть некоторые заголовочные поля, содержащие имя модуля ,но я не думаю, что это путь безопасности делать. Можно ли получить соответствующий класс RequestFacotry из http запроса ?

Спасибо

1 2

1 ответ:

Это трудно сделать в рамках сервлет-фильтра. Вместо этого вы можете предоставить пользовательский декоратор в цепочке RF ServiceLayerDecorator. Реализация can выглядит следующим образом:

import com.google.web.bindery.requestfactory.server.ServiceLayerDecorator;

public class SecurityDecorator extends ServiceLayerDecorator {

  @Override
  public Object invoke( Method domainMethod, Object... args ) {
    if ( !isAllowed( domainMethod) ) {
      handleSecurityViolation();
    }
    return super.invoke( domainMethod, args );
  }
}

Чтобы зарегистрировать дополнительный декоратор, предоставьте пользовательский RF сервлет:

import com.google.web.bindery.requestfactory.server.RequestFactoryServlet;

public class SecurityAwareRequestFactoryServlet extends RequestFactoryServlet {

  public SecurityAwareRequestFactoryServlet() {
    super( new DefaultExceptionHandler(), new SecurityDecorator() );
  }
}  

И зарегистрируйте его в своей сети.xml:

<servlet>
    <servlet-name>gwtRequest</servlet-name>
    <servlet-class>com.company.SecurityAwareRequestFactoryServlet</servlet-class>
</servlet>