2012-07-17 68 views
2

我用GWT + requestfacotry(MVP)+ GAE創建了一個應用程序。有一些服務或方法暴露給GWT客戶端,如GWT servlet過濾器,如何識別特殊服務請求?

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相關類?

謝謝

回答

2

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

非常感謝這對我來說很清楚。所以還需要重寫自定義servlet中的doPost,然後我們可以設置http響應頭。對 ? – 2012-07-18 13:12:57

相關問題