1435124+朱正金+JavaEE实验4.docx
《1435124+朱正金+JavaEE实验4.docx》由会员分享,可在线阅读,更多相关《1435124+朱正金+JavaEE实验4.docx(29页珍藏版)》请在冰点文库上搜索。
1435124+朱正金+JavaEE实验4
《JAVA EE开发技术基础》上机实验报告
实验名称
实验四、客户请求的处理与服务器响应的生成
实验时间
2017.3.30
学生姓名
朱正金
班级
Z1411
学号
14200135124
指导教师
陆悠
批阅教师
成绩
一、实验目的
1.掌握Servlet与JSP中,用户请求的获取、解析方法;
2.掌握会话及跟踪方法(Session)、Cookies的使用;
3.掌握生成图象、Excel表格的方法
4.掌握访问数据库的方法。
二、实验内容
1、模拟Web网站缓存用户的各类偏好设置情况,在Web页面登陆访问服务器后,服
务器将用户在登录界面提交的表单数据进行缓存,进而将缓存数据返回给浏览器,供下一步
操作处理。
2、使用Cookie和Session两种方式实现。
3、基本概念和原理:
(a)cookie:
Cookie中文译文是饼干的意思,cookie是保存会话数据的一种技术,其容量有限;有
生命周期,根据需求设置cookie有效期如果不进行设置的话,数据保存至浏览器关闭。
它
保存在浏览器的缓存中,数据是明文显示的通常只保存非敏感信息,未加密的数据会充分暴
露给外界。
Cookie通常是保存用户偏好设置、用户名、日期时间等数据。
Cookie具体工作
原理:
(1)浏览器向服务器发送请求;
(2)服务器接收请求,生成一个cookie对象保存"标识"
数据;(3)然后把cookie对象放在响应头,一并发回浏览器;(4)浏览器取出cookie对象的数
据保存在浏览器的缓存中;(5)再次访问时请求头携带cookie数据发送到服务器;(6)服务器
根据cookie的数据作出相应处理
cookie的应用场景通常是使用在“记住登陆状态”,即一次访问成功,在一定时间内可
自动登陆,实现细节:
比如登陆京东网站,首次登陆需要账号密码,登陆成功后手误关闭了
浏览器,再次登陆京东时发现登陆状态还在,无需重输账号密码。
即从login页面再次跳转
到index页面时,servlet取出cookie的数据做匹配,配对成功则将【请求转发】给index页
面,跳转成功。
Cookie使用方法简介:
使用Cookie跟踪会话。
使用Cookie跟踪会话涉及到向客户端写
入Cookie和从客户端读取Cookie,具体做法如下:
【步骤1】向客户端写入Cookie对象
packagetest;
importjava.io.*;importjavax.servlet.*;
importjavax.servlet.http.*;
publicclassSendCookieextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsIOException,ServletException{
CookieuserCookie=newCookie("user","uid1234");
userCookie.setMaxAge(60*60*24*7);
response.addCookie(userCookie);
response.setContentType("text/html");
PrintWriterout=response.getWriter();
out.println("
addcookies");
out.println("
"+
"Acookiehasbeensenttobrower");
out.println("");
}
}
访问上述Servlet将向客户端写入一个Cookie,执行后可查看客户机对应目录看是否写
了一个文件。
【步骤2】从客户端读取Cookie对象
packagetest;
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclassGetCookieextendsHttpServlet{
publicvoiddoGet(HttpServletRequest
request,HttpServletResponseresponse)
throwsIOException,ServletException{
StringcookieName="user";
StringcookieValue=null;
Cookie[]cookies=request.getCookies();
if(cookies!
=null){
for(inti=0;iCookiecookie=cookies[i];
if(cookie.getName().equals(cookieName))
cookieValue=cookie.getValue();
}
}response.setContentType("text/html");
PrintWriterout=response.getWriter();
out.println("
getcookies");
out.println("
Acookiehasbeengotfrombrower
");
out.println("CookieName:
"+cookieName+"
");
out.println("CookieValue:
"+cookieValue+"
");
out.println("");
}
}
(b)session:
Session存在于服务端对客户端不可见,而cookie存在客户端,sessionId要依赖cookie
进行转发。
当第一次打开浏览器时,浏览器马上分配了一个sessionId给客户端,客户端发
送请求给服务端时就,服务端记录此sessionId在本地,当客户端再次请求服务端时,它就
是根据先前有效的sessionId做出相应的操作。
每次客户端发来请求时,服务端根据cookie
携带的sessionId来区分是哪个用户的会话。
具体使用示例如下:
使用HttpSession对象管理会话。
packagecom.demo;
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.util.Date;
publicclassShowSessionextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException{
response.setContentType("text/html");
HttpSessionsession=request.getSession();
Stringheading=null;
IntegeraccessCount=(Integer)session.getAttribute("accessCount");
if(accessCount==null){
accessCount=newInteger(0);
heading="Welcome,Newcomer";
}else{
heading="WelcomeBack.";
accessCount=newInteger(accessCount.intValue()+1);
}
session.setAttribute("accessCount",accessCount);PrintWriterout=response.getWriter();
out.println("
");
out.println("
SessionTrackingExample");
out.println("
");out.println("
"+heading+"
");out.println("
Informationaboutyoursession.
");out.println("");
out.println("InfoType | Value\n"); out.println(" | ID | "+session.getId()+"\n"); out.println(" |
CreationTime: | "); out.println(""+newDate(session.getCreationTime())+"\n"); out.println(" |
Timeoflastaccess: | "); out.println(""+newDate(session.getLastAccessedTime())+"\n"); out.println(" |
Accessnumber: | "+accessCount+"\n"); out.println(""); } } 4、验证码生成与使用 (1)验证码生成 在Servlet中生成内存图片对象,并输出到客户的浏览器即可,示例代码如下 (CheckCodeServlet.java,功能实现见注释): packagecs2015.servlet; publicclassCheckCodeServletextendsHttpServlet{ privatefinalintLENGTH=4; publicCheckCodeServlet(){super();} protectedvoidprocessRequest(HttpServletRequestrequest,HttpServletResponse response) throwsServletException,IOException{ response.setContentType("image/jpeg");//浏览器不缓存 response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires",0); //随机字符集 char[]code={'0','1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o', 'p','q','r','s','t','u','v','w','x','y','z', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O', 'P','Q','R','S','T','U','V','W','X','Y','Z'}; String[]Fonts={"TimesNewRoman","Verdana", "ArialNarrow", "Candara", "CalifornianFB", "BrushScriptMT"}; intwidth=60,height=30; //内存图像对象 BufferedImageimage=newBufferedImage(width,height, BufferedImage.TYPE_INT_RGB); //绘图区图形对象 Graphicsg=image.getGraphics(); //随机数发生器 Randomrandom=newRandom(); //绘图填充区域 g.fillRect(0,0,width,height); //设置颜色 g.setColor(getRandColor(160,200)); //取随机颜色、起始点位置,绘制线条 for(inti=0;i<155;i++) { intx=random.nextInt(width); inty=random.nextInt(height); intxl=random.nextInt(12); intyl=random.nextInt(12); g.drawLine(x,y,x+xl,y+yl);//绘直线 } StringsRand=""; intt; //获取验证码字符,取随机颜色、绘图位置,输出字符 for(inti=0;it=random.nextInt(code.length); Stringrand=""+code[t];//取出随机字符 sRand+=rand;//设置字符输出的颜色 g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); //设置字符输出的字体及大小 g.setFont(new Font(Fonts[random.nextInt(5)],Font.PLAIN,15+random.nextInt(Fonts.length))); //在随机位置输出 g.drawString(rand,13*i+6,15+random.nextInt(10)); } //验证码写入Session保存,验证时,从Session读取 request.getSession().setAttribute("ValidateCode",sRand); //销毁图形对象 g.dispose(); //通过response对象输出JPEG格式的图像 try{ ImageIO.write(image,"JPEG",response.getOutputStream()); }catch(IOExceptione){} response.flushBuffer(); } privateColorgetRandColor(intfc,intbc) { Randomrandom=newRandom(); if(fc>255) fc=255; if(bc>255) bc=255; intr=fc+random.nextInt(bc-fc); intg=fc+random.nextInt(bc-fc); intb=fc+random.nextInt(bc-fc); returnnewColor(r,g,b); } publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ processRequest(request,response); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ processRequest(request,response); } ................... } (2)配置Servlet 编辑web.xml:
CheckCodeServlet cs2015.servlet.CheckCodeServlet
CheckCodeServlet /servlet/CheckCodeServlet ......................................... (3)验证码功能的使用 在JSP页面需要验证码位置,嵌入如下代码: 验证码: 98px;height: 16px"/> pointer"alt="如果看不清验证码,请点图片刷新"align="middle">
在WebRoot下,新建一个JSP页面login.jsp,内容如下: 三、实验步骤及实验结果记录 1、基于Cookie实现对用户表单信息的缓存,并将缓存结果返回用户浏览器, 业务逻辑说明: (1)接收来自客户端的信息 (2)保存在cookie对象中 (3)添加到cookie到resopnse中 (4)页面转发到index页面的同时将cookie一并返回给浏览器 实现步骤: 登陆页面的设计: login.jsp 处理登陆表单信息的servlet: ServletCookie.java publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ doGet(request,response); Stringusername=request.getParameter("username"); Stringpassword=request.getParameter("password"); Cookiecookie=newCookie(username,password); cookie.setPath(""); cookie.setComment("thisiscookie"); response.addCookie(cookie); request.getRequestDispatcher("/index.jsp").forward(request,response); } publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.getWriter().append("Serveredat").append(request.getContextPath()); } 转向页面: index.jsp 部署运行验证: (1)启动Tomcat打开login.jsp: 表单未提交前RequestHeader请求头为空; (2)输入用户名,密码点击【提交】servlet接收到请求头信息,将用户名 密码存储在cookie中,servlet将index页面和cookie一并返回给浏览器 (3)查看浏览器已经接收到的来自服务器的Cooike 2、基于Session实现对用户表单信息的缓存,并将缓存结果返回用户浏览器, 业务逻辑: (1)获取表单提交的数据 (2)保存在User实体类中,获取当前登陆时间 (3)session储存User对象、登陆时间 (4)请求转发给index.jsp 实现步骤: 登陆表单页面: login.jsp 存储登陆表单的JavaBean: User.java publicclassUser{ privateStringusername=""; privateStringpassword=""; publicUser(Stringusername,Stringpassword){ this.username=username; this.password=password; } publicvoidsetUsername(Stringusername){ this.username=username; } publicStringgetUsername(){ returnusername; } publicvoidsetPassword(Stringpassword){ this.password=password; } publicStringgetPassword(){ returnpassword; } } 处理登陆表单信息的servlet: ServletSession.java publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.getWriter().append("Serveredat").append(request.getContextPath()); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
展开阅读全文
相关搜索
资源标签
|