标签:
编写项目,用户登录系统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); } }
==========================================================================================
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请求的时间 |
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”);-------------------------------------------------------------------------------------------------------------------------------------------------------------
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的响应头的作用还是非常大的。
标签:
原文地址:http://blog.csdn.net/gavin_john/article/details/51219336