第一次用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 路径就可以了。