【问题标题】:GWT servlet filter ,How to identify special service request?GWT servlet过滤器,如何识别特殊服务请求?
【发布时间】:2012-07-16 13:38:42
【问题描述】:

我用 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 请求中获取 RequestFactry 相关类?

谢谢

【问题讨论】:

    标签: gwt servlets mvp servlet-filters requestfactory


    【解决方案1】:

    在 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>
    

    【讨论】:

    • 非常感谢。这对我来说很清楚。所以还需要覆盖自定义servlet中的doPost,然后我们可以设置http响应头。对吧?
    猜你喜欢
    • 1970-01-01
    • 2011-09-02
    • 2021-10-27
    • 1970-01-01
    • 2011-11-30
    • 2013-04-12
    • 2011-12-18
    • 2014-09-13
    • 2014-02-07
    相关资源
    最近更新 更多