gwt 使用spring4gwt 如何获取session

第一次用gwt做项目,不知道如何获取session,网上很多教程都是说 ,继承RemoteServceServlet,然后调用this.getThreadLocalRequest(),就能获取到session了。 我用了 spring4gwt,按照上诉说法是无法获取到session的。后来在网上找了一个帖子,里面让修改 spring4gwt-0.0.1.jar 里面的 SpringGwtRemoteServiceServlet 文件。 原帖我已经找不到了,这里记录一下希望能有别人用上。

第一步:新建一个class: InterfaceUtil

public class InterfaceUtil {

@SuppressWarnings("rawtypes")
 public boolean isInterface(Class c, String szInterface) { 
        Class[] face = c.getInterfaces(); 
        for (int i = 0, j = face.length; i < j; i++) { 
            if (face[i].getName().equals(szInterface)) { 
                return true; 
            } else { 
                Class[] face1 = face[i].getInterfaces(); 
                for (int x = 0; x < face1.length; x++) { 
                    if (face1[x].getName().equals(szInterface)) { 
                        return true; 
                    } else if (isInterface(face1[x], szInterface)) { 
                        return true; 
                    } 
                } 
            } 
        } 
        if (null != c.getSuperclass()) { 
            return isInterface(c.getSuperclass(), szInterface); 
        } 
        return false; 
    } 

}

第二步:新建一个Interface :IRequestAware

import javax.servlet.http.HttpServletRequest;

public interface IRequestAware {
        void setServletRequest(HttpServletRequest request);
}

 

第三步:SpringGwtRemoteServiceServlet.java文件(如果没有java,就把.class反编译后的代码copy出来也可以,一样的。) 从 spring4gwt-0.0.1.jar里面复制到自己的项目里,修改 processCall(String payload)  方法,如下代码:

   public String processCall(String payload) throws SerializationException {
     try {
      Object handler = getBean(getThreadLocalRequest());
      
      InterfaceUtil util = new InterfaceUtil(); 
      
      boolean flag = util.isInterface(handler.getClass(), 
               IRequestAware.class.getName()); //判断是否实现了IRequestAware接口 
        if (flag) {//如果实现了IRequestAware就进行HttpServletRequest注入 
            java.lang.reflect.Method method = null; 
            try { 
                method = handler.getClass().getDeclaredMethod( 
                        "setServletRequest", 
                        new Class[] { HttpServletRequest.class }); 
                method.invoke(handler, getThreadLocalRequest()); 
               
            } catch (NoSuchMethodException e) { 
                e.printStackTrace(); 
            } catch (SecurityException e) {  
                e.printStackTrace(); 
            } catch (IllegalAccessException e) {  
                e.printStackTrace(); 
            } catch (IllegalArgumentException e) {   
                e.printStackTrace(); 
            } catch (InvocationTargetException e) {  
                e.printStackTrace(); 
            } 
        } 
       
        RPCRequest rpcRequest = RPC.decodeRequest(payload, handler.getClass(), this);
        onAfterRequestDeserialized(rpcRequest);
        if (LOG.isDebugEnabled()) {
          LOG.debug("Invoking " + handler.getClass().getName() + "." + rpcRequest.getMethod().getName());
        }
        return RPC.invokeAndEncodeResponse(handler, rpcRequest.getMethod(), rpcRequest.getParameters(), rpcRequest.getSerializationPolicy());
     } catch (IncompatibleRemoteServiceException ex) {
        log("An IncompatibleRemoteServiceException was thrown while processing this call.", ex);
        return RPC.encodeResponseForFailure(null, ex);
     }
    
   }

 

第四步: 在你自己的gwt rpc service 的impl 类中,实现 IRequestAware 接口, 这里我的代码大家可以参考一下。

@Component("userService")
public class UserServiceImpl implements UserService, IRequestAware {

          private HttpServletRequest request;

          public void setServletRequest(HttpServletRequest request) {
                 this.request = request;
           }

           /* 获取session */
          HttpSession getSession() {
                   return this.request.getSession();
           }

}

这里就可以获取到session了,  getSession()方法。

 

最后,在web.xml中,之前配置的关于 spring4gwt的servlet监听,

现在 你只需要把 servlet-class 的路径,配置到你修改后的 SpringGwtRemoteServiceServlet 路径就可以了。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值