注意:灌水的一律删无赦。
我目前是使用spring mvc,controller继承AbstractController,synchronizeOnSession为默认的false(我还不清楚这个设置true到底有啥用?难道仅仅是为了保证controller的同步?)。我实现的功能是使用jquery上传文件,有两个button,一个上传button,一个新增button。当点上传button时候,文件的相关信息马上读取出来,并且在下方显示出来:文件名,上传者,上传时间,文件大小等信息。而这些信息我是存储在后台的session中的。用户可以点击上传button一次上传多个文件,也可以随时删除文件。当用户最终点击新增按钮时候,才将全部文件上传到服务器。在后台的新增方法中,我是通过request.getSession(true).getAttribute("fileLists");获取之前存储在session中的文件信息的,然后循环上传到服务器中。
功能我都实现ok了。现在担心会出现的问题是,session的多线程访问问题,是否会出现数据不一致?该如何处理比较好?难道非要处理行如如下这样?HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();synchronized Session getCurrentSession(){
session = request.getSession();
return session;
}
我考虑的多线程安全问题是否有必要? (ps:我也考虑过,同一个用户,即使开两个浏览器,不可能手动操作在非常短的时刻内同时上传,但是使用jquery异步本身已经开启了多个线程,何况,如果别人恶意采用工具来上传文件,肯定会有多线程安全方面的问题)。
期待CSDN认证专家们给与权威解答!
我目前是使用spring mvc,controller继承AbstractController,synchronizeOnSession为默认的false(我还不清楚这个设置true到底有啥用?难道仅仅是为了保证controller的同步?)。我实现的功能是使用jquery上传文件,有两个button,一个上传button,一个新增button。当点上传button时候,文件的相关信息马上读取出来,并且在下方显示出来:文件名,上传者,上传时间,文件大小等信息。而这些信息我是存储在后台的session中的。用户可以点击上传button一次上传多个文件,也可以随时删除文件。当用户最终点击新增按钮时候,才将全部文件上传到服务器。在后台的新增方法中,我是通过request.getSession(true).getAttribute("fileLists");获取之前存储在session中的文件信息的,然后循环上传到服务器中。
功能我都实现ok了。现在担心会出现的问题是,session的多线程访问问题,是否会出现数据不一致?该如何处理比较好?难道非要处理行如如下这样?HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();synchronized Session getCurrentSession(){
session = request.getSession();
return session;
}
我考虑的多线程安全问题是否有必要? (ps:我也考虑过,同一个用户,即使开两个浏览器,不可能手动操作在非常短的时刻内同时上传,但是使用jquery异步本身已经开启了多个线程,何况,如果别人恶意采用工具来上传文件,肯定会有多线程安全方面的问题)。
期待CSDN认证专家们给与权威解答!
public void handleActionRequest(ActionRequest request, ActionResponse response) throws Exception {
// Delegate to PortletContentGenerator for checking and preparing.
check(request, response);
// Execute in synchronized block if required.
if (this.synchronizeOnSession) {
PortletSession session = request.getPortletSession(false);
if (session != null) {
synchronized (session) {
handleActionRequestInternal(request, response);
return;
}
}
}
handleActionRequestInternal(request, response);
}所以,这里其实主要防止的是:对同一个session操作的线程安全问题,而不是对整个线程管理容器。
而你这个做法:
synchronized Session getCurrentSession(){
session = request.getSession();
return session;
}
实际上对整个获取线程做了同步(没必要),但其实却反而并没保护同一个session操作的线程安全问题。
多个jquery异步请求,不算多线程吗?
Integer cnt = (Integer) session.getAttribute("counter");
cnt = cnt + 1;
session.setAttribute("counter", cnt);
2楼所附源码是可以实现的。
http://www.iteye.com/problems/70091