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的urlout.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的urlresponse.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能够应用在防盗链方面!
//获取用户浏览器的RefereString 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协议解析相关推荐
- jsp java 登陆_jsp+java servlet实现简单用户登录
jsp+java servlet实现简单用户登录(使用数据库,包括注册页面) 功能介绍 本项目通过使用jsp和servlet实现简单的用户登录.主要逻辑为:如果用户不存在,则首先进行注册(注册信息同步 ...
- java wed登录面 代码_Java Web用户登录实例代码
实现功能: 1.用户登陆.注销 2.利用session记录用户登陆信息 3.在JSP中展示已登陆用户信息 实现原理: 登陆后通过判断用户名和密码是否和存储的一致,如果一致,就把用户信息放到sessio ...
- vue配置文件读取_Vue+Spring Boot简单用户登录Demo实现
❝ 「如果觉得文章好看,欢迎点赞.」「同时欢迎关注微信公众号:氷泠之路.」 ❞ 这是一个前后端分离的简单用户登录Demo. 技术栈 Vue BootstrapVue Kotlin Spring Boo ...
- php100例代码教程,php实例代码_php用户登录实例教程代码
摘要 腾兴网为您分享:php用户登录实例教程代码,音恋,小米云盘,武魂传说,万步有约等软件知识,以及绿城党旗红,一席app,一亩田app,窝立方,fairuse4wm,超星阅读,大连农商银行,qq名片 ...
- 基于 JSP + Servlet 的用户登录验证
综合案例--基于 JSP + Servlet 的用户登录验证 [例6-1] 实现一个简单的用户登录验证程序,如果用户名是 abc ,密码是 123,则显示欢迎用户的信息,否则显示"用户名或密 ...
- 使用filter过滤器实现简单用户登录验证(不用配置web.xml文件)
一.filter过滤器的作用 如果想要获取中文字符,或者是显示提交的中文,就需要添加以下代码,来防止乱码的情况发生. request.setCharacterEncoding("utf-8& ...
- 腾讯云Ubuntu系统如何使用 root 用户登录实例
1.腾讯云Ubuntu 系统如何使用 root 用户登录实例? 修改root密码 执行命令sudo passwd root 按照提示输入密码(可与前密码相同便于记忆) 修改ssh配置 执行命令 sud ...
- 基于Servlet的MVC模式用户登录实例
关于MVC模式的简单解释 M Model,模型层,例如登录实例中,用于处理登录操作的类: V View,视图层,用于展示以及与用户交互.使用html.js.css.jsp.jQuery等前端技术实现: ...
- Servlet+jsp用户登录加上验证码
最近公司有个项目被客户拿去进行漏洞扫描,发现用户登录太简单,容易被暴力破解.当然发现的问题很多,什么反射型XSS,存储型XSS,敏感信息泄露等等.但是我们今天不讲这么多,就说说如何修复暴力破解的问题. ...
最新文章
- python 多进程并发_python并发编程之多进程
- java图的建立field_《Java虚拟机原理图解》1.4 class文件中的字段表集合--field字段在class文件中是怎样组织的...
- Java学生管理系统使用线性表任务台程序
- iOS开发 发布之后的Crash错误反馈(二)
- EP Limited: 开源ECG分析软件介绍
- ubuntu8.10_深圳源
- WebView基本使用
- Palm应用开发之三appinfo.json 文件详解
- 以太网转串口代码C语言,基于STM32 串口转以太网收发数据(stm32移植代码+网络调试助手等)...
- gps l1带宽_请问GPS带宽是多少?
- 基于CM6800的ATX电源维修
- ADSL家庭宽带用户提高迅雷下载速度的几个实用方法
- DDoS deflate:自动屏蔽DDOS攻击IP
- vue 带节假日考勤状态的日历
- GHOST系统(迅雷下载集合)
- 任正非——《一江春水向东流》
- SQL执行计划--HIT、SQLPLAN
- JAVA SE 第一章 计算机、程序和Java概述
- [ZJOI2014]力 题解
- android设备连接电脑无需授权
热门文章
- CTF web题总结--任意文件下载
- 2 模版_轻量html模版渲染库 cJinja
- matlab 读取csv_利用Pytorch进行数据加载1--CSV文件的读取和显示
- NBU备份之一 Windows操作系统BMR的配置
- linux C编程之makefile
- linux下nginx+python+fastcgi部署总结(web.py版)
- 让你眼花缭乱的JS代码~~
- CentOS 安装Nginx
- 2018.12.05 codeforces 948C. Producing Snow(堆)
- WebGIS在行业中应用的演变