web笔记五:request和response

本文详细介绍了HTTP请求中的HttpServletRequest对象及响应中的HttpServletResponse对象的使用方法。涵盖了如何获取客户端请求的各种信息,如参数、路径、客户端详情等,以及如何设置响应头、编码、重定向等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面已经说到,当客户端向服务器发起请求时,容器会将请求有关的信息封装成一个HttpServletRequest,将输出信息封装成一个HttpServletResponse。

一、 HttpServletRequest对象

其中最常用的就是获取参数,不过现在有了spring和struct,就很少直接使用这个方法了。

System.out.println("parameter name:"+request.getParameter("name"));

获取请求的信息

System.out.println("uri:"+request.getRequestURI());
System.out.println("context path:"+request.getContextPath());
System.out.println("servlet path:"+request.getServletPath());
System.out.println("path info:"+request.getPathInfo());
System.out.println("Scheme:"+request.getScheme());
System.out.println("请求方式:"+request.getMethod());
System.out.println("ServerPort:"+request.getServerPort());
System.out.println("LocalPort:"+request.getLocalPort());

System.out.println("url:"+request.getRequestURL());
//post请求需要用到request.getInputStream()从请求体拿到参数字符串
//get请求使用request.getInputStream()拿不到任何东西
System.out.println("URL问号(?)后面的参数字符串:"+request.getQueryString());

获取客户端信息

System.out.println("浏览器信息:"+request.getHeader("User-Agent"));
System.out.println("RemoteHost:"+request.getRemoteHost());
System.out.println("RemoteAddr():"+request.getRemoteAddr());
System.out.println("RemotePort:"+request.getRemotePort());

获取session和cookie信息

Cookie[] cookies = request.getCookies();
HttpSession session = request.getSession();

其他

request.getRequestDispatcher("").forward(request, response);//转发

首先我们来看下getRequestURI和getRequestURL的区别,Request URI = context path + servlet path + path info,不包含协议(scheme)和主机(host)信息(但我看API有说明在http1.0中get请求会返回全路径),所以,如果我们需要获取全路径,则最好调用getRequestURL。

contextPath是web应用名称,servletPath和pathInfo在<url-pattern></url-pattern>设置为/*或/会有区别。假设我们的contextPath为helloweb,请求http://localhost:8080/helloweb/abc

设置<url-pattern>/*</url-pattern>时:

servlet path:
path info:/abc

设置<url-pattern>/</url-pattern>时:

servlet path:/abc
path info:null

由此可以看出,url-pattern为/时pathInfo为null,url-pattern为/*时servletPath为空(不是null)

getServerPort和getLocalPort:
在一般情况下getServerPort和getLocalPort是一样的,区别就在于ServerPort就是URL中的host里冒号(:)后面的部分,是明显可以确定的,但是LocalPort是请求实际到达的端口,有时候不一定跟ServerPort相同。

关于获取客户端信息的getRemoteXXX方法,拿到的不一定是发起请求的客户端的信息,如果中间经过代理(例如Apache,Squid,Nginx等反向代理软件)的话,返回的信息是最后一个代理服务器的。获取真实的客户端的信息在这里就不阐述了,有需要的可以找度娘。

二、HttpServletResponse对象

输出:

PrintWriter writer = response.getWriter();//字符流
ServletOutputStream outputStream = response.getOutputStream();//字节流

设置编码(防止乱码)

response.setCharacterEncoding("utf-8");
response.setHeader("contentType", "text/html; charset=utf-8");
//相当于执行上面两条
response.setContentType("text/html;charset=UTF-8");

会话保持

String encodeURL=response.encodeRedirectURL(url);//返回值仅用于sendRedirect
response.sendRedirect(encodeURL);
response.encodeURL("");

设置header、cookie

//下载文件
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
//设置cookie
response.addCookie(cookie);

关于response.setContextType(),默认为html/text,点击这里查看更多的MIME类型。

对于sendRedirect来说,如果客户端禁用了cookie,为了保持会话,我们需要先使用encodeRedirectURL对URL进行处理,此时处理后的URL后面会自动拼接加上jsessionid信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值