编写项目。用户登录系统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的响应头的作用还是很大的。

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

  1. Django:用户登录实例

    Django:用户登录实例 一.源代码 1,login.html代码(登录界面): <!DOCTYPE html> <html lang="zh-CN"> ...

  2. python入门:模拟简单用户登录(自写)

    #!/usr/bin/env python # -*- coding: utf-8 -*- #模拟简单用户登录(自写) import getpass a = raw_input("Pleas ...

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

    关于MVC模式的简单解释 M Model,模型层,例如登录实例中,用于处理登录操作的类: V View,视图层,用于展示以及与用户交互.使用html.js.css.jsp.jQuery等前端技术实现: ...

  4. Servlet+jsp用户登录加上验证码

    最近公司有个项目被客户拿去进行漏洞扫描,发现用户登录太简单,容易被暴力破解.当然发现的问题很多,什么反射型XSS,存储型XSS,敏感信息泄露等等.但是我们今天不讲这么多,就说说如何修复暴力破解的问题. ...

  5. Servlet --简单用户留言系统

    1.创建用户表和留言表 2.编写数据库连接工具类 public class SqlserverDBConn { private Statement stmt; private Connection c ...

  6. centos7 设置grub密码及单用户登录实例

    centos7与centos6在设置grub密码的操作步骤上有很大的差别,特此记录供以后查用 grub加密的目的: 防止不法分子利用单用户模式修改root密码 给grub加密可以采用明文或者加密的密文 ...

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

    Login.java //登录界面 package com.tsinghua; import javax.servlet.http.*; import java.io.*; public class ...

  8. springMVC+mybatis用户登录实例

    1.整体结构 2.准备工作 数据库: --Mysql 5.6 创建数据库 wolf 1 CREATE DATABASE wolf; 创建用户表 user 1 2 3 4 5 6 create tabl ...

  9. 使用Spring框架实现用户登录实例

    以下要讲的案例来自于<Spring 3.X 企业应用开发实战>这本书. 针对我一周的摸索,现在总结几个易错点,当然,这是在我自己犯过错误的前提下总结出来的,如果有说的不到位的地方,欢迎大家 ...

随机推荐

  1. 【Android开发日记】之入门篇(十四)——Button控件+自定义Button控件

        好久不见,又是一个新的学期开始了,为什么我感觉好惆怅啊!这一周也发生了不少事情,节假日放了三天的假(好久没有这么悠闲过了),实习公司那边被组长半强制性的要求去解决一个后台登陆的问题,结果就是把 ...

  2. jQuery 入门笔记1

    jQuery是一个兼容多浏览器的javascript框架,核心理念是write less,do more(写得更少,做得更多). 1:jQuery使用 <script type="te ...

  3. Spring Boot 项目部署到本地Tomcat,出现访问路径问题

    首先确定war 包没问题,把war包放在webapps目录下,访问http://localhost:8080/ + 项目名称 发现首页可以访问但css,js请求都是404,跳转页面也是404 解决方法 ...

  4. python的上下文管理(context)(1)

    本文转载自:http://blog.csdn.net/G_66_hero/article/details/53048540 什么是Python中的上下文管理器 怎么使用上下文管理器 如何创建自己的上下 ...

  5. head first (一):策略模式

    head first 看了一遍,被面试时问我工厂模式,我发现我还是不记得,所以还是认认真真的看一遍吧,上一遍看的太快了,什么都没有记住.这一遍我会写下一些东西帮助自己记忆和理解,例子我也会用C#自己写 ...

  6. Oracle迁移到DB2常用转换

    因为项目需要,要将Oracle上的东西转移到DB2,于是收集整理了一些需要修改点的注意事项,拿出来大家分享. ORACLE和DB2实现相同功能的实例(主要以Oracle8I和DB2 7.X为例,已测试 ...

  7. 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

    layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...

  8. NGUI_Sprites

    一.UI Sprites 控件: Sprites控件是NGUI的基础控件,几乎可以这么说所有的控件都可以基于Sprites控件添加 Box Collider然后进行附加相关的脚本组件来达到想要的插件效 ...

  9. AtCoder - 2568 Lotus Leaves

    Problem Statement There is a pond with a rectangular shape. The pond is divided into a grid with H r ...

  10. HDOJ 5693 D Game

    众所周知,度度熊喜欢的字符只有两个:B 和D. 今天,它发明了一个游戏:D游戏. 度度熊的英文并不是很高明,所以这里的D,没什么高深的含义,只是代指等差数列[(等差数列百科)](http://baik ...