知乐空间

jsp文件上传漏洞

在项目中,经常用到的一个功能就是文件的上传和下载,不过大多数情况下都是通用的工具类,自己写的情况较少,这里写个通过Spring框架和ajaxFileUpload插件实现上传的小功能,做个练习和记录。
首先配置下SpringMVC的配置文件,配置支持文件上传

  
       
      

然后写个简单的JSP页面,为了方便绑定数据,引入Spring自带的Form表单标签,引入语句

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %> 

Form表单实现一个简单的注册功能,虽然说美感不好,这里还是引用了下bootstrap做了个简单的排版。因为原版的file标签的格式无法调整,所有用了其他的小标签代替,然后用按钮去触发file标签

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
request.setAttribute("_path", path);
%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %> 


  
    
    
    My JSP 'index.jsp' starting page
    
    
    
        
    
    
    
    
    <script type="text/javascript" src="<%=basePath%>static/js/jquery.min.js"></script>
    <script type="text/javascript" src="<%=basePath%>static/js/ajaxfileupload.js"></script>
    <script type="text/javascript" src="<%=basePath%>static/js/bootstrap.js"></script>
    <script type="text/javascript" src="<%=basePath%>static/js/jquery.json-2.4.js" charset="UTF-8"></script> 
    <script type="text/javascript">
        var path = "${_path}";
        $(function(){
            
            /* 重置Form表单功能 */
            $("#clean").click(function(){
                document.getElementById("user").reset();
                $("#userName").attr("value","");
                $("#password").attr("value","");
                $("#name").attr("value","");
                $("#sex").attr("value","");
                $("#file").attr("value","");
            });
            
            /* begin 附件上功能 */
            $("#choose").click(function(){
                $("#fileUpload").click();
            });
            $("#fileUpload").change(function(){
                $("#file").attr("value",$("#fileUpload").val());
                $.ajaxFileUpload({  
                    type: "POST",  
                    url: path+"/fileUpload.do",  
                    data:{fileName:$("#fileUpload").val()},//要传到后台的参数,没有可以不写  
                    secureuri : false,//是否启用安全提交,默认为false  
                    fileElementId:'fileUpload',//文件选择框的id属性  
                    dataType: 'json',//服务器返回的格式  
                    async : false,  
                    success: function(mes){  
                       if(mes.message=="OK"){
                           alert("附件上传成功");
                       }
                       if(mes.message=="NG"){
                           alert("附件上传失败");
                       }
                    },  
                    error: function (){  
                        alert("附件上传失败");
                    }  
                });
            });
            /* end 附件上功能 */
        });
    </script>
  
  
  
  
     
    
        
        注册页面
    
    
   
        
            
            账号:
            
             
            
            密码:
            
             
            
            姓名:
            
             
            
            性别:
            
             
            
            附件:
            
            
            
             
            
            
                
                    
                
            
            
        
    
  
  

后台页面控制器,因为用了SpringMVC的form表单,所以在渲染的时候模型中一定要有user这个对象,所以我们用控制器跳转页面

@RequestMapping("/Login.do")
    public String Login(@ModelAttribute("user") User user, Model model){
        System.out.println("进入");
        user.setName("小明");
        user.setSex("男");
        user.setUserName("叶良辰");
        model.addAttribute("user", user);
        
        return "index";
        
    }

这里为了显示SpringMVC form的自动绑定功能,我给user对象设置了值,在JSP页面,如果form:input标签由path属性和user里的属性一样,会自动设置值

SpringMVC+ajaxFileUpload.js实现文件上传

附件的js代码在上面的JSP页面中已经写好了,下面是后台控制的controller,因为我们配置了multipartResolver,所以form表单是设置了enctype=”multipart/form-data,后台一样能直接取出文本值
接受文本框内容的controller

    @RequestMapping("/register.do")
    public String register(@ModelAttribute("user") User user, Model model){

        model.addAttribute("user", user);
        System.out.println(user);
        return "index";
        
    }

附件上传的controller

    @RequestMapping("/fileUpload.do")
    public @ResponseBody Message fileUpload(HttpServletRequest request,@RequestParam("fileUpload") MultipartFile file,
            @RequestParam("fileName") String fileName,@ModelAttribute("user") User user,Model model,Message mes){
        
        //简单判断文件是否为空
        if(!file.isEmpty()){
            
            try {
                // 文件保存路径  
                String filePath = request.getSession().getServletContext().getRealPath("/") + "fileUpload/"  
                        + file.getOriginalFilename();
                file.transferTo(new File(filePath));
                mes.setMessage("OK");
            } catch (Exception e) {
                mes.setMessage("NG");
                e.printStackTrace();
            }
        }
        user.setFile(fileName);
        System.out.println(fileName);
        model.addAttribute("user", user);
        System.out.println(user);
        return mes;
        
    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 ZLME@ZLME.COM 举报,一经查实,立刻删除。

留言与评论(共有 0 条评论)
验证码: