zoukankan      html  css  js  c++  java
  • Servlet——简单用户登录实例+http协议解析

    编写项目。用户登录系统1.0版本号

    登录界面Servlet:

    package com.gavin.view;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class LoginServlet extends HttpServlet {
    
    	
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">");
    		out.println("<HTML>");
    		out.println("  <HEAD><TITLE>用户登录</TITLE></HEAD>");
    		out.println("  <BODY>");
    		out.println("<h1>用户登录</h1>");
    		//action应该这样写:/web应用名/servlet的url
    		out.println("<form action='/UsersManager/LoginCLServlet' method='post'>");
    		out.println("用户名:<input type='text' name='username'/><br/>");
    		out.println("密    码:<input type='password' name='password'/><br/>");
    		out.print("<input type='submit' value='登录'/>");
    		out.println("<input type='reset' value='重置'/><br/>");
    		out.println("</form>");
    		out.println("  </BODY>");
    		out.println("</HTML>");
    		out.flush();
    		out.close();
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		this.doGet(request, response);
    	}
    
    }
    
    执行结果例如以下:

    对登录处理的Servlet:

    package com.gavin.controller;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class LoginCLServlet extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    //		response.setContentType("text/html;charset=utf-8");
    		String username = request.getParameter("username");
    		String password = request.getParameter("password");
    		
    		//这里看看接到没有
    		System.out.println(username +" "+password);
    		
    		//这里我们先简单验证
    		if("Gavin".equals(username)&&"123".equals(password)){
    			//跳转到下一个页面
    			//servlet提供了两种,sendRedirect转向 、forward转发
    			//sendRedirect的url应该这样写 : /web应用名称/servlet的url
    			response.sendRedirect("/UsersManager/MainFrame");
    		}else{
    			//跳回
    			response.sendRedirect("/UsersManager/LoginServlet");
    		}
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		this.doGet(request, response);
    	}
    
    }
    
    主界面Servlet:

    package com.gavin.view;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MainFrame extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">");
    		out.println("<HTML>");
    		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
    		out.println("  <BODY>");
    		out.print("    <h1>主界面</h1> ");
    		out.println("  </BODY>");
    		out.println("</HTML>");
    		out.flush();
    		out.close();
    	}
    	
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		this.doGet(request, response);
    	}
    }
    

    流程是这种:登录界面Servlet将数据提交给登录处理Servlet,该Servlet推断username和password是否正确,假设正确,则跳转至主界面,假设不对,则又一次跳转回登录界面。

    ==========================================================================================

    Http协议深度剖析

    Http协议是做web开发的基础。

    -------------------------------------------------------------------------------------------------------------------------------------------------------------

    1、什么是Http协议?

    超文本传输协议(HTTP,HyperText TransferProtocol)是互联网上应用最为广泛的一种网络协议。是工作在tcp/ip协议基础上的。全部的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种公布和接收HTML页面的方法。

    (1) 能够通过httpwatch插件来抓取http请求内容

    (2)http1.0短连接,http1.1长连接,这里的长短是指持续的时间,http1.1会保留连接一段时间,持续约30s,http1.0在发送完数据后会立刻断掉。

    (3)http是Tcp/ip协议的一个应用层协议。http也是我们web开发的基础。

    -------------------------------------------------------------------------------------------------------------------------------------------------------------

    一个问题

    一个test.html页面例如以下:

    <h1>abc</h1>
    <img src=”news.jpg”/>
    <img src=”news2.jpg”/>
    
    问浏览器会发出几次请求?

    答案:3次!

    第一次请求html文本。第二次请求news.jpg图片,第三次请求news2.jpg图片。

    这里能够看到,每一个图片源都要请求server的,所以一个站点的图片越多,訪问速度越慢。
    -------------------------------------------------------------------------------------------------------------------------------------------------------------

    2、http请求

    client连上server后。向server请求某个web资源,称之为client向server发送了一个Http请求。

    一个完整的Http请求包括例如以下内容:

    一个请求行、若干消息头、以及实体内容。当中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开

    例如以下所看到的:


    消息头格式 :消息名:消息内容。消息头并非每次都是一样的。要看详细的情况。

    -------------------------------------------------------------------------------------------------------------------------------------------------------------

    3、http请求消息头具体解释

    Accept 用于告诉server,客户机所支持的数据类型(文本、网页、图片)
    Accept-Charset 用于告诉server,客户机所採用的码表(如ISO-8859-1)
    Accept-Encoding 用于告诉server,客户机所支持的数据压缩格式
    Accept-Language 用于告诉server,客户机的语法环境(一般支持中英文)
    Host 用于告诉server。客户机想訪问server哪台主机
    If-Modified-Since 用于告诉server,客户机对于资源的最后缓存时间
    Referer 用于告诉server,客户机是从哪个页面去訪问server的  (防盗链
    User-Agent 用于告诉server,客户机的机器环境(比如所使用的操作系统,浏览器版本)
    Cookie client通过这个头字段,能够带一些数据给server
    Connection client通过这个头字段告诉server。请求完毕后,是保持链接还是关闭链接
    Date 客户机发送该Http请求的时间
    在Servlet中能够通过request对象的getHeader()方法通过消息头得到消息内容

    String referer = request.getHeader("Referer");
    Referer能够应用在防盗链方面!
                    //获取用户浏览器的Refere
    		String referer = request.getHeader("Referer");
    		out.println("refere:"+referer+"<br>");
    		//没有链接。则重定向到Error页面
    		//即仅仅能从自己的站点訪问,比方从我们的goto.html中的超链接訪问
    		if(referer==null||!referer.startsWith("http://localhost:8080/servletPro")){
    			response.sendRedirect("/servletPro/Error");
    		}
    server能够得到訪问该页面的Referer,假设为空或者不是从本站点訪问的,则重定向至错误页面。


    -------------------------------------------------------------------------------------------------------------------------------------------------------------

    4、http响应头

    Location 这个头通常配合302状态码使用,server使用这个头告诉浏览器去找谁
    Server server通过这个头告诉浏览器,server的类型
    Content-Encoding server通过这个头告诉浏览器,数据的压缩格式(gzip)
    Content-Length server通过这个头告诉浏览器,回送数据的长度
    Content-Language server通过这个头告诉浏览器,数据的语言类型
    Content-Type server通过这个头告诉浏览器,回送数据的类型
    Last-Modified server通过这个头告诉浏览器,数据的最后改动时间
    Refresh server通过这个头告诉浏览器,多长时间定时刷新
    Content-Disposition 控制浏览器下面载方式打开回送的数据
    Transfer-Encoding server通过这个头告诉浏览器,数据是以块方式回送的
    Expires 控制浏览器缓存数据的时间(-1或0,代表控制浏览器不要缓存)
    Cache-Control no-cache
    Pragma no-cache
    【最后三个头一起用,就能够控制全部的浏览器不要缓存数据】

    【为什么有三个响应头都是控制浏览器的缓存时间呢。由于不同的浏览器可以识别的响应头不同】
    -------------------------------------------------------------------------------------------------------------------------------------------------------------

    5.请求结果

    200:请求成功

    302 向别处请求资源。即重定向

    304或307     向缓存请求

    404 请求的资源不存在

    500server端出现错误

    ==========================================================================================

    关于http响应头的一些样例

    -------------------------------------------------------------------------------------------------------------------------------------------------------------

    跳转举例

    response.setstatus(302);
    response.setHeader(“Location”,”/servletPro/Servlet2”);
    

    上面两句话等价于:

    response.sendRedirect(“/servletPro/Servlet2”);
    -------------------------------------------------------------------------------------------------------------------------------------------------------------
    Refresh举例
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		response.setContentType("text/html;charset=utf-8");
    		response.setHeader("Refresh", "5;url=/servletPro/goto.html");
    	}
    

    Refresh能够设置n秒后跳转到url指定的页面,假设url指定的是自己本身,则能够实现定时刷新本页面!

    -------------------------------------------------------------------------------------------------------------------------------------------------------------

    Content-Disposition举例

                   // 演示下载文件
    		response.setHeader("Content-Disposition", "attachment;filename=hello.jpg");
    		//打开文件
    		// 1.获取到要下载文件的全路径,也就是绝对路径
    		String path = this.getServletContext().getRealPath("/images/test.jpg");
    		System.out.println("path:"+path);
    		//2.创建文件输入流
    		FileInputStream fis = new FileInputStream(new File(path));
    		//做一个缓冲字节数组
    		byte[] buff = new byte[1024];
    		int len = 0;
    		OutputStream os = response.getOutputStream();
    		// 这里的len表示实际读取到了多少字节
    		while((len=fis.read(buff))>0){
    			os.write(buff, 0, len);
    		}
    		//关闭
    		os.close();
    		fis.close();
    

    文件下载的步骤:

    【1】  response设置Header:Content-Disposition

    【2】    依据相对文件路径得到文件的全路径。也就是绝对路径

    【3】依照字节流输入。并通过response的字节流输出到浏览器
    -------------------------------------------------------------------------------------------------------------------------------------------------------------

    缓存页面举例说明:

    提示问题:我们的浏览器在默认的情况下。会缓存我们的页面,这样会出现一个小问题:假设我们的用户习惯把光标停在地址栏。然后回车去取页面。就会默认从cache中取数据。

    (1)有些站点对及时性要求比較高。因此要求我们不缓存页面。

                    // 指定该页面不缓存
    		response.setDateHeader("Expires", -1);
    		// 为了保证兼容性,上面的一句话适用于IE浏览器
    		response.setHeader("Cache-Control", "no-cache");
    		response.setHeader("Pragma", "no-cache");
    

    (2)有些站点要求网页缓存一定的时间。比方缓存一个小时:

    response.setDateHeader("Expires", System.currentTimeMillis()+3600*1000);
    【注意:有些方法对不同的浏览器可能不起作用。

    比方仅仅有IE浏览器才干识别Expires响应标头。所以上面的控制网页缓存时间仅仅对IE浏览器有效】

    如上所看到的,http的响应头的作用还是很大的。


  • 相关阅读:
    并查集-B
    ->的用法
    PTA-1042 字符统计
    PAT 1040有几个PAT
    assembly x86(nasm)修改后的日常
    python接口自动化之操作常用数据库mysql、oracle
    os模块常用方法
    python 多线程编程并不能真正利用多核的CPU
    连接mysql数据库
    python之用yagmail模块发送邮件
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7273338.html
Copyright © 2011-2022 走看看