分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

Http协议相关内容

发布时间:2023-09-06 01:10责任编辑:傅花花关键词:暂无标签

1纯文本的表单:

1:get请求,通过url明文传递参数,不安全而且参数大小有限制。在servlet中可以使用如下代码获取参数字符串:

 ???protected void doGet(HttpServletRequest request, HttpServletResponse response) ???????????throws ServletException, IOException { ???????String queryString = request.getQueryString(); ???????System.out.println(queryString); ???}

打印内容:

name=GET_NAME&password=GET_PASSWORD //表单只有两个属性

2:post请求,对于上传数据必须使用post请求,理论上讲,POST是没有大小限制的。HTTP协议规范也没有进行大小限制,起限制作用的是服务器的处理程序的处理能力。post请求如下方法获取请求参数:

 ???protected void doPost(HttpServletRequest request, HttpServletResponse response) ???????????throws ServletException, IOException { ???????// 1. 获取表单数据流 ???????InputStream in = request.getInputStream(); ???????// 2. 转换流 ???????InputStreamReader inStream = new InputStreamReader(in, "UTF-8"); ???????// 3. 缓冲流 ???????BufferedReader reader = new BufferedReader(inStream); ???????// 输出数据 ???????String str = null; ???????while ((str = reader.readLine()) != null) { ???????????System.out.println(str); ???????} ???????// 关闭 ???????reader.close(); ???????inStream.close(); ???????in.close(); ???}

同一个表单打印数据如下:

name=POST_NAME&password=POST_PASSWORD

2上传数据的表单:

必须使用post方法,而且form必须设置enctype="multipart/form-data"属性,例如:

 ???<div align="center"> ???????<form action="fileLoad" method="post" enctype="multipart/form-data"> ???????????Name:<input name="name" type="text" /> <br> ???????????Password:<input type="file" name="uploadfile" /><br> ???????????<button type="submit">发送</button> ???????</form> ???</div>

表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据。

此时如果后台还是按照前面post获取数据的方式直接使用流获取数据的话,你会发现上传的文件错误,错误示例代码:

 ???/** ????* 上传文件损坏 ????* @param request ????* @param response ????* @throws Exception ????*/ ???public static void uploadError(HttpServletRequest request, HttpServletResponse response) throws Exception { ???????// 上传错误:没能过滤掉一些控制信息 ???????InputStream in = request.getInputStream(); //这个流是所有的表单字段数据和文件数据的总和 ???????byte[] b = new byte[1024]; ???????FileOutputStream out = new FileOutputStream( ???????????????new File("servlet-fileupload.avi")); ???????int bytesRead = 0; ???????while ((bytesRead = in.read(b)) > 0) { //此处我们将所有数据都认为是上传数据,所以导致上传文件损坏 ???????????out.write(b, 0, bytesRead); ???????????out.flush(); ???????} ???????out.flush(); ???????out.close(); ???????in.close(); ???????System.out.println("完毕!"); ???}

切记:以上是错误示例!!!

下面是一个正确的示例:

 ???protected void doPost(HttpServletRequest request, HttpServletResponse response) ???????????throws ServletException, IOException { ???????//判断是一个多媒体内容 ???????if (ServletFileUpload.isMultipartContent(request)) { ???????????try { ???????????????DiskFileItemFactory factory = new DiskFileItemFactory(); ???????????????factory.setSizeThreshold(MEMORY_THRESHOLD); ???????????????ServletFileUpload upload = new ServletFileUpload(factory); ???????????????// 设置最大文件上传值 ???????????????upload.setFileSizeMax(MAX_FILE_SIZE); ???????????????List<FileItem> items = upload.parseRequest(request); ???????????????????????????????for (int i = 0, size = items.size(); i < size; i++) { ???????????????????FileItem item = items.get(i); ???????????????????if (!item.isFormField()) {// isFormField: true表示是表单的一个属性,false表示一个上传文件 ???????????????????????File file = new File("upload-daxin.flv");//文件名可以使用上传文件的实际名称,示例就略过了 ???????????????????????item.write(file); ???????????????????} ???????????????} ???????????} catch (Exception e) { ???????????????e.printStackTrace(); ???????????} ???????} ???}

写的相对简单,总要分享的是思路。多多包涵!

Http协议相关内容

原文地址:http://www.cnblogs.com/leodaxin/p/7509889.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved