java:详解http模块request对象

文章目录

    • 背景
    • 继承关系
    • 获取数据request
      • 获取请求行数据
      • 获取请求头数据
      • 获取请求体数据
    • 示例:防盗链
    • 其他功能
      • 获取请求参数通用方式
      • 请求转发
      • 共享数据
      • 获取ServletContext

背景

在 Java 中,HTTP 模块的 request 对象和 response 对象分别表示客户端向服务器发送请求和服务器向客户端发送响应时使用的对象。

继承关系

ServletRequest		--	接口|   继承
HttpServletRequest	-- 接口|	实现
org.apache.catalina.connector.RequestFacade 类(tomcat)

获取数据request

request 对象包含有关客户端请求的信息,例如请求方法、请求 URL、请求头、请求体等,其中常用的属性和方法包括:

获取请求行数据

  1. 获取请求方式 :GET

    • String getMethod()
  2. (*)获取虚拟目录:/day14

    • String getContextPath()
  3. 获取Servlet路径: /demo1

    • String getServletPath()
  4. 获取get方式请求参数:name=zhangsan

    • String getQueryString()
  5. (*)获取请求URI:/day14/demo1

    • String getRequestURI(): /day14/demo1

    • StringBuffer getRequestURL():http://localhost/day14/demo1

    • URL:统一资源定位符 : http://localhost/day14/demo1

    • URI:统一资源标识符 : /day14/demo1

  6. 获取协议及版本:HTTP/1.1

    • String getProtocol()
  7. 获取客户机的IP地址:

    • String getRemoteAddr()

以下是一个简单的 Java Servlet 示例,演示如何使用 request 对象处理 HTTP 请求和响应:

package cn.xxx.web.request;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 演示Request对象获取请求行数据*/@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*1. 获取请求方式 :GET* String getMethod()2. (*)获取虚拟目录:/day14* String getContextPath()3. 获取Servlet路径: /requestDemo1* String getServletPath()4. 获取get方式请求参数:name=zhangsan* String getQueryString()5. (*)获取请求URI:/day14/demo1* String getRequestURI():		/day14/requestDemo1* StringBuffer getRequestURL()  :http://localhost/day14/requestDemo16. 获取协议及版本:HTTP/1.1* String getProtocol()7. 获取客户机的IP地址:* String getRemoteAddr()*///1. 获取请求方式 :GETString method = request.getMethod();System.out.println(method);//2.(*)获取虚拟目录:/day14String contextPath = request.getContextPath();System.out.println(contextPath);//3. 获取Servlet路径: /demo1String servletPath = request.getServletPath();System.out.println(servletPath);//4. 获取get方式请求参数:name=zhangsanString queryString = request.getQueryString();System.out.println(queryString);//5.(*)获取请求URI:/day14/demo1String requestURI = request.getRequestURI();StringBuffer requestURL = request.getRequestURL();System.out.println(requestURI);System.out.println(requestURL);//6. 获取协议及版本:HTTP/1.1String protocol = request.getProtocol();System.out.println(protocol);//7. 获取客户机的IP地址:String remoteAddr = request.getRemoteAddr();System.out.println(remoteAddr);}
}

获取请求头数据

  • (*)String getHeader(String name):通过请求头的名称获取请求头的值
  • Enumeration<String> getHeaderNames():获取所有的请求头名称
package cn.xxx.web.request;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//演示获取请求头数据//1.获取所有请求头名称Enumeration<String> headerNames = request.getHeaderNames();//2.遍历while(headerNames.hasMoreElements()){String name = headerNames.nextElement();//根据名称获取请求头的值String value = request.getHeader(name);System.out.println(name+"---"+value);}}
}
package cn.xxx.web.request;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;@WebServlet("/requestDemo3")
public class RequestDemo3 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//演示获取请求头数据:user-agentString agent = request.getHeader("user-agent");//判断agent的浏览器版本if(agent.contains("Chrome")){//谷歌System.out.println("谷歌来了...");}else if(agent.contains("Firefox")){//火狐System.out.println("火狐来了...");}}
}

获取请求体数据

只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数。

  1. 获取流对象
    * BufferedReader getReader():获取字符输入流,只能操作字符数据

    • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据(在文件上传知识点后讲解)
  2. 再从流对象中拿数据

package cn.xxx.web.request;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;@WebServlet("/requestDemo5")
public class RequestDemo5 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求消息体--请求参数//1.获取字符流BufferedReader br = request.getReader();//2.读取数据String line = null;while((line = br.readLine()) != null){System.out.println(line);}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

示例:防盗链

package cn.xxx.web.request;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//演示获取请求头数据:refererString referer = request.getHeader("referer");System.out.println(referer);//http://localhost/day14/login.html//防盗链if(referer != null ){if(referer.contains("/day14")){//正常访问// System.out.println("播放电影....");response.setContentType("text/html;charset=utf-8");response.getWriter().write("播放电影....");}else{//盗链//System.out.println("想看电影吗?来优酷吧...");response.setContentType("text/html;charset=utf-8");response.getWriter().write("想看电影吗?来优酷吧...");}}}
}

其他功能

获取请求参数通用方式

不论get还是post请求方式都可以使用下列方法来获取请求参数

  1. String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
  2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
  3. Enumeration getParameterNames():获取所有请求的参数名称
  4. Map<String,String[]> getParameterMap():获取所有参数的map集合
package cn.xxx.web.request;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;@WebServlet("/requestDemo6")
public class RequestDemo6 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post 获取请求参数//根据参数名称获取参数值String username = request.getParameter("username");/* System.out.println("post");System.out.println(username);*///根据参数名称获取参数值的数组String[] hobbies = request.getParameterValues("hobby");/*for (String hobby : hobbies) {System.out.println(hobby);}*///获取所有请求的参数名称Enumeration<String> parameterNames = request.getParameterNames();/*while(parameterNames.hasMoreElements()){String name = parameterNames.nextElement();System.out.println(name);String value = request.getParameter(name);System.out.println(value);System.out.println("----------------");}*/// 获取所有参数的map集合Map<String, String[]> parameterMap = request.getParameterMap();//遍历Set<String> keyset = parameterMap.keySet();for (String name : keyset) {//获取键获取值String[] values = parameterMap.get(name);System.out.println(name);for (String value : values) {System.out.println(value);}System.out.println("-----------------");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//get 获取请求参数
/*//根据参数名称获取参数值String username = request.getParameter("username");System.out.println("get");System.out.println(username);*/this.doPost(request,response);}
}

中文乱码问题:
* get方式:tomcat 8 已经将get方式乱码问题解决了
* post方式:会乱码
解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);

package cn.xxx.web.request;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;@WebServlet("/requestDemo7")
public class RequestDemo7 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.设置流的编码request.setCharacterEncoding("utf-8");//获取请求参数usernameString username = request.getParameter("username");System.out.println(username);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

请求转发

一种在服务器内部的资源跳转方式

  1. 步骤:

    1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
    2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
  2. 特点:

    1. 浏览器地址栏路径不发生变化
    2. 只能转发到当前服务器内部资源中。
    3. 转发是一次请求
package cn.xxx.web.request;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/requestDemo8")
public class RequestDemo8 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo8888被访问了。。。");//转发到demo9资源
/*RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo9");requestDispatcher.forward(request,response);*///存储数据到request域中request.setAttribute("msg","hello");request.getRequestDispatcher("/requestDemo9").forward(request,response);//request.getRequestDispatcher("http://www.xxx.cn").forward(request,response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

共享数据

  • 域对象:一个有作用范围的对象,可以在范围内共享数据
  • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
  • 方法:
    1. void setAttribute(String name,Object obj):存储数据
    2. Object getAttitude(String name):通过键获取值
    3. void removeAttribute(String name):通过键移除键值对
package cn.xxx.web.request;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/requestDemo9")
public class RequestDemo9 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取数据Object msg = request.getAttribute("msg");System.out.println(msg);System.out.println("demo9999被访问了。。。");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

获取ServletContext

ServletContext getServletContext()

package cn.xxx.web.request;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/requestDemo10")
public class RequestDemo10 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext = request.getServletContext();System.out.println(servletContext);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python序列类型

序列&#xff08;Sequence&#xff09;是有顺序的数据列&#xff0c;Python 有三种基本序列类型&#xff1a;list, tuple 和 range 对象&#xff0c;序列&#xff08;Sequence&#xff09;是有顺序的数据列&#xff0c;二进制数据&#xff08;bytes&#xff09; 和 文本字符串&…

Android BatteryManager的使用及BatteryService源码分析

当需要监控系统电量时&#xff0c;用 BatteryManager 来实现。 参考官网 监控电池电量和充电状态 获取电池信息 通过监听 Intent.ACTION_BATTERY_CHANGED 广播实现&#xff0c;在广播接收器中获取电池信息。 这是个粘性广播&#xff0c;即使过了广播发出的时间点后再注册广…

从零起步:学习数据结构的完整路径

文章目录 1. 基础概念和前置知识2. 线性数据结构3. 栈和队列4. 树结构5. 图结构6. 散列表和哈希表7. 高级数据结构8. 复杂性分析和算法设计9. 实践和项目10. 继续学习和深入11. 学习资源12. 练习和实践 &#x1f389;欢迎来到数据结构学习专栏~从零起步&#xff1a;学习数据结构…

Java实现根据短连接获取1688商品详情数据,1688淘口令接口,1688API接口封装方法

要通过1688的API获取商品详情数据&#xff0c;您可以使用1688开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例&#xff0c;展示如何通过1688开放平台API获取商品详情属性数据接口&#xff1a; 首先&#xff0c;确保您已注册成为1688开放平台的开发者&#xf…

研华I/O板卡 Win10+Qt+Cmake 开发环境搭建

文章目录 一.研华I/O板卡 Win10QtCmake 开发环境搭建 一.研华I/O板卡 Win10QtCmake 开发环境搭建 参考这个链接安装研华I/O板卡驱动程序系统环境变量添加研华板卡dll Qt新建一个c项目 cmakeList.txt中添加研华库文件 cmake_minimum_required(VERSION 3.5)project(advantechDA…

设计模式(23种)简介

什么是设计模式&#xff1f; 设计模式&#xff08;Design pattern&#xff09;是解决特定问题的一系列套路&#xff0c;是前辈们的代码设计经验的总结。设计模式针对的是面向对象的语言。多态是设计模式的灵魂。 设计模式的优点&#xff1a; 可以提高程序员的思维能力、编程能…

【多线程】Thread类的用法

文章目录 1. Thread类的创建1.1 自己创建类继承Thread类1.2 实现Runnable接口1.3 使用匿名内部类创建Thread子类对象1.4 使用匿名内部类创建Runnable子类对象1.5 使用lambda创建 2. Thread常见的构造方法2.1 Thread()2.2 Thread(Runnable target)2.3 Thread(String name)2.4 Th…

软考高级系统架构设计师系列论文九十四:论计算机网络的安全性设计

软考高级系统架构设计师系列论文九十四:论计算机网络的安全性设计 一、计算机网络安全性设计相关知识点二、摘要三、正文四、总结一、计算机网络安全性设计相关知识点 软考高级系统架构设计师:计算机网络

全国三网话费充值优惠接口源码文档分享

话费充值接口文档 接口版本&#xff1a;1.0 ―、引言 文档概述 本文档提供话费充值接口规范说明&#xff0c;提供一整套的完整的接入示例(http 接口)供商户参 考&#xff0c;可以帮助商户开发人员快速完成接口开发与联调&#xff0c;实现与话费充值系统的交易互联。 公司官网…

Flink_state 的优化与 remote_state 的探索

摘要&#xff1a;本文整理自 bilibili 资深开发工程师张杨&#xff0c;在 Flink Forward Asia 2022 核心技术专场的分享。本篇内容主要分为四个部分&#xff1a; 相关背景state 压缩优化Remote state 探索未来规划 点击查看原文视频 & 演讲PPT 一、相关背景 1.1 业务概况 从…

【EI检索稳定】第六届电力电子与控制工程国际学术会议(ICPECE 2023)

第六届电力电子与控制工程国际学术会议 2023 6th International Conference on Power Electronics and Control Engineering (ICPECE 2023) 第六届电力电子与控制工程国际学术会议由广西大学主办&#xff0c;重庆大学、华东交通大学、长春理工大学、大连交通大学联合主办。电…

【AI模型】gym强化学习仿真平台配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍gym强化学习仿真平台配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&…

Linux内核学习(十)—— 块 I/O 层(基于Linux 2.6内核)

目录 一、剖析一个块设备 二、缓冲区和缓冲区头 三、bio 结构体 四、请求队列 五、I/O 调度程序 系统中能够随机&#xff08;不需要按顺序&#xff09;访问固定大小数据片&#xff08;chunks&#xff09;的硬件设备称作块设备&#xff0c;这些固定大小的数据片就称作块。最…

为什么会形成缓存雪崩?缓存雪崩解决方案

什么是缓存雪崩 缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库&#xff0c;瞬间耗尽数据库资源&#xff0c;导致数据库无法使用。 造成缓存雪崩问题的原因是是大量key拥有了相同的过期时间&#xff0c;比如对课程信息设置缓存过期时间为10分钟&#xff0…

回归预测 | MATLAB实现WOA-RBF鲸鱼优化算法优化径向基函数神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现WOA-RBF鲸鱼优化算法优化径向基函数神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现WOA-RBF鲸鱼优化算法优化径向基函数神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#…

大数据、AI和云原生:引领未来软件开发的技术演进

文章目录 **1. 数据驱动的创新&#xff1a;****2. 智能化应用的兴起&#xff1a;****3. 云原生的敏捷和可扩展性&#xff1a;****4. 实时性和即时性&#xff1a;****5. 数据隐私和安全&#xff1a;****6. 跨平台和跨设备&#xff1a;****7. 自动化和智能编程&#xff1a;****8.…

【Hello Algorithm】最大线段重合及加强堆

本篇博客简介&#xff1a;介绍加强堆 加强堆 最大线段重合问题加强堆 计算时间复杂度的技巧 一般来说 我们在刷算法的时候都要求C/C语言在1到2s之内完成 java这种语言在2到4秒之内完成 而与之对应的指令条数就是 十的八次方 左右 不会超过一个数量级 所以说根据上面的结论 我…

607. 销售员

import pandas as pddef sales_person(sales_person: pd.DataFrame, company: pd.DataFrame, orders: pd.DataFrame) -> pd.DataFrame:try:# 找到名为 "RED" 的公司的 com_idred_company_id company[company[name] RED][com_id].values[0]# 找到与名为 "RE…

Redis 高可用与集群

Redis 高可用与集群 虽然 Redis 可以实现单机的数据持久化&#xff0c;但无论是 RDB 也好或者 AOF 也好&#xff0c;都解决 不了单点宕机问题&#xff0c;即一旦单台 redis 服务器本身出现系统故障、硬件故障等问题后&#xff0c; 就会直接造成数据的丢失&#xff0c;因此需要…

Unity中的数学基础——贝塞尔曲线

一&#xff1a;前言 一条贝塞尔曲线是由一组定义的控制点P0到 Pn&#xff0c;n1为线性&#xff0c;n2为二次......第一个和最后一个控制点称为起点和终点&#xff0c;中间的控制点一般不会位于曲线上 获取两个点之间的点就是通过线性插值&#xff08; Mathf.Lerp&#xff09…