GWT servlet过滤器,如何识别特殊服务请求?

标签 gwt servlets mvp servlet-filters requestfactory

我使用 GWT+requestfacotry(MVP)+GAE 创建了一个应用程序。有一些服务或方法暴露给GWT客户端,例如

1.create 
2.remove
3.query

我想为“创建”和“删除”添加授权功能,但不为“查询”添加授权功能。 我用 servlet 过滤器做到了:

 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);
  }

我的问题是如何识别传入的请求(我的意思是该请求将路由到哪个类和服务)?有一些头字段包含模块名称,但我不认为这是安全方法。 是否可以从http请求中获取RequestFacotry相关类?

谢谢

最佳答案

在 servlet-filter 中很难做到这一点。相反,您可以在 RF ServiceLayerDecorator 链中提供自定义装饰器。实现可以如下所示:

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 servlet:

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

public class SecurityAwareRequestFactoryServlet extends RequestFactoryServlet {

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

并将其注册到您的 web.xml 中:

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

关于GWT servlet过滤器,如何识别特殊服务请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11525787/

相关文章:

java - GWT + JDO + 数组列表

java - 将另一个 servlet 部署到 wildfly 实例

android - MVP 模式 Android 演示者中的重复方法

qt - Qt应用程序有什么好的MV *模式?

ruby - 使用 Ruby 的 Sinatra 的 Presenter 示例

gwt - 如何从 GWT 服务器范围获取 GWT 基本 URL 或模块名称?

gwt - 如何将 Spring Roo 和 GET 结合在一起

javascript - 使用 JSNI 从 GWT 向 Google Analytics 发送事件

java - Servlet 无法识别 JSON?

jquery - jsp中抛出的数据类型异常