HttpServletRequest、通过request获得请求头、请求体等、解决中文乱码等问题

1、HttpServletRequest概述:

我们在创建Servlet时,会重写service()方法、doGet()\、doPost()方法,这些方法都有两个参数request(请求)和response(响应),service中的request是ServletRequset,而

doGet()和doPost()方法中的是:HttpServletRequest,HttpServletRequest是ServletRequest的子接口。

2、request的运行流程:

3、通过request获得请求行

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

String method=request。getMethod()

(2)获得请求资源:

String URI=request。getRequestURI();

String  URL=request.getRequestURL();

(3)获得WEB应用的名称

String   webname=request.getContextPath();

(4)get提交url地址后的参数字符串

String queryString=request.getQueryString();

(5)获得访问的客户端IP地址

String ip=request.getRemoteAddr();

4.通过request获得请求头

(1)获取请求头
String agent=request.getHeader("User-Agent");

(2)

获取所有请求头名称
Enumeration<String> headerNames=request.getHeaderNames();
while(headerNames.hasMoreElements()){
//获取每个请求头名称
String headerName=headerNames.nextElement();
//跟距请求头获取请求值
String value=request.getHeader(headerName);
System.out.println(headerName);
System.out.println(value);

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

做防盗链跳转

1package servlet; 2 3import java.io.IOException; 4import javax.servlet.ServletException; 5import javax.servlet.http.HttpServlet; 6import javax.servlet.http.HttpServletRequest; 7import javax.servlet.http.HttpServletResponse; 8 9public class ReferServlet extends HttpServlet { 10//防盗链 11 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 12 //获取请求头中的referer 13 String referer=request.getHeader("referer"); 14 //不是以"http://localhosr:8080"开头的不能访问 15 if(referer!=null&&referer.startsWith("http://localhosr:8080")){ 16 //认为可以正常访问 17 //结觉中文乱码 18 response.setContentType("text/html;charset=utf-8"); 19 response.getWriter().write("啊啊啊啊啊啊啊啊"); 20 }else{ 21 response.setContentType("text/html;charset=utf-8"); 22 response.getWriter().write("不不不不不不不不不不不不不不不不不不不不不不不不"); 23 } 24 } 25 26 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 27 doGet(request, response); 28 } 29}

5.通过request获得请求体解决中文乱码等问题

获取表单元素的值:String username=request.getParameter("username");

获取表单所有元素的值:Map<String,String[]> map=request.getParameterMap();

1package servlet; 2 3import java.io.IOException; 4import java.util.Map; 5import java.util.Set; 6 7import javax.servlet.ServletException; 8import javax.servlet.http.HttpServlet; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11 12public class BodyServlet extends HttpServlet { 13 14 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 15 //post方式解决中文乱码 16 request.setCharacterEncoding("utf-8"); 17 //获取表单元素的值、 18 //get方式结觉中文乱码问题 19 String username=request.getParameter("username"); 20 //username=new String 21 //(username.getBytes("iso8859-1"),"utf-8"); 22 23 String password=request.getParameter("password"); 24 System.out.println(username+"..."+password); 25 //获取表单所有元素的值 26 Map<String,String[]> map=request.getParameterMap(); 27 Set<String> set=map.keySet(); 28 for(String s:set){ 29 String key=s; 30 String[] value=map.get(s); 31 //遍历数组 32 for(String s1:value){ 33 System.out.println(s+":"+s1); 34 } 35 } 36 } 37 38 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 39 doGet(request, response); 40 } 41}

6、request是一个域对象

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

setAttribute(xxxx, xxxxxxxxxxx)

getAttribute(String name)

removeAttribute(String name)

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

7、request完成请求转发

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

RequestDispatcher getRequestDispatcher(String path)

通过转发器对象转发

**requestDispathcer.**forward(ServletRequest request, ServletResponse response)

 转发:

1package servlet; 2 3import java.io.IOException; 4import javax.servlet.ServletException; 5import javax.servlet.http.HttpServlet; 6import javax.servlet.http.HttpServletRequest; 7import javax.servlet.http.HttpServletResponse; 8 9public class Servlet01 extends HttpServlet { 10 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 11 //向request中内放值 12 request.setAttribute("name","小红帽"); 13 //请求转发 14 request.getRequestDispatcher("/Servlet02").forward(request, response); 15 response.getWriter().write("servlet01"); 16 } 17 18 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 19 doGet(request, response); 20 } 21} 22 23package servlet; 24 25import java.io.IOException; 26import javax.servlet.ServletException; 27import javax.servlet.http.HttpServlet; 28import javax.servlet.http.HttpServletRequest; 29import javax.servlet.http.HttpServletResponse; 30 31public class Servlet02 extends HttpServlet { 32 33 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 34 String name=(String) request.getAttribute("name"); 35 //解决中文乱码 36 response.setContentType("text/html;charset=utf-8"); 37 response.getWriter().write("servlet02"+name); 38 } 39 40 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 41 doGet(request, response); 42 } 43}

 

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前