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判断用户名和密码是否正确,如果正确,则跳转至主界面,如果不正确,则重新跳转回登录界面。

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

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图片。

这里可以看到,每个图片源都要请求服务器的,所以一个网站的图片越多,访问速度越慢。

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

2、http请求

客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个Http请求。一个完整的Http请求包含如下内容:

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

消息头格式 :消息名:消息内容,消息头并不是每次都是一样的,要看具体的情况。

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

3、http请求消息头详解

Accept 用于告诉服务器,客户机所支持的数据类型(文本、网页、图片)
Accept-Charset 用于告诉服务器,客户机所采用的码表(如ISO-8859-1)
Accept-Encoding 用于告诉服务器,客户机所支持的数据压缩格式
Accept-Language 用于告诉服务器,客户机的语法环境(一般支持中英文)
Host 用于告诉服务器,客户机想访问服务器哪台主机
If-Modified-Since 用于告诉服务器,客户机对于资源的最后缓存时间
Referer 用于告诉服务器,客户机是从哪个页面去访问服务器的  (防盗链)
User-Agent 用于告诉服务器,客户机的机器环境(例如所使用的操作系统,浏览器版本号)
Cookie 客户端通过这个头字段,可以带一些数据给服务器
Connection 客户端通过这个头字段告诉服务器,请求完成后,是保持链接还是关闭链接
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");
		}

服务器可以得到访问该页面的Referer,如果为空或者不是从本网站访问的,则重定向至错误页面。

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

4、http响应头

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

【最后三个头一起用,就可以控制所有的浏览器不要缓存数据】

【为什么有三个响应头都是控制浏览器的缓存时间呢,因为不同的浏览器能够识别的响应头不同】

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

5.请求结果

200:请求成功

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

304或307     向缓存请求

404 请求的资源不存在

500服务器端出现错误

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

关于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的响应头的作用还是非常大的。

时间: 2024-07-31 20:53:22

Servlet——简单用户登录实例+http协议解析的相关文章

使用servlet实现用户登录

本文简单讲述使用servlet实现用户登录,包括用户登录.退出和注册等. 1.关于servlet 1.1概述 Servlet(Server Applet),全称Java Servlet,未有中文译文.是用Java编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成动态Web内容.狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者. Servlet运行于支持Java的应用服务器中.从

【Servlet】Servlet简单登陆验证实例

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文要实现Servlet简单登陆验证实例.结构如下 1.LoginCheck.java package com.mucfc; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annota

Flask ==&gt; 简单用户登录

Flask ==>  简单用户登录 from flask import Flask,render_template,request,redirect,session import functools app=Flask(__name__,template_folder='templates',static_url_path='/xxxxxx') app.secret_key = "sdfasdfasdf3fsdf" #加密钥 def wapper(func): @functool

【MVC】Servlet+Jsp+MySql用户登录实例

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文要用Servlet+Jsp+MySql实例用户登录,并简要介绍了下MVC的思想,此例子也是按照这个思路来做的.在Eclipse+tomcat7.0上做的.不会很难,对于了解MVC思想很有帮助! 效果: 这是刚开始的界面 这是错误时的信息 这是成功时的信息 一.MVC简介 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(control

基于Servlet的MVC模式用户登录实例

关于MVC模式的简单解释 M Model,模型层,例如登录实例中,用于处理登录操作的类: V View,视图层,用于展示以及与用户交互.使用html.js.css.jsp.jQuery等前端技术实现: C Controller,控制器,接受视图层的请求,将请求跳转到对应的模型进行处理,模型层处理完毕后,再将结果返回给请求处.这里用Servlet实现控制器. 实现过程分析 用户再视图层输入用户名以及密码点击提交,向控制器发出请求 控制器(Servlet)接受请求,将接受到的用户名以及密码转给模型层

简单用户登录网站(HttpServlet1.2版本)

案例说明:当用户尚未登录就访问欢迎界面时,页面跳转到登录界面,并显示提示信息; 若用户填写的信息与固定用户信息不一致时,登录界面显示错误提示信息;否则跳转到欢迎页面,显示用户名信息. 新建Login2.java -- 用户登录界面,当用户信息输入错误时,会显示提醒信息.(当用户直接访问欢迎界面时,若用户的session不存在,则跳转到登录界面,提醒用户未登录) 对Login2.java进行Servlet部署 新建LoginCl2.java -- 对用户输入的信息进行检验,若用户信息正确则新增se

Servlet课程0425(四) Servlet实现简单用户登录验证

Login.java //登录界面 package com.tsinghua; import javax.servlet.http.*; import java.io.*; public class Login extends HttpServlet{ public void doGet(HttpServletRequest req, HttpServletResponse res) { //业务逻辑 try{ //中文乱码 //浏览器默认ISO-8859 res.setContentType(

Nodejs&amp;express+mongodb完成简单用户登录(即Nodejs入门)

刚了解nodejs,发现nodejs配置起来不复杂,但也有很多需要注意的地方,今天就记录一下,以后也可拿出来看看. 要完成这个简单的示例,从零开始,走三步就行了. 一.搭建开发环境 二.创建项目(express) 三.编码 我是属于技术类的人,废话无多. 一.搭建开发环境 1. nodejs 1.1 安装 到官方网站下载最新版本 http://www.nodejs.org/, 下载之后,安装,一路 next 1.2 配置 path  把上面安装的目录配置到环境变量中,方便以后用命令行的方式使用n

jsp使用servlet实现用户登录 及动态验证码

在进行表单设计中,验证码的增加恰恰可以实现是否为"人为"操作,增加验证码可以防止网站数据库信息的冗杂等... 现在,我将讲述通过servlet实现验证码: 验证码作为一个图片,在页面中为"画"出来的,它是如何画出来的呢? <生成图片> { 生成图片的类: 1.BufferedImage图像数据缓冲区 2.Graphics绘制图片 3.color获取颜色 4.Random获取随机数 5.ImageIO输出图片 } /////////////////////