zoukankan      html  css  js  c++  java
  • java Http编程小结

    1:什么是HTTP?

    超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议。
    HTTP在客户端和服务器之间以request-response protocol(请求-回复协议)工作。

    2:get 与post

    get只有一个流,参数附加在url后,地址行显示要传送的信息,大小个数有严格限制且只能是字符串。
    post的参数是通过另外的流传递的, 不通过url,所以可以很大,也可以传递二进制数据,如文件的上传。

    1、安全

    GET调用在URL里显示正传送给SERVLET的数据,这在系统的安全方面可能带来问题,例如用户名和密码等

    POST就可以在一定程度上解决此类问题

    2、服务器接收方式

    服务器随机接受GET方法的数据,一旦断电等原因,服务器也不知道信息是否发送完毕

    而POST方法,服务器先接受数据信息的长度,然后再接受数据

    3、form运行方式

    当form框里面的method为get时,执行doGet方法
    当form框里面的method为post时,执行doPost方法

    4、容量限制

    GET方法后面的信息量字节大小不要超过1.3K,而Post则没有限制

    最后说明的是:

    你可以用service()来实现,它包含了doget和dopost ;service方法是接口中的方法,servlet容器把所有请求发送到该方法,该方法默认行为是转发http请求到doXXX方法中,如果你重载了该方法,默认操作被覆盖,不再进行转发操作!

    service()是在javax.servlet.Servlet接口中定义的,   在   javax.servlet.GenericServlet  
        中实现了这个接口,   而   doGet/doPost   则是在   javax.servlet.http.HttpServlet   中实现的,   javax.servlet.http.HttpServlet   是   javax.servlet.GenericServlet   的子类.  
       
      所有可以这样理解,   其实所有的请求均首先由   service()   进行处理,   而在   javax.servlet.http.HttpServlet   的   service()   方法中,   主要做的事情就是判断请求类型是   Get   还是   Post,   然后调用对应的   doGet/doPost   执行.

    3:HTTP编程

    1>:使用get方式获取服务器端的一张图片,放在本地==》获取服务器的东西用get方式更好

    package get;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class HttpUtil
    {
    
        /**
         * 使用get方式获取服务器端的一张图片
         * @throws IOException 
         */
        public static InputStream getInputStream(String path) throws IOException
        {
            URL url = new URL(path);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            //设置请求方式
            con.setRequestMethod("GET");//默认请求方式是get
            //设置连接超时时间
            con.setConnectTimeout(5000);
            //设置可以从服务器端读取数据
            con.setDoInput(true);//默认值就是true
            
            InputStream in = null;
            //判断服务器端的响应码是否是200
            if(con.getResponseCode()==200)
            {
                in = con.getInputStream();
            }
            return in;
        }
        
        public static void makeImg(InputStream in) throws IOException
        {
            FileOutputStream fos = new FileOutputStream("file\img.jpg");
            byte[] b = new byte[1024];
            int len = 0;
            //读取服务器返回的图片数据
            while ((len = in.read(b))!=-1)
            {
                fos.write(b,0,len);
                
            }
            fos.close();
            in.close();
            
        }
    }
    面向对象代码
    package get;
    
    import java.io.IOException;
    
    public class Test
    {
    
        public static void main(String[] args) throws IOException
        {
            String path ="http://localhost:9999/day16/img2.jpg";
            HttpUtil.makeImg(HttpUtil.getInputStream(path));
        }
    
    }
    客户端

    2:使用post方式提交用户名和密码,并获取服务器端的验证结果==》需要返回数据就用post,服务器端代码上篇博客中有

    package post;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    
    
    public class HttpUtil
    {
        public static String sendByPost(String path,Map<String,String> params,String encode) throws ClientProtocolException, IOException
        {
            //先把要提交的每对儿数据封装成NameValuePair类型的
            List<NameValuePair> list = new ArrayList<NameValuePair>();
            
            for(Map.Entry<String, String> en:params.entrySet())
            {
                list.add(new BasicNameValuePair(en.getKey(),en.getValue()));
            }
            //把要提交的数据组织成提交的格式
            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, encode);
            //创建提交方式对象
            HttpPost post = new HttpPost(path);
            post.setEntity(entity);
            //创建执行提交的对象
            HttpClient client = new DefaultHttpClient();
            
            //执行提交
            HttpResponse response = client.execute(post);
            if(response.getStatusLine().getStatusCode()==200)
            {
                InputStream in = response.getEntity().getContent();
                return getResult(in,encode);
            }
            return null;
        }
    
        private static String getResult(InputStream in, String encode) throws IOException {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] arr = new byte[1024];
            int len = 0;
            while((len = in.read(arr))!=-1)
            {
                bos.write(arr,0,len);
            }
            return new String(bos.toByteArray(),encode);
        }
    }
    面向对象代码
    package post;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    public class Test
    {
    
        /**
         * @param args
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException
        {
            Map<String,String> params = new HashMap<String, String>();
            params.put("username", "李鹏");
            params.put("pwd","123456");
            String path = "http://localhost:9999/day16/servlet/LoginServlet";
            String encode= "utf-8";
            System.out.println(HttpUtils.sendByPost(path, params, encode));
    
        }
    
    }
    客户端

    3:使用apache中jar包提供的简洁方法提交用户名和密码,并获取服务器端的验证结果

    package apache;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    
    public class HttpUtil {
        
        public static String sendByPost(String path,HashMap<String,String> params,String encode) throws ClientProtocolException, IOException
        {
            //先把要提交的每对儿数据封装成NameValuePair类型的
            List<NameValuePair> list = new ArrayList<NameValuePair>();
            
            for(Map.Entry<String, String> en:params.entrySet())
            {
                list.add(new BasicNameValuePair(en.getKey(),en.getValue()));
            }
            //把要提交的数据组织成提交的格式
            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, encode);
            //创建提交方式对象
            HttpPost post = new HttpPost(path);
            post.setEntity(entity);
            //创建执行提交的对象
            HttpClient client = new DefaultHttpClient();
            
            //执行提交
            HttpResponse response = client.execute(post);
            if(response.getStatusLine().getStatusCode()==200)
            {
                InputStream in = response.getEntity().getContent();
                return getResult(in,encode);
            }
            return null;
        }
    
        private static String getResult(InputStream in, String encode) throws IOException {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] arr = new byte[1024];
            int len = 0;
            while((len = in.read(arr))!=-1)
            {
                bos.write(arr,0,len);
            }
            return new String(bos.toByteArray(),encode);
        }
    
    }
    面向对象代码
    package appache;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    public class Test
    {
    
        /**
         * @param args
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException
        {
            Map<String,String> params = new HashMap<String, String>();
            params.put("username", "李鹏");
            params.put("pwd","123456");
            String path = "http://localhost:9999/day16/servlet/LoginServlet";
            String encode= "utf-8";
            System.out.println(HttpUtil.sendByPost(path, params, encode));
    
        }
    
    }
    客户端代码

     4:使用apach上传文件

    package com.qianfeng.upload;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.mime.FormBodyPart;
    import org.apache.http.entity.mime.MultipartEntity;
    import org.apache.http.entity.mime.content.FileBody;
    import org.apache.http.entity.mime.content.StringBody;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    import org.json.JSONObject;
    
    /**
     * 该类实现文件上传的功能
     * @author qq
     *
     */
    public class FileUpload {
        
        public void fileUpload(final String path,
                               final File file,
                               final HashMap<String,String> params,
                               final String encode,
                               final CallBack callBack)
        {
            //在一个子线程中实现文件上传
            new Thread(new Runnable(){
                @Override
                public void run() {
                    
                    HttpPost post = new HttpPost(path);
                    HttpClient client = new DefaultHttpClient();
                    HttpResponse response = null;
                    
                    //把上传的文件和上传的参数组织成表单提交的格式
                    MultipartEntity entity = new MultipartEntity();
                    //处理上传的文件
                    FileBody  body = new FileBody(file);
                    FormBodyPart bodyPart = new FormBodyPart("form",body);
                    
                    entity.addPart(bodyPart);
                    
                    //处理上传的参数
                    for(Map.Entry<String, String> en:params.entrySet())
                    {
                        try {
                            entity.addPart(en.getKey(), new StringBody(en.getValue()));
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }
                    }
                    post.setEntity(entity);
                    try {
                        //执行提交
                        response = client.execute(post);
                        if(response.getStatusLine().getStatusCode()==200){
                            String result = EntityUtils.toString(response.getEntity());
                            JSONObject obj = new JSONObject(result);
                            callBack.getResult(obj);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    
                    
                }
            }).start();
        }
    }
    
    //定义回调接口
    interface CallBack
    {
        public void getResult(JSONObject obj);
    }
    FileUpload
    package com.qianfeng.upload;
    
    import java.io.File;
    import java.util.HashMap;
    
    import org.json.JSONObject;
    
    public class Test {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            
            String path = "http://localhost:8080/FileUploadServer/servlet/UploadServlet";
            
            HashMap<String,String> params = new HashMap<String,String>();
            params.put("username", "admin");
            params.put("password", "123");
            
            File file = new File("file\tou1.jpg");
            
            FileUpload fileUpload = new FileUpload();
            fileUpload.fileUpload(path, file, params, "utf-8", new CallBack(){
    
                @Override
                public void getResult(JSONObject obj) {
                    System.out.println(obj.toString());
                }
            });
            
            
    
        }
    
    }
    Test
  • 相关阅读:
    CodeSmith中SchemaExplorer属性的介绍
    Bugku-INSERT INTO 注入
    XCTF-PHP2
    网络安全实验室CTF-注入关
    XSS挑战
    SQL注入
    CTFHub-技能树-命令执行
    CTFHub-技能树-文件上传
    史上最难的一道Java面试题 (分析篇)
    高可用的一些思考和理解
  • 原文地址:https://www.cnblogs.com/lipeng0824/p/4725443.html
Copyright © 2011-2022 走看看