欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HttpServletRequest和HttpServletResponse

程序员文章站 2022-06-19 11:23:34
...

**

1. HttpServletRequest

每次请求service()方法,都会由容器创建一个新的对象

HttpServletRequest和HttpServletResponse
HttpServletRequest 是专用于HTTP协议的ServletRequest 子接口,它用于封装 HTTP 请求消息。
在 service() 方法内部调用 HttpServletRequest 对象的各种方法来获取请求消息。

Request的功能

  • 接收用户的参数
getParameter(String)方法
	根据名字获取一个参数,返回类型为String
getParameterValues (String)方法
	根据名字获取一组相关的数据,返回类型为String[]
getParameterNames ()方法 
	获取所有参数的名字,返回类型为Enumeration
 getParameterMap ()方法 
	获取所有数据,,返回类型为Map

  • 接收用户的所有请求头信息

获取请求行的相关信息HttpServletRequest和HttpServletResponse

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  resp.setContentType("text/html;charset=uTF-8");
  PrintWriter out = resp.getWriter();
  out.print("请求类型:"+req.getMethod()+"<br/>");
  out.print("请求协议:"+req.getProtocol()+"<br/>");
  out.print("请求地址:"+req.getRequestURI()+"<br/>");
  out.print("你的ip:"+req.getRemoteAddr()+"<br/>");
  out.print("请求:"+req.getQueryString()+"<br/>");
  out.print("请求主机:"+req.getHeader("Host")+"<br/>");
  out.print("请求来自哪里:"+req.getHeader("Referer")+"<hr/>");
  //以下获取所有头信息
  Enumeration<String> en = req.getHeaderNames();
  while(en.hasMoreElements()){
    String key = en.nextElement();
    out.print(key+"=="+req.getHeader(key)+"<br/>");
  }
}
getRemoteAddr方法返回发出请求的客户机的IP地址,其格式为“192.168.0.3”这种形式的字符文本。 (*) 
getRemoteHost方法返回发出请求的客户机的完整主机名。
getRemotePort方法返回发出请求的客户机所使用的网络接口的端口号。
getLocalAddr方法返回WEB服务器上接收当前请求的网络接口的IP地址。
getLocalName方法返回WEB服务器上接收当前请求的网络接口的IP地址所对应的主机名。
getLocalPort方法返回WEB服务器上接收当前请求的网络接口的端口号。
getServerName方法返回当前请求所指向的主机名。 
getServerPort方法返回当前请求所连接的服务器端口号。
getScheme方法返回请求的协议名,例如http、https或ftp。
getRequestURL方法返回客户端发出请求时的完整URL。   

常用的是getHeader(“Rerfer”),用于防止盗链接,所谓盗链接就是直接访问servlet,防盗链接代码如下(卸载doget或dopost中):

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  String refer = req.getHeader("Referer");
  resp.setContentType("text/html;charset=utf-8");
  if(refer==null){
    resp.getWriter().print("请先去首页,<a href='index.jsp'>这是链接</a>");
  }else{
    resp.getWriter().print("图片:<img src='imgs/a.jpg'/>");
  }
}

HttpServletRequest和HttpServletResponse

  • 转发、包含
  • 做为域对象也可以存放数据

2. 请求转发

转发:将请求在服务器内部交给另一个组件再去指行,同时共享request中的连接
HttpServletRequest和HttpServletResponse
转发的实现:A转发给BHttpServletRequest和HttpServletResponse
如果以 “/” 开始是指 项目的上下文根, http://127.0.0.1:8081/Servlet03 里面的 ‘/Servlet03’ (转发建议以‘’/‘’开始)
如果没有以’/'开始,则是指从当前这个servlet所在的目录下来找这个资源

转发的实现逻辑图:
HttpServletRequest和HttpServletResponse

存储在ServletRequest对象中的属性称之为请求域属性,属于同一个请求的多个处理模块之间可以通过请求域属性来传递对象数据。
与请求域属性相关的方法:
setAttribute方法
getAttribute方法
removeAttribute方法
getAttributeNames方法

3. HttpServletResponse

HttpServletResponse是专用于HTTP协议的ServletResponse子接口,它用于封装HTTP响应消息。

字符流输出
方法:resp.getWiter() :  PrintWriter
如果仅是输出 html信息,文本信息,则就可以使用字符。

4. 请求重定向

就是将请求发送回浏览器。然后由浏览器再重新向服务器自动的发送一个请求。web资源受到客户端请求后,通知客户端去访问另外一个web资源

HttpServletRequest和HttpServletResponse
HttpServletRequest和HttpServletResponse
路径问题:重定向的路径以以“/”开头,则是相对于整个WEB站点的根目录,而不是相对于当前WEB应用程序的根目录。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
请求转发和请求重定向:请求转发发出来一次请求,重定向发出来两次请求
请求转发:request.getRequestDispatcher(转发地址).forward(request, response);
地址栏不变,还是请求的地址栏。
在最终的servlet中,request对象和中转的request对象是同一个对象
路径String path = “/testServlet”;中/表示根目录(当前web应用)(地址栏开头到工程名)http://localhost:8080/sss
只能转发到当前web应用(当前项目)
重 定 向:response.sendRedirect(重定向地址);
地址栏改变,地址栏变成最后一次请求的地址栏。
在最终的servlet中,request对象和中转的request对象不是同一个对象
路径String path = “/testServlet”;中/表示站点(地址栏开头到工程名前的部分)http://localhost:8080
可以转发到外部资源

**