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 ответ:
Это трудно сделать в рамках сервлет-фильтра. Вместо этого вы можете предоставить пользовательский декоратор в цепочке 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>