分享web开发知识

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

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

HttpServletRequest

发布时间:2023-09-06 02:29责任编辑:胡小海关键词:暂无标签

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,

一个为代表请求的request和代表响应response。

service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,

HttpServletRequest是ServletRequest的子接口。

request的运行流程

通过抓包工具抓取Http请求

通过request获得请求行

获得客户端的请求方式:String getMethod()

获得请求的资源:

String getRequestURI()

StringBuffer getRequestURL()

String getContextPath()

---web应用的名称

String getQueryString() ---- get提交url地址后的参数字符串

username=zhangsan&password=123

注意:request获得客户机(客户端)的一些信息

request.getRemoteAddr() --- 获得访问的客户端IP地址

通过request获得请求头

long getDateHeader(String name)

String getHeader(String name)

Enumeration getHeaderNames()

Enumeration getHeaders(String name)

int getIntHeader(String name)

public class HeadServlet extends HttpServlet { ???public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ???????//1.获取指定的头 ???????String header=request.getHeader("User-Agent"); ???????System.out.println(header); ???????//2.获取所有头的名称 ???????Enumeration<String> headerNames=request.getHeaderNames(); ???????while(headerNames.hasMoreElements()){ ???????????String headerName=headerNames.nextElement(); ???????????String headerValue=request.getHeader(headerName); ???????????System.out.println(headerName+"..."+headerValue); ???????} ???????????}

referer头的作用:执行该此访问的的来源

做防盗链

 代码演示:

//获取refer的信息 ???????String refer=request.getHeader("referer"); ???????//对referer进行判断 ???????response.setContentType("text/html;charset=utf-8"); ???????if(refer!=null&&refer.startsWith("http://localhost")){ ???????????response.getWriter().write("一、京东重创中国网络零售商京东创始人刘强东涉嫌犯罪事态升级。" ???????????????????+ "明尼拿波里斯警察局发言人埃尔德(John Elder)接受电话采访表示,刘强东涉嫌强暴重罪"); ???????}else{ ???????????response.getWriter().write("你是盗链者,可耻"); ???????} ???}

通过request获得请求体

String getParameter(String name)

String[] getParameterValues(String name)

Enumeration getParameterNames()

Map<String,String[]> getParameterMap()

代码演示:

package com.oracle.demo01;import java.io.IOException;import java.util.Map;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ContentServlet extends HttpServlet { ???public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ???????//获取单个值 ???????String username=request.getParameter("username"); ???????System.out.println(username); ???????//获取指定表单元素的value值 ???????String[] hobbys=request.getParameterValues("hobby"); ???????for(String h:hobbys){ ???????????System.out.println(h); ???????} ???????//获取所有参数并封装到一个Map<String,String[]>中 ???????Map<String,String[]> map=request.getParameterMap(); ???????for(Map.Entry<String, String[]> entry:map.entrySet()){ ???????????//参数name值 ???????????System.out.println(entry.getKey()); ???????????//参数value值(String[]) ???????????for(String str:entry.getValue()){ ???????????????System.out.println(str); ???????????} ???????????System.out.println("--------------------------------------"); ???????} ???} ???public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ???????doGet(request, response); ???}

  注意:get请求方式的请求参数 上述的方法一样可以获得

     解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");

     解决get提交的方式的乱码:

          parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

 

request是一个域对象

request对象也是一个存储数据的区域对象,所以也具有如下方法:

setAttribute(String name, Object o)

getAttribute(String name)

removeAttribute(String name)

注意:request域的作用范围:一次请求中

request完成请求转发

获得请求转发器----path是转发的地址

RequestDispatcher getRequestDispatcher(String path)通过转发器对象转发requestDispathcer.forward(ServletRequest  request, ServletResponse response)

 代码演示:

public class Servlet01 extends HttpServlet { ???public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ???????//往域对象中设置值 ???????request.setAttribute("name","zhangsan"); ???????//请求转发到Servlet02 ???????request.getRequestDispatcher("/Servlet02").forward(request, response);; ???}}public class Servlet02 extends HttpServlet { ???public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ???????String name=(String)request.getAttribute("name"); ???????response.getWriter().write(name); ???}}

注意:ServletContext域与Request域的生命周期比较?

   ServletContext

     创建:服务器启动

     销毁:服务器关闭

     域的作用范围:整个web应用

   request

     创建:访问时创建request

     销毁:响应结束request销毁

     域的作用范围:一次请求中

 

注意:转发与重定向的区别?

    1)重定向两次请求,转发一次请求---

    2)重定向地址栏的地址变化,转发地址不变

    3)重新定向可以访问外部网站转发只能访问内部资源

    4)转发的性能要优于重定向

 

总结:

request获得行的内容

      request.getMethod()

      request.getRequestURI()

      request.getRequestURL()

      request.getContextPath()

      request.getRemoteAddr()

request获得头的内容

      request.getHeader(name)

request获得体(请求参数)

      String request.getParameter(name)

      Map<String,String[]> request.getParameterMap();

      String[] request.getParameterValues(name);

      注意:客户端发送的参数 到服务器端都是字符串

 

 获得中文乱码的解决:

post:request.setCharacterEncoding(“UTF-8”); ?get:parameter = new String(parameter.getBytes(“iso8859-1”),”UTF-8”); request转发和域 ?????request.getRequestDispatcher(转发的地址).forward(req,resp); ?????request.setAttribute(name,value) ?????request.getAttribute(name)

HttpServletRequest

原文地址:https://www.cnblogs.com/qq1312583369/p/10258414.html

知识推荐

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