返回顶部
首页 > 资讯 > 精选 >Java怎么通过httpclient比较重定向和请求转发
  • 343
分享到

Java怎么通过httpclient比较重定向和请求转发

2023-07-06 04:07:34 343人浏览 八月长安
摘要

本篇内容主要讲解“Java怎么通过Httpclient比较重定向和请求转发”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么通过httpclient比较重定向和请求转发”吧!这里介绍一下

本篇内容主要讲解“Java怎么通过Httpclient比较重定向和请求转发”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么通过httpclient比较重定向和请求转发”吧!

这里介绍一下:HttpClient 4.x 版本,get请求方法会自动进行重定向,而post请求方法不会自动进行重定向,这是要注意的地方。我上次发生错误,就是使用post提交表单登录,当时没有自动重定向。

请求转发和重定向的区别

重定向是两次请求,转发是一次请求,因此转发的速度要快于重定向。

重定向之后地址栏上的地址会发生变化,变化成第二次请求的地址,转发之后地址栏上的地址不会变化,还是第一次请求的地址。

3、转发是服务器行为,重定向是客户端行为。重定向时浏览器上的网址改变 ,转发是浏览器上的网址不变。

4、重定向是两次request,转发只有一次请求。

重定向时的网址可以是任何网址,转发的网址必须是本站点的网址。

这里重点看第三条和第四条。

HTTP报文包含响应码、响应头和响应体。 这里只说 200 和 302. 响应码:2xx(一般是200)。表示请求成功,然后就可以接受响应的数据。 响应码:3xx(一般为302)。表示重定向,服务器会要求客户端重新发送一个请求,服务器会发送一个响应头 Location,它指定了新请求的 URL 地址。(这里很重要!客户端需要通过 Location 头,获取重定向的地址。

这里并没有提及请求转发,因为请求转发是一种服务器端的操作,它是在服务器内部进行操作的,所以就是一次请求(在客户端看和普通的请求没有区别)。而重定向不同,它是客户端的操作,因为服务器要求客户端重新发送一次请求,所以重定向是两次请求。这也解释了为什么重定向后请求参数会丢失,因为根本不是一次请求。我这里说客户端,并不说浏览器,因为我们有时不一定会使用浏览器作为客户端,比如爬虫也是是一个客户端了。

但是,对于刚开始学习的时候,或者对于普通用户来说,似乎感觉不出来二者的区别,最多是可以发现浏览器地址是否改变。请求转发浏览器地址不变,而重定向浏览器地址会变化为新的地址。(但是在这个过程中并未体现重定向的两次请求,这是因为浏览器自动帮我们进行了重定向。)

下面以Java编程来看看二者的区别:上面的第三条和第四条

JAVA WEB 部分

TestServlet 类

提供一个简单的 Servlet 类,它的功能和简单,它会携带一个 key 参数,如果该参数存在且值为 “1”,那么就进行请求转发到 “/dispatcher.jsp” 页面;否则,就重定向到 “redirect.jsp” 页面。

package com.study;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WEBServlet;import javax.servlet.http.httpservlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/TestServlet")public class TestServlet extends HttpServlet {private static final long serialVersionUID = 1L;    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");String key = request.getParameter("key");if((key != null && key.equals("1"))) {System.out.println("请求转发:key " + key);//请求转发request.getRequestDispatcher("/dispatcher.jsp").forward(request,response);}else {//重定向response.sendRedirect("redirect.jsp");System.out.println("重定向:key " + key);}}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}

dispacher.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>请求转发</title></head><body><h2>请求转发</h2></body></html>

redirect.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>重定向</title></head><body><h2>重定向</h2></body></html>

启动项目测试

我这里的目的主要是请求转发和重定向的访问区别,并不是比较它们二者的其它区别,所以示例很简单。

测试请求地址:http://localhost:8080/study/TestServlet?key=1

注意:请求地址无变化。

Java怎么通过httpclient比较重定向和请求转发

测试请求地址:http://localhost:8080/study/TestServlet?key=2 注意:请求地址发生了变化。

Java怎么通过httpclient比较重定向和请求转发

这样的话,是看不出来二者在访问上有什么区别的,但是看不到,不代表它们没有区别,下面通过代码来查看二者在访问方式上的区别。

使用 HttpClient

  • 301 Moved Permanently(永久移动)

  • 302 Found(发现)

  • 303 See Other(查看其他)

  • 307 Temporary Redirect(临时重定向)

由于 HttpClient 4.x 版本会自动重定向,所以我们必须关闭自动重定向,才能跟踪重定向的过程。

在 RequestConfig 里面设置,并设置超时时间(三个)。

//HttpClient4.3中默认允许自动重定向,导致程序中不能跟踪跳转情况。int timeout = 10*1000;RequestConfig config = RequestConfig.custom().setSocketTimeout(timeout).setConnectTimeout(timeout).setConnectionRequestTimeout(timeout).setRedirectsEnabled(false)   //关闭自动重定向,默认值为true。.build();

然后发送请求时,设置并允许自动重定向。

//创建get请求对象HttpGet getMethod = new HttpGet(url);//设置请求方法关闭自动重定向getMethod.setConfig(config);  //配置信息

这样当我们访问路径为:http://localhost:8080/study/TestServlet?key=1

服务器会进行请求转发,但是这是服务器行为,与客户端没有关系,所以我们不用关心,在请求正确的情况下,响应码为 200。

测试结果:

Java怎么通过httpclient比较重定向和请求转发

当我们访问路径为:http://localhost:8080/study/TestServlet?key=2,服务器会要求客户端进行重定向(即要求客户端请求另一个地址),这时会先收到状态码 302,当再次访问成功时状态码为 200(当然了,也许重定向不止一次,但是浏览器会对重定向次数有限制)。

如果发生了重定向,我们需要获取响应头中的 Location 字段,这里面是重定向的地址。

//读取新的 URL 地址Header header = response.getFirstHeader("location");String newUrl = header.getValue();

注意:重定向是可以访问服务器外的地址的,服务器内部的地址一般是相对地址,需要拼接 URL,服务器外就是绝对 URL 了。

测试结果:

Java怎么通过httpclient比较重定向和请求转发

完整测试代码

package com.learn;import java.io.IOException;import org.apache.http.Header;import org.apache.http.HttpEntity;import org.apache.http.HttpStatus;import org.apache.http.ParseException;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;public class TestRedirect {public static void main(String[] args) throws ParseException, IOException {String root = "http://localhost:8080/study/";  //网站的根路径,因为重定向得到的是相对路径(服务器内部的路径)//HttpClient4.3中默认允许自动重定向,导致程序中不能跟踪跳转情况。int timeout = 10*1000;RequestConfig config = RequestConfig.custom().setSocketTimeout(timeout).setConnectTimeout(timeout).setConnectionRequestTimeout(timeout).setRedirectsEnabled(false)   //关闭自动重定向,默认值为true。.build();String url = "http://localhost:8080/study/TestServlet?key=1";  //请求转发。//创建 httpclient 对象CloseableHttpClient httpClient = HttpClients.createDefault();//创建get请求对象HttpGet getMethod = new HttpGet(url);getMethod.setConfig(config);  //配置信息//执行请求,得到响应信息try (CloseableHttpResponse response = httpClient.execute(getMethod)) {HttpEntity entity = null;int statusCode = response.getStatusLine().getStatusCode();System.out.println("返回值状态码:" + statusCode);if (statusCode == HttpStatus.SC_OK) {  //获取请求转发的实体信息entity = response.getEntity();if (entity != null) {System.out.println(EntityUtils.toString(entity, "UTF-8"));}} else if (statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {//读取新的 URL 地址Header header = response.getFirstHeader("location");System.out.println(header);if (header != null) {String newUrl = header.getValue();if (newUrl != null && !newUrl.equals("")) {//使用get方法转向。HttpGet redirectGet = new HttpGet(root+newUrl);System.out.println("重定向到新的地址:" + redirectGet.getURI());redirectGet.setConfig(config);//发送请求,做进一步处理。。。try (CloseableHttpResponse redirectRes = httpClient.execute(redirectGet)) {statusCode = redirectRes.getStatusLine().getStatusCode();System.out.println("返回值状态码:" + statusCode);if (statusCode == HttpStatus.SC_OK) {  //获取请求转发的实体信息entity = redirectRes.getEntity();if (entity != null) {System.out.println(EntityUtils.toString(entity, "UTF-8"));}}}}}} }}}

到此,相信大家对“Java怎么通过httpclient比较重定向和请求转发”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Java怎么通过httpclient比较重定向和请求转发

本文链接: https://lsjlt.com/news/357614.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java通过httpclient比较重定向和请求转发
    目录前言:请求转发和重定向的区别Java web 部分TestServlet 类启动项目测试使用 HttpClient完整测试代码总结前言: 刚开始学习Java的web编程时,都会碰...
    99+
    2023-05-15
    JAVA httpclient httpclient比较重定向 httpclient请求转发
  • Java怎么通过httpclient比较重定向和请求转发
    本篇内容主要讲解“Java怎么通过httpclient比较重定向和请求转发”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么通过httpclient比较重定向和请求转发”吧!这里介绍一下...
    99+
    2023-07-06
  • Java请求转发和请求重定向区别详解
    目录前言1.定义不同2.请求方不同3.数据共享不同4.最终 URL 地址不同5.代码实现不同总结前言 在 Java 中,跳转的实现方式有两种:请求转发和请求重定向,但二者是完全不同的...
    99+
    2024-04-02
  • JAVA中请求转发与重定向
    这篇文章主要讲解了“JAVA中请求转发与重定向”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JAVA中请求转发与重定向”吧!按照功能不同对Servlet进行拆分,每个Servlet只保留一个...
    99+
    2023-06-02
  • JavaWeb中请求转发和请求重定向的区别有哪些
    小编给大家分享一下JavaWeb中请求转发和请求重定向的区别有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!什么是请求转发?请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作。请求转发的特点 浏览器地址栏...
    99+
    2023-06-15
  • JavaWeb中请求转发和请求重定向的区别以及使用
    什么是请求转发? 请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作。 请求转发的特点 1.浏览器地址栏不会发生变化 2.他们一次请求,服务器完成转发操作 3.共享...
    99+
    2024-04-02
  • 使用springboot跳转到指定页面和(重定向,请求转发的实例)
    目录springboot跳转到指定页面controller的写法springboot重定向和请求转发springboot重定向springboot的请求转发springboot转发和...
    99+
    2024-04-02
  • springmvc请求转发和重定向问题(携带参数和不携带参数)
    目录请求转发的三种方式1、传统的请求转发2、SpringMVC中不经过视图解析器的请求转发3、请求转发经过视图解析器重定向1、传统的重定向2、SpringMVC中不带参数的重定向3、...
    99+
    2022-11-13
    springmvc请求转发 springmvc重定向 springmvc请求
  • Delphi通过IdHTTP怎么发送Http请求到Java 后台
    这篇文章将为大家详细讲解有关Delphi通过IdHTTP怎么发送Http请求到Java 后台,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。##########################...
    99+
    2023-06-04
  • SpringMVC中的转发和重定向怎么掌握
    这篇文章主要介绍“SpringMVC中的转发和重定向怎么掌握”,在日常操作中,相信很多人在SpringMVC中的转发和重定向怎么掌握问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringMVC中的转发和重...
    99+
    2023-07-05
  • jQuery怎么通过Ajax向PHP服务端发送请求并返回JSON数据
    这篇文章主要介绍“jQuery怎么通过Ajax向PHP服务端发送请求并返回JSON数据”,在日常操作中,相信很多人在jQuery怎么通过Ajax向PHP服务端发送请求并返回JSON数据问题上存在疑惑,小编查...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作