精华内容
下载资源
问答
  • Java请求转发请求重定向

    万次阅读 多人点赞 2018-02-10 00:14:05
    请求转发请求重定向

    一、请求转发和请求重定向的区别
    请求转发和请求重定向又分别称为服务器跳转和客户端跳转

    1.1、组件之间可否共享信息不同(本质区别)
    当客户端向服务器发送请求时,服务器收到请求后,会将请求封装成一个HttpServletRequest对象request,并且所有的请求参数都封装在request对象中,这个对象时Jsp的内置对象可以直接在Jsp中使用。服务器收到请求后,还需要请求别的页面,这是就有两种方式:请求转发和请求重定向。

    所谓请求转发,是服务器的行为,请求由服务器转发给另外一个页面处理,如何转发,何时转发,转发几次,客户端是不知道的。请求转发时,从发送第一次到最后一次请求的过程中,web容器只创建一次request和response对象,新的页面继续处理同一个请求。也可以理解为服务器将request对象在页面之间传递。

    所谓请求重定向,是客户端的行为,每次请求重定向都是由客户端发起的,也就是说重定向一次,就刷新request对象的属性,之前的request对象的属性值就失效了。

    1.2、浏览器地址栏显示不同(表面区别)

    请求转发之后地址栏的信息并不会有任何的改变。
    请求重定向之后地址栏是会改变的,变为跳转之后的页面地址。

    二、Java实现
    2.1 Java中的请求转发(服务器跳转)
    执行到跳转语句时就会立刻进行跳转

    Java代码:

    request.getRequestDispatcher("success.jsp").forward(request,response);

    在jsp页面中你也会看到通过下面的方式实现转发:

    <jsp:forward page="success.jsp" />

    2.2 Java中的请求重定向(客户端跳转)

    1. response.sendRedirect("apage.jsp"); 不能传递request 范围的属性 ,但是可以通过地址重写的方式向跳转页传递参数,因为该方法执行完之后就相当于一次http request 的结束,这是服务器会向客户端发送302 状态码和新的url ,告诉客户端重新发送request 请求到新的url ,然后客户端照此执行,执行即新的请求响应流程开始,服务器再重新创建HttpServletRequest 对象和HttpServletResponse 对象,此时两个请求已经不在一个线程了,所以request 和response 对象都不是开始的那个了;
    2. response.setHeader("refresh","2;URL=index.jsp") 2 秒后跳转到其他页面;
    3. <a href="http://www.baidu.com"> 百度</a> 超链接
    4. 表单提交

    三、路径问题

    转发和重定向的URLString前有加 / 为绝对路径 反之为相对路径

    3.1绝对路径
    1、重定向的 / 表示:http://服务器ip:端口/

    response.sendRedirect("/Manager/index.jsp")

    生成的地址:web服务器本身地址+参数生成完整的URL 即:http://localhost:8080/Manager/index.jsp

    2、请求转发的 / 表示:http://服务器ip:端口/项目名

    request.getRequestDispatcher("/index.jsp").forward(request, response); 

    生成的地址:http://localhost:8080/项目名/index.jsp

    重定向是浏览器发来的,只知道发到某个服务器,但是不知道发到服务器的哪个project,所以需要自己用代码声明; 而请求转发是服务器某个project内部的转发,转来转去都是在某个project内部,所以不需要手动声明项目名。

    3.2 相对路径

    假设通过表单请求指定的Url资源 action="LoginServlet"
    则表单生成的请求地址为:http://localhost:8080/项目名/LoginServlet

    1、请求重定向:response.sendRedirect("Manager/index.jsp")
    生成相对路径:http://localhost:8080/项目名/Manager/index.jsp
    2、请求转发:相对路径情况下生成的完整URL与重定向方法相同。

    展开全文
  • Java Web 请求转发请求重定向

    千次阅读 2017-06-04 14:23:35
    Java Web 请求转发请求重定向

    Java Web 请求转发与请求重定向

    请求转发

    服务器行为,即用户向服务器发送了一次http请求,该请求可能会经过多个信息资源处理以后菜返回给用户,各个信息资源使用请求转发机制互相转发请求,但是用户是感觉不到请求转发的。通过request.getRequestDispatcher(path).forward(arg0, arg1)实现,是一次请求,转发后对象会保存,地址栏的url不会改变。

    这里写图片描述

    请求重定向

    客户端行为。一般用于避免用户的非正常访问。例如:用户在没用登录的情况下访问后台资源,servlet可以将该http请求重定向到登录页面,让用户登陆后再访问。通过调用response.sendRedirect(arg0)实现,从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的url会改变。

    这里写图片描述

    二者的原理及区别是什么?

    答:Forward和Redirect代表了两种请求方式:请求转发和请求重定向。对应到代码里,分别是RequestDispatcher类的forward()方法和HttpServletRequest类的sendRedirect()方法。

    对于请求转发,客户端浏览器只发出一次请求,Servlet把请求转发给Servlet、HTML、JSP或其它信息资源,由第2个信息资源响应该请求,两个信息资源共享同一个request对象。

    对于请求重定向,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。它本质上是两次HTTP请求,对应两个request对象。

    展开全文
  • java web http请求转发

    千次阅读 2013-08-12 22:25:38
    java web,如何获取request中的请求参数呢? /*** * Get request query string * @param request * @return byte[] */ public byte[] getRequestStr(HttpServletRequest request){ int contentLength = ...

    java web,如何获取request中的请求参数呢?

    /***
    	 * Get request query string
    	 * @param request
    	 * @return   byte[]
    	 */
    	public byte[] getRequestStr(HttpServletRequest request){
    		int contentLength = request.getContentLength();
    		byte buffer[] = new byte[contentLength];
    		for (int i = 0; i < contentLength;) {
    			try {
    
    				int readlen = request.getInputStream().read(buffer, i,
    						contentLength - i);
    				if (readlen == -1) {
    					break;
    				}
    				i += readlen;
    			} catch (IOException ioexception) {
    				ioexception.printStackTrace();
    			} finally {
    				// logger.info("Json Request:" + requestPacket);
    			}
    		}
    		return buffer;
    	}

    上述方法返回的是byte数组。

    下面的方法直接返回字符串:

    /***
    	 * Get request query string
    	 * 
    	 * @param request
    	 * @return
    	 * @throws UnsupportedEncodingException
    	 */
    	public String getRequestStr(HttpServletRequest request) throws UnsupportedEncodingException{
    		byte buffer[]=getRequestBytes(request);
    		String charEncoding=request.getCharacterEncoding();
    		if(charEncoding==null){
    			charEncoding="UTF-8";
    		}
    		return new String(buffer,charEncoding);
    	}

    应用:上述方法一般用于在filter(javax.servlet.Filter)中获取请求参数,进行转发

    java web中,重写response应答体(响应体),如何往应答体中写入指定内容呢?

    /***
    	 * Send http request
    	 * 
    	 * @param response
    	 * @param bytes  :字节数组
    	 * @param contentType  :if is null,default value is  "application/json"
    	 * @param encoding   :  编码方式
    	 * @throws IOException
    	 */
    	public static void sendRequestWriter(HttpServletResponse response, byte[] bytes,
    			String contentType,String encoding) throws IOException {
    		response.setContentLength(bytes.length);
    		if (contentType == null) {
    			contentType = "application/json";
    		}
    		response.setContentType(contentType);
    
    		PrintWriter printer = response.getWriter();
    		printer.println(new String(bytes,encoding));
    		printer.flush();
    		printer.close();
    	}
    	
    	/***
    	 * 
    	 * @param response
    	 * @param sendData   :<code>String</code>
    	 * @param contentType
    	 * @param encoding : such as GBK/utf-8
    	 * @throws IOException
    	 */
    	public static void sendRequestWriter(HttpServletResponse response, String sendData,
    			String contentType,String encoding) throws IOException {
    //		response.setContentLength(sendData.getBytes(encoding).length);
    		byte[]bytes=sendData.getBytes(encoding);
    		sendRequestWriter(response, bytes, contentType, encoding);
    	}
    

     以上方法都是使用PrintWriter来写入response的。

    下面的方式是使用流的方式写入response:

    /***
    	 * test ok
    	 * @param response
    	 * @param bytes
    	 * @param contentType
    	 * @param encoding
    	 * @throws IOException
    	 */
    	public static void sendRequestStream(HttpServletResponse response, byte[] bytes,
    			String contentType) throws IOException {
    		response.setContentLength(bytes.length);
    		if (contentType == null) {
    			contentType = "application/json";
    		}
    		response.setContentType(contentType);
    
    		ServletOutputStream sos = response.getOutputStream();
    		sos.write(bytes, 0, bytes.length);
    		sos.flush();
    		sos.close();
    	}

     应用:用于在网关中进行请求转发和响应。





    展开全文
  • JAVA HTTP POST转发请求

    2019-11-19 10:48:15
    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.URI; import java.net.URISyntaxException; import java.net...

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.URI;
    import java.net.URISyntaxException;
    import java.net.URL;
    import java.net.URLConnection;
    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.config.RequestConfig;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.utils.URIBuilder;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;

    @Service
    public class HttpService {

        // 创建HttpClient对象
        @Autowired(required = false)
        private CloseableHttpClient httpClient;

        /* @Autowired(required = false)表示的含义是,spring容器里面有这个bean就注入,没有就不注入。 */

        // 请求信息的配置
        @Autowired(required = false)
        private RequestConfig requestConfig;

        /**
         * 执行Get请求
         * 
         * @param url
         * @return 请求到的内容
         * @throws URISyntaxException
         * @throws IOException
         * @throws ClientProtocolException
         */
        public String doGet(String url) throws URISyntaxException, ClientProtocolException, IOException {

            return doGet(url, null);

        }

        /**
         * @param url
         * @param intoParams 请求中的参数
         * @return 请求到的内容
         * @throws URISyntaxException
         * @throws ClientProtocolException
         * @throws IOException
         */
        public String doPost(String url) throws URISyntaxException, ClientProtocolException, IOException {

            return doPost(url, null);

        }

        /**
         * 执行Get请求
         * 
         * @param url
         * @param params 请求中的参数
         * @return 请求到的内容
         * @throws URISyntaxException
         * @throws IOException
         * @throws ClientProtocolException
         */
        public String doGet(String url, Map<String, Object> params) throws URISyntaxException, ClientProtocolException, IOException {
            // 定义请求的参数
            URI uri = null;
            if (params != null) {
                URIBuilder builder = new URIBuilder(url);
                for (Map.Entry<String, Object> entry : params.entrySet()) {
                    builder.addParameter(entry.getKey(), String.valueOf(entry.getValue()));
                }
                uri = builder.build();
            }

            // 创建http GET请求
            HttpGet httpGet = null;
            if (uri != null) {
                httpGet = new HttpGet(uri);
            } else {
                httpGet = new HttpGet(url);
            }
            // 设置请求参数
            httpGet.setConfig(this.requestConfig);

            // 请求的结果
            CloseableHttpResponse response = null;
            try {
                // 执行请求
                response = httpClient.execute(httpGet);
                // 判断返回状态是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    // 获取服务端返回的数据,并返回
                    return EntityUtils.toString(response.getEntity(), "UTF-8");
                }
            } finally {
                if (response != null) {
                    response.close();
                }
            }
            return null;
        }

        /**
         * @param url
         * @param params 请求中的参数
         * @return 请求到的内容
         * @throws URISyntaxException
         * @throws ClientProtocolException
         * @throws IOException
         */
        public String doPost(String url, Map<String, Object> params)
                throws URISyntaxException, ClientProtocolException, IOException {
            // url = GlobalUtil.getValue("remoteAddress") + url;
            // 设置post参数
            List<NameValuePair> parameters = null;
            // 构造一个form表单式的实体
            UrlEncodedFormEntity formEntity = null;
            // 定义请求的参数
            if (params != null) {
                // 设置post参数
                parameters = new ArrayList<NameValuePair>();

                for (Map.Entry<String, Object> entry : params.entrySet()) {
                    // 添加参数
                    parameters.add(new BasicNameValuePair(entry.getKey(), String.valueOf(entry.getValue())));

                }
                // 构造一个form表单式的实体
                formEntity = new UrlEncodedFormEntity(parameters);
            }

            // 创建HTTP GET请求
            HttpPost httpPost = null;

            if (formEntity != null) {

                httpPost = new HttpPost(url);
                // 将请求实体设置到httpPost对象中
                httpPost.setEntity(formEntity);
                // 伪装浏览器请求
                httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36");
            } else {
                httpPost = new HttpPost(url);
                // 伪装浏览器请求
                httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36");
            }
            // 设置请求参数
            httpPost.setConfig(this.requestConfig);
            // 请求的结果
            CloseableHttpResponse response = null;
            try {
                // 执行请求
                response = httpClient.execute(httpPost);
                // 判断返回状态是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    // 获取服务端返回的数据,并返回
                    return EntityUtils.toString(response.getEntity(), "UTF-8");

                }
            } finally {

                if (response != null) {

                    response.close();

                }

            }

            return null;

        }

        /**使用post以“raw-JSON(application/json)”类型推送数据
         * @param url
         * @param params 请求中的参数
         * @return 请求到的内容
         * @throws URISyntaxException
         * @throws ClientProtocolException
         * @throws IOException
         */
        public String httpPostWithJSON(String url, Map<String, Object> params) throws URISyntaxException, ClientProtocolException, IOException {

            CloseableHttpClient client = HttpClients.createDefault();
            // 设置post参数
            StringEntity entity = null;
            // 构造一个form表单式的实体
            // 定义请求的参数
            if (params != null) {
                // 设置post参数
                String json = JSON.toJSONString(params);// map转String
                JSONObject jsonObject = JSON.parseObject(json);// String转json
                entity = new StringEntity(jsonObject.toString(), "utf-8");// 解决中文乱码问题
                entity.setContentEncoding("UTF-8");
                entity.setContentType("application/json");
            }

            // 创建HTTP GET请求
            HttpPost httpPost = new HttpPost(url);

            httpPost.setEntity(entity);

            try {
                // 执行请求
                HttpResponse response = client.execute(httpPost);
                // 判断返回状态是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    // 获取服务端返回的数据,并返回
                    return EntityUtils.toString(response.getEntity(), "UTF-8");

                }
            } finally {

                if (client != null) {

                    client.close();

                }

            }

            return null;

        }

        /**
         * 使用post以“x-www-form-urlencoded”类型推送数据
         * 
         * @param url
         * @param params 请求中的参数
         * @return 请求到的内容
         */
        public String httpSendPost(String url, Map<String, Object> params) {
            StringBuffer resultBuffer = null;
            // 构建请求参数
            StringBuffer sbParams = new StringBuffer();
            if (params != null && params.size() > 0) {
                for (Map.Entry<String, Object> e : params.entrySet()) {
                    sbParams.append(e.getKey());
                    sbParams.append("=");
                    sbParams.append(e.getValue());
                    sbParams.append("&");
                }
            }
            URLConnection con = null;
            OutputStreamWriter osw = null;
            BufferedReader br = null;
            try {
                URL realUrl = new URL(url);
                // 打开和URL之间的连接
                con = realUrl.openConnection();
                // 设置通用的请求属性
                con.setRequestProperty("accept", "*/*");
                con.setRequestProperty("connection", "Keep-Alive");
                con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                con.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                // 发送POST请求必须设置如下两行
                con.setDoOutput(true);
                con.setDoInput(true);
                // 获取URLConnection对象对应的输出流
                osw = new OutputStreamWriter(con.getOutputStream(), "utf-8");
                if (sbParams != null && sbParams.length() > 0) {
                    // 发送请求参数
                    osw.write(sbParams.substring(0, sbParams.length() - 1));
                    // flush输出流的缓冲
                    osw.flush();
                }
                // 定义BufferedReader输入流来读取URL的响应
                resultBuffer = new StringBuffer();
                int contentLength = Integer.parseInt(con.getHeaderField("Content-Length"));
                if (contentLength > 0) {
                    br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"));
                    String temp;
                    while ((temp = br.readLine()) != null) {
                        resultBuffer.append(temp);
                    }
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                if (osw != null) {
                    try {
                        osw.close();
                    } catch (IOException e) {
                        osw = null;
                        throw new RuntimeException(e);
                    }
                }
                if (br != null) {
                    try {
                        br.close();
                    } catch (IOException e) {
                        br = null;
                        throw new RuntimeException(e);
                    }
                }
            }
            return resultBuffer.toString();
        }

    }
     

    展开全文
  • Java Http请求转发

    2017-07-07 01:06:19
    大神们 指点一下.........................................................
  • java 后台构造http转发请求

    千次阅读 2014-06-16 14:25:55
    public void request(String requestUri, String msg) throws IOException { // 设置请求参数 String url = E3_ROOT_URL + requestUri;...// 1、构造http请求包 BasicHttpParams httpParams
  • Java 发送http请求

    千次阅读 2018-07-04 20:33:48
    发送GET方法的请求 /** * 向指定URL发送GET方法的请求 * * @param url * 发送请求的URL * @param param * 请求参数,格式:name1=value1&amp;amp;name2=value2 * @return String 响应结果 ...
  • java 反向代理 转发请求

    千次阅读 2020-01-02 16:41:04
    package com.example.demo; import java.io.IOException; import java.io.UnsupportedEncodingException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax...
  • JAVA发送HTTP请求方式总结

    万次阅读 多人点赞 2018-05-30 14:40:21
    java 发送HTTP请求方式总结 源代码:http://github.com/lovewenyo/HttpDemo 1. HttpURLConnection 使用JDK原生提供的net,无需其他jar包; HttpURLConnection是URLConnection的子类,提供更多的方法,...
  • 深入浅出Java 重定向和请求转发的区别

    万次阅读 多人点赞 2014-04-08 07:58:08
    客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的student_list.jsp,整个流程都是在服务器端完成的...
  • Java代理HTTP请求

    千次阅读 2018-06-08 10:00:40
    Proxy(Proxy.Type.HTTP,address); URLConnection connection = mapAPI.openConnection(proxy); isr = new InputStreamReader(connection.getInputStream(), "utf-8" ); json=IOUtils.toString(isr); } ...
  • 请求转发整个跳转请求一次。 重定向整个跳转请求两次。 2.地址是否变化 请求转发地址栏不发生变化。 重定向地址栏发生变化。 3.语法不同。 请求转发:req.getRequestDispatcher(...
  • JAVA发送HTTP请求(https SSL)实现案例

    万次阅读 多人点赞 2018-01-18 19:42:00
    可以用做http工具类,供大家参考,欢迎大家一起交流学习, 下面我直接贴代码,如下: import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io....
  • import com.actionsoft.bpms.util.UUIDGener; import ... import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.a...
  • Java Web之重定向和请求转发 概述 重定向和请求转发Java Web中常用的两种实现页面跳转的技术,他们之间有一定区别。本文使用tomcat+jsp演示他们的区别 区别 先通过代码来直观感受一下,请求转发和重定向的区别: ...
  • JAVA后台发送http请求

    千次阅读 2019-01-19 15:26:21
    JAVA后台发送http请求 代码: @RequestMapping("/check") @ResponseBody public Map check(Integer cashRecordId,Integer status,Integer clientId) { Map map = new HashMap&lt;&gt;(); ...
  • HTTP通信中的请求转发请求重定向

    千次阅读 2015-08-14 19:21:22
     在HTTP通信和Java Web开发中,经常会用到请求转发请求重定向,它们两个有很大的区别:  首先,请求转发是指:一个Web资源在收到一个客户端的请求后,去掉用另外一个资源进行处理,这个过程请称为请求转发。很...
  • Java获取转发后的真实请求IP

    千次阅读 2020-03-10 17:20:06
    解决方法 使用Nginx、Apache、Squid等进行HTTP代理或者负载均衡时,会在请求头中添加x-forwarded-for字段(戳我get新知识),如果有多个转发,那么最后值为如下格式: x-forwarded-for: client1,proxy1,proxy2,...
  • Java发送HTTP POST/GET请求

    万次阅读 2018-11-28 10:34:40
    使用java.net包发送HTTP POST和GET请求Java代码如下: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; ...
  • 第一节 页面跳转 ...客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器--》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址...
  • 请求转发请求包含

    千次阅读 2018-08-12 14:32:32
    Servlet 容器的作用是负责处理客户请求,当Servlet 容器获取到用户请求后,调用某个Servlet,并把Servlet 的执行结果返回给用户。  Servlet 容器的工作流程:  ● 当用户请求某个资源时,Servlet 容...
  • 1.获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数 1.String getParameter(String name):根据参数名称获取参数值 username=zhangsan&password=123 2.String[] ...
  • 使用RestTemplate实现http请求转发代理转发 在做微服务和单独集成等同构异构的项目过程中,可能会遇到做代理转发、请求转发等相关的功能,下面的代码(项目片段demo代码)可能具有一定的参与功能 下面代码仅供参考,...
  • request.getRequestDispatcher()....1.地址栏request请求转发:浏览器地址栏不发生变化 forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户机并不知道; response重定向:地址栏路径发生改变
  • 请求转发请求重定向的区别

    千次阅读 2018-09-28 21:42:12
    1.1 什么是请求转发页面跳转: package com.sunny.test; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet....
  • package com.test.porxy... import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import jav...
  • 本文超详细的介绍了请求重定向、请求转发请求包含的特点和区别,并使用一个小栗子结合丰富的图片文字来让读者更容易理解;并且配合代码、chrome调试工具来讲解三者的同与异。最后,通过一张表格,详细的列举了这三...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 117,538
精华内容 47,015
关键字:

java转发http请求

java 订阅