传智播客学习日记Day13

来源:互联网 发布:mac sed命令应用 编辑:程序博客网 时间:2024/06/05 18:58

今天第十三天,给我们上课的是吴老师,他为我们讲解了防止重复提交,验证码,文件的上传和下载。

防止重复提交

重复提交的体现有三种:

1.      由于服务器缓慢或网络延迟的愿意重复点击提交按钮

2.      已经提交成功,重复刷新页面造成的重复提交

3.      提交成功,但是回退又点击了提交造成的重复提交

以下不是重复提交:

回退后,有刷新页面,不是重复提交,而是重新发送了一次请求。

在firefox下,重复提交到同一地址是无效的,而IE浏览器则有效

那么我们怎么解决重复提交呢?

当我们使用request.getRequestDispatcher.forward()转发是,浏览器所保留URL是先前提交表单的地址,此时重复刷新时会造成表单的重复提交。解决方法:1.使用HttpServletResponse.sendRedirect()跳转的方式,浏览器所保留URL地址是所跳转的地址。2.使用javaScript语言,在页面定义一个boolean类型的全局变量,用来判断表单是否是第一次提交,如果是则页面的按钮点击提交无效,并且按钮不能被点击。

以上两种方式:都能解决forward造成的重复刷新页面造成的重复提交,但是不能解决回退造成的重复提交。

4.      利用session来防止重复提交:服务程序在form表单的一个隐藏字段中设置一个标识,在当前用户的Session中保存这个一个标识。当用户提交Form表单时,负责接收这一请求的服务器程序比较form表单隐藏字段中的标识号与存储在当前用户的Session域中的标识是否相同,如果相同则处理表单数据,处理完后清理当前用户的Session域中存储的标识符。

以下情况服务器程序忽略提交的表单请求:

当前用户的session中不存在表单标识号。

用户提交的表单数据中没有标识号字段。

Session中的标识符与当前表单不一致。

利用session实现一次性验证码:

1.使用验证码可以限制人们利用工具软件来暴力破解密码。验证码的实现原理与session防止表单重复提交的原理基本一样,只是将表单标识符改为验证码的形式。

2.IE7 firefox验证码改变反映的问题:

可能是因为新旧图片地址都是一样的,导致浏览器读缓存。

解决方法:

改写javaScript代码:

Function nextpic(){

Var img=document.getElementById(“pic”);

Img_src=”${pageContext.request.contextPath}/imageServlet?”+math.random();

这样每次访问的地址都不同。

}

          文件上传

 

1.在表单中使用表单元素:<input type=”file”/>

2.设置表单的enctype属性(将数据发送到服务器时浏览器使用的编码类型)的值为:multipart/form-data。表示以二进制传输数据。application/x-www-form-urlencoded为默认值,这种方案使用有限的字符集。

3.文件上传的两种方法:一种基于Commons-fileupload 组件。一种基于Servlet3.0.

第一种:需要用到commons-fileupload-1.2.2.jarcommons-io-1.4.jar两个jar包。

Commons-fileupload组件上传的基本原理 :

FileUpload组件将页面提交的所有元素(普通form表单域,如text和文件域file)看作一个个的FileItem对象,FileUpload组件可以解析该request,并返回一个一个的FileItem。而对每一个FileItem,FileUpload组件可以判断出它是普通form表单域还是文件file域,从而根据不同的类型,采取不同的操作--如果是表单域,就读出其值,如果是文件域,就保存文件到服务器硬盘上或者内存中。

 

文件下载

1情景:在一些网络系统中,需要隐藏下载文件的真实地址,或者下载的文件需要一个程序来动态的确定后在传送给客户端

2方案:利用程序编码实现下载

•     可以增加安全访问控制,只对经过授权认证的用户提供下载

•     可以从任意位置提供下载的数据

3.利用程序实现下载需要设置 2 个报头:

Web 服务器需要告诉浏览器其所输出的内容的类型不是普通的文本文件或 HTML 文件,而是一个要保存到本地的下载文件。设置Content-Type的值为:application/x-msdownload

Web 服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置 Content-Disposition 报头。该报头指定了接收程序处理数据内容的方式,在 HTTP 应用中只有 attachment 是标准方式,attachment 表示要求用户干预。在 attachment 后面还可以指定 filename 参数,该参数是服务器建议浏览器将实体内容保存到文件中的文件名称。在设置 Content-Dispostion 之前一定要指定 Content-Type

4.因为要下载的文件可以是各种类型的文件,所以要将文件传送给客户端,其相应内容应该被当做二进制来处理,所以应该调用                               方法返回ServletOutputStream 对象来向客户端写入文件内容。                       

 

 

原创粉丝点击