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

最新文章

  1. “英雄之旅”见闻和小结----angular2系列(三)
  2. LAMP环境搭建教程(原创)
  3. 查看Nginx、apache、MySQL和PHP的编译参数
  4. 【题解】【BT】【Leetcode】Populating Next Right Pointers in Each Node
  5. Codevs 1958 刺激
  6. 【Linux】鸟哥的Linux私房菜基础学习篇整理(五)
  7. js数组基础整理
  8. MySQL 对于千万级的大表要怎么优化
  9. nyoj28 大数阶乘 亿进制优化
  10. jsp 九大内置对象和其作用详解
  11. python学习:修改字符串大小写
  12. Qt终结者之粒子系统
  13. 混合线路接入时,360、QQ管家等测速显示电信IP或任意线路的IP
  14. 由pg_xlogdump统计信息想到的问题
  15. Action中如何通过@Autowired自动注入spring bean ?
  16. iframe 元素会创建包含另外一个文档的内联框架(即行内框架)
  17. Phaser3 场景Scene之间的传值 -- HTML JAVASCRIPT 网页游戏开发
  18. linux c 监控目录
  19. Jquery EasyUI选项卡-Tabs的使用方法
  20. Markov and Chebyshev Inequalities and the Weak Law of Large Numbers

热门文章

  1. 编译opencv2.4.11时出现错误:error: ‘NppiGraphcutState’ has not been declared
  2. Java常见知识点(一)
  3. html中的定位与层级设置
  4. 学习OpenResty编程
  5. ionic3 打包发布,以安卓说明
  6. sublime text3中使用Emmet部分标签无法闭合
  7. 来,让我们谈一谈 Normalize.css
  8. P问题,NP问题 NPC问题 大神解答
  9. 洛谷 P1093 奖学金【三级结构体排序】
  10. POJ 2438 Children&#39;s Dining(哈密顿回路)