uploadify http 302问题说明

在项目中用到uploadify的程序员应该遇到这个http 302的错误,其实这个原因的根本原因在于你在执行后台代码之前用session进行登录验证。所以最简单的解决这个问题的方法是在上传文件的代码块中把session登录验证的代码块去掉。当然这个方法不可取,下面先分析这个问题出现的原因及另一种解决方式

下面先给导致问题出现的代码

uploader : "/acr/user/rqs/iconupload",//此为uploadify插件向后台发送请求的url

        @Login//登录验证
	@RequestMapping(value = "/iconupload", method = RequestMethod.POST)
	public @ResponseBody
	String iconUpload(
			@RequestParam MultipartFile file, 
			Model model,HttpSession session,
                       HttpServletRequest request) throws Exception {

		String root = "/srv/icons/icon";
		
		return FileUtil.upload(file, root,request);
	}

    这段代码会报302错误。302状态码 表示请求发生了暂时性转移,且302 重定向是临时性转移。如果去掉@login不进行登录则不会出现此问题。所以不难理解问题的关键在于登录验证的逻辑。登录验证的一般逻辑是获取session保存的用户名name, 如果name==null的话就重定向到登录界面,所以这个302的问题就不难发现了:关键在于这个session中没有保存该name。在这里你可能会想怎么可能?我已经登录了,且把name保存在session中,怎么可能会在登录验证的时候name == null???所以只有一种情况,此session非彼session!!!!说明uploadify在向后台发送请求的时候重新生成了一个session。

  我们知道在第一次访问服务器的时候,服务器开启一个session(此处假设为S1)发给浏览器一个jsessionid(此处假设jsessionid=1)。在以后的发起的每一个请求中浏览器会把这个jsessionid重新发给服务器来定位S1,因为session.getId() == jsessionid==1.并从S1中获取name来验证用户是否登录。

  当用uploadify的时候,通过iconUpload方法参数中的session获取此session的id,即:session.getId().经过测试发现此时的session.getId() != 1,由此可见这个session已经不是原来的那个session了。

  既然是通过jsessionid来定位当前用户的session,那么解决这个问题的方法很自然的就出现了,即在url后面加上“;jsessionid=”+1(或S1.getId()),手工指定jsessionid == 1(S1.getId())来定位正确的session(S1)就可以了。所以改正后的代码如下

uploader: "/acr/user/rqs/iconupload;jsessionid="+"<%=request.getSession().getId()%>",

注意此处iconupload后面是“;"而不是“?".(貌似有点乱,不当之处还请指正,共同学习)


你可能感兴趣的:(SSH)