首先说一下Http协议
(HTTP,HyperText Transfer Protocol)超文本传输协议, 是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。
HTTP协议规范了传输信息的内容和格式
1).启动浏览器;
2).按F12,启动:调试模式,网络(NetWork)
3).刷新网页,重新发送请求。
4).可以查看请求信息:
GET /资源路径 HTTP/1.1
请求头:一堆内容,作为了解即可
Host: localhost:9090 (服务器的域名) Connection: keep-alive (网络连接是持久的) Content-Length: 12 (发送数据的大小,单位字节) Cache-Control: max-age=0 (设置缓存数据的存活时间,单位秒) Origin: http://localhost:9090 (指示了请求来自于哪个站点——服务器名称) Upgrade-Insecure-Requests: 1 (如果存在更安全的响应,客户端优先选择加密及带有身份验证的响应) Content-Type: application/x-www-form-urlencoded (发送数据的媒体类型——发挥作用类似后缀名:.mp3 .avi) User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 (当前系统和浏览器版本) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Referer: http://localhost:9090/day01/1.html Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: JSESSIONID=98006861B5044ACC8D5C7840C93C17DA |
如果提交方式为get,则没有内容
如果提交内容是post,则会存放提交内容的键值对形式
request,在java中为HttpServletRequest对象
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
注:request对象封装了http请求中的所有信息,是由服务器创建
获取提交方法(getMethod)
获取请求行中的资源路径(getRequestURI)
获取完整的请求URL(getRequestURL)
获取协议名称/版本(getProtocol)
获取IP地址(getRemoteAddr)
获取本地端口(getLocalPort)
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取提交方法(getMethod) System.out.println("请求行方法:"+req.getMethod()); // 获取请求行中的资源路径(getRequestURI) System.out.println("请求行资源路径:"+req.getRequestURI()); // 获取完整的请求URL(getRequestURL) System.out.println("完整的请求URL:"+req.getRequestURL()); // 获取协议名称/版本(getProtocol) System.out.println("获取协议,版本:"+req.getProtocol()); // 获取IP地址(getRemoteAddr) System.out.println("获取IP地址:"+req.getRemoteAddr()); // 获取本地端口(getLocalPort) System.out.println("获取本地端口:"+req.getLocalPort()); }
当有http请求时,会输出请求行信息
两个方法
代码
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //显示请求头信息 System.out.println("通过头名称name查询指定信息"); System.out.println("User-Agent"+req.getHeader("User-Agent")); System.out.println("查询所有信息"); Enumeration<String> hn = req.getHeaderNames(); while(hn.hasMoreElements()){ String str=hn.nextElement(); System.out.println(str+req.getHeader(str)); } }
通过其他网站访问本网站的一些资源
通过网页发送的请求eg.download.jsp
如果download.jsp中的请求,来源于盗链者服务器,我们就显示不可以下载;
如果download.jsp中的请求,来源于正规服务器,我们就显示可以下载;
通过referer获取请求头信息
String header=request.getHeader(“referer”);
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String referer = req.getHeader("referer"); System.out.println(referer); if(referer.startsWith("http://localhost:8080/zc/")||referer.startsWith("http://127.0.0.1:8080/zc/")){ System.out.println("正常连接"); }else{ System.out.println("盗链连接"); } }
盗链主要通过标红的地方判断
接下来说的是无论是get提交还是post提交,即无论请求体中有没有数据,都是可以使用的
1).public String getParameter(String key):获取某个键的值。
2).public String[] getParameterValues(String key):获取一个键的多个值(复选框、多选下拉列表)
3).public Map<String,String[]> getParameterMap();获取所有的键值对,并封装到一个Map中.
4).public void setCharacterEncoding(String charsetName):设置request的解码方式,如果参数中有中文,
需要使用:"UTF-8"。
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取请求体信息 System.out.println("获取请求体信息"); String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println("username:"+username); System.out.println("password:"+password); System.out.println("-----------------------------------------------"); //当一个name对应多个值时,例如复选框,下拉列表,使用getParameterValues String[] pv = req.getParameterValues("hobby"); for (String s : pv) { System.out.println(s); } System.out.println("-----------------------------------------------"); //getParameterMap,获取所有的键值对,并封装到一个对象中 Map<String, String[]> map = req.getParameterMap(); Set<String> strings = map.keySet(); for (String string : strings) { System.out.println(string+" : "+map.get(string)); } }
作用:自动解析客户端的请求,并根据一个Map,自动封装JavaBean。
1).将BeanUtils所需jar包复制到lib目录下,并关联到模块中。
2).使用BeanUtils工具包:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { User user=new User(); //使用工具类 try { BeanUtils.populate(user,req.getParameterMap()); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } System.out.println(user); }
1).什么是“请求转发”:当前Servlet进行一部分处理,然后“转发”给另一个Servlet继续处理。
2).第一个Servlet,要转发给另一个Servlet,必须将request和response对象传给另一个Servlet。
语句:
request.getRequestDispatcher(“路径”).forward(request,response);
req.getRequestDispatcher("路径").forward(req,resp);
1).什么是“域对象”:是指可以在“一定范围内”可以共享数据的一种对象。
2).几个重要的域对象:
1).request:可以在转发的所有路径上,共享同一个request对象。
2).session:
3).ServletContext:
1).客户端每次发送请求,Tomcat都会为本次请求创建一个新的Request对象;
2).在Servlet的处理请求的service()方法执行过程中,一直存活。
如果被转发,此request会被传到另一个Servlet,继续存活;
3).直到service()执行完毕,request对象立即被清理。
原文:https://www.cnblogs.com/aihuadung/p/10910541.html