ITKeyword,专注技术干货聚合推荐

注册 | 登录

web day11 JSP基础,Cookie,HttpSession,验证码

opopopwqwqwq 分享于 2016-04-19

推荐:09 12 11 Java Web学习笔记-Jsp简单总结

Jsp脚本元素的三种格式:     表达式:         <%=exprssion%> 将表达式的值输出到前台。         <jsp:expression>Java Expression</jsp:expresion>     Script

2019阿里云全部产品优惠券(新购或升级都可以使用,强烈推荐)
领取地址https://promotion.aliyun.com/ntms/yunparter/invite.html

主要内容: 1. JSP基础 2. Cookie 3. HttpSession

================================

JSP基础

1. jsp的作用:

*Servlet:

> 缺点:不适合设置html响应体,需要大量的response.getWriter().print("<html>")

> 优点:动态资源,可以编程。

*html:

> 缺点:html是静态页面,不能包含动态信息

> 优点:不用为输出html标签而发愁

*jsp(java server pages):

> 优点:在原有html的基础上添加java脚本,构成jsp页面。

2. jsp和Servlet的分工:

*JSP:

> 作为请求发起页面,例如显示表单、超链接。

> 作为请求结束页面,例如显示数据。

*Servlet:

> 作为请求中处理数据的环节。

3. jsp的组成

*jsp = html + java脚本 + jsp标签(指令)

*jsp中无需创建即可使用的对象一共有9个,被称之为9大内置对象。例如:request对象、out对象

* 3种java脚本:

> <%...%>:java代码片段(常用),用于定义0~N条Java语句!方法内能写什么,它就可以放什么!

> <%=...%>:java表达式,用于输出(常用),用于输出一条表达式(或变量)的结果。response.getWriter().print( ... );这里能 放什么,它就可以放什么!

> <%!...%>:声明,用来创建类的成员变量和成员方法(基本不用,但容易被考到),类体中可以放什么,它就可以放什么!

案例:演示jsp中java脚本的使用!

案例:演示jsp与servlet分工!

4. jsp原理(理解)

*jsp其实是一种特殊的Servlet

> 当jsp页面第一次被访问时,服务器会把jsp编译成java文件(这个java其实是一个servlet类)

> 然后再把java编译成.class

> 然后创建该类对象

> 最后调用它的service()方法

> 第二次请求同一jsp时,直接调用service()方法。

* 在tomcat的work目录下可以找到jsp对应的.java源代码。

* 查看jsp对应java文件:

> java脚本

> html 5. jsp注释

*<%-- ... --%>:当服务器把jsp编译成java文件时已经忽略了注释部分!

<!--fdsafdsa-->:html注释

=================================

Cookie

1. Http协议与Cookie(了解)

*Cookie是HTTP协议制定的!先由服务器保存Cookie到浏览器,再下次浏览器请求服务器时把上一次请求得到Cookie再归还给服务器

* 由服务器创建保存到客户端浏览器的一个键值对!服务器保存Cookie的响应头:Set-Cookie: aaa=AAA

Set-Cookie: bbb=BBB

> response.addHeader("Set-Cookie","aaa=AAA");response.addHeader("Set-Cookie","bbb=BBB");

* 当浏览器请求服务器时,会把该服务器保存的Cookie随请求发送给服务器。浏览器归还Cookie的请求头:Cookie: aaa=AAA; bbb=BBB

*Http协议规定(保证不给浏览器太大压力):

> 1个Cookie最大4KB

> 1个服务器最多向1个浏览器保存20个Cookie

> 1个浏览器最多可以保存300个Cookie

* 浏览器大战:因为浏览器竞争很激励,所以很多浏览器都会在一定范围内违反HTTP规定,但也不会让一个Cookie为4GB!

2. Cookie的用途

* 服务器使用Cookie来跟踪客户端状态!

* 保存购物车(购物车中的商品不能使用request保存,因为它是一个用户向服务器发送的多个请求信息)

* 显示上次登录名(也是一个用户多个请求)

**********Cookie是不能跨浏览器的!***********

3. JavaWeb中使用Cookie

* 原始方式(了解):

> 使用response发送Set-Cookie响应头

> 使用request获取Cookie请求头

* 便捷方式(精通):

> 使用repsonse.addCookie()方法向浏览器保存Cookie

> 使用request.getCookies()方法获取浏览器归还的Cookie

Cookie第一例:

> 一个jsp保存cookie, a.jsp

//户端访问AServlet,AServlet在响应中添加Cookie,浏览器会自动保存Cookie。

> 另一个jsp获取浏览器归还的cookie! b.jsp

//

然后客户端访问BServlet,这时浏览器会自动在请求中带上Cookie,BServlet获取请求中的Cookie打印出来。 AServlet.java package cn.itcast.servlet;import java.io.IOException;import java.util.UUID;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class AServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html;charset=utf-8");

String id = UUID.randomUUID().toString();//生成一个随机字符串

Cookie cookie = new Cookie("id", id);//创建Cookie对象,指定名字和值

response.addCookie(cookie);//在响应中添加Cookie对象

response.getWriter().print("已经给你发送了ID");

}} BServlet.java package cn.itcast.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class BServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html;charset=utf-8");

Cookie[] cs = request.getCookies();//获取请求中的Cookie

if(cs != null) {//如果请求中存在Cookie

for(Cookie c : cs) {//遍历所有Cookie

if(c.getName().equals("id")) {//获取Cookie名字,如果Cookie名字是id

response.getWriter().print("您的ID是:" + c.getValue());//打印Cookie值

}

}

}

}}

4. Cookie详解

*Cookie不只有name和value两个属性

*Cookie的maxAge(掌握):Cookie的最大生命,即Cookie可保存的最大时长。以秒为单位,例如:cookie.setMaxAge(60)表示这个 Cookie会被浏览器保存到硬盘上60秒

> maxAge>0:浏览器会把Cookie保存到客户机硬盘上,有效时长为maxAge的值决定。

> maxAge<0:Cookie只在浏览器内存中存在,当用户关闭浏览器时,浏览器进程结束,同时Cookie也就死亡了。

> maxAge=0:浏览器会马上删除这个Cookie!

*Cookie的path(理解):

> Cookie的path并不是设置这个Cookie在客户端的保存路径!!!

> Cookie的path由服务器创建Cookie时设置

> 当浏览器访问服务器某个路径时,需要归还哪些Cookie给服务器呢?这由Cookie的path决定。

> 浏览器访问服务器的路径,如果包含某个Cookie的路径,那么就会归还这个Cookie。

> 例如:

<> aCookie.path=/day11_1/;

bCookie.path=/day11_1/jsps/;

Cookie.path=/day11_1/jsps/cookie/;

<> 访问:/day11_1/index.jsp时,归还:aCookie

<> 访问:/day11_1/jsps/a.jsp时,归还:aCookie、bCookie

<> 访问:/day11_1/jsps/cookie/b.jsp时,归还:aCookie、bCookie、cCookie

> Cookie的path默认值:当前访问路径的父路径。例如在访问/day11_1/jsps/a.jsp时,响应的cookie,那么这个cookie的默认path为 /day11_1/jsps/

*Cookie的domain(了解)

> domain用来指定Cookie的域名!当多个二级域中共享Cookie时才有用。

> 例如;www.baidu.com、zhidao.baidu.com、news.baidu.com、tieba.baidu.com之间共享Cookie时可以使用domain

> 设置domain为:cookie.setDomain(".baidu.com");

> 设置path为:cookie.setPath("/");

Cookie中不能存在中文!!!

Cookie的name和value都不能使用中文,如果希望在Cookie中使用中文,那么需要先对中文进行URL编码,然后把编码后的字符串放到Cookie中。 // 保存 Cookie c = new Cookie("username",URLEncoder.encode("张三", "utf-8"));//出错! response.addCookie(c);

String name = URLEncoder.encode("姓名", "UTF-8");

String value = URLEncoder.encode("张三", "UTF-8");

//<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">使用</span><span style="font-size: 12px; font-family: Calibri;">URL</span><span style="font-size: 12px; font-family: 宋体;">编码</span>

Cookie c = new Cookie(name, value);//[编码后的字符串保存到Cookie中]

c.setMaxAge(3600);

response.addCookie(c); // 获取

response.setContentType("text/html;charset=utf-8");

Cookie[] cs = request.getCookies();

if(cs != null) {

for(Cookie c : cs) {

String name = URLDecoder.decode(c.getName(), "UTF-8");//<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">把</span><span style="font-size: 12px; font-family: Calibri;">Cookie</span><span style="font-size: 12px; font-family: 宋体;">的</span><span style="font-size: 12px; font-family: Calibri;">name</span><span style="font-size: 12px; font-family: 宋体;">和</span><span style="font-size: 12px; font-family: Calibri;">value</span><span style="font-size: 12px; font-family: 宋体;">使用</span><span style="font-size: 12px; font-family: Calibri;">URL</span><span style="font-size: 12px; font-family: 宋体;">解码后再打印。</span>

String value = URLDecoder.decode(c.getValue(), "UTF-8");<span style="white-space:pre">

</span>String s = name + ": " + value + "<br/>";

response.getWriter().print(s);

}

} ============================================

HttpSession(*****)

1. HttpSession概述

*HttpSession是由JavaWeb提供的,用来会话跟踪的类。session是服务器端对象,保存在服务器端!!!

*HttpSession是Servlet三大域对象之一(request、session、application(ServletContext)),所以它也有setAttribute()、 getAttribute()、removeAttribute()方法

*HttpSession底层依赖Cookie,或是URL重写!

2. HttpSession的作用

* 会话范围:会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束!

> 会话:一个用户对服务器的多次连贯性请求!所谓连贯性请求,就是该用户多次请求中间没有关闭浏览器!

* 服务器会为每个客户端创建一个session对象,session就好比客户在服务器端的账户,它们被服务器保存到一个Map中,这个Map被称 之为session缓存!

> Servlet中得到session对象:HttpSession session = request.getSession();

> Jsp中得到session对象:session是jsp内置对象之下,不用创建就可以直接使用!

*session域相关方法:

> void setAttribute(String name, Object value);

> Object getAttribute(String name);

> void removeAttribute(String name);

3. 案例1:演示session中会话的多次请求中共享数据

*AServlet:向session域中保存数据

*BServlet:从session域中获取数据

* 演示:

> 第一个请求:访问AServlet

> 第二个请求:访问BServlet

4. 案例2:演示保存用户登录信息(精通)

* 案例相关页面和Servlet:

> login.jsp:登录页面

> succ1.jsp:只有登录成功才能访问的页面

> succ2.jsp:只有登录成功才能访问的页面

> LoginServlet:校验用户是否登录成功!

* 各页面和Servlet内容:

> login.jsp:提供登录表单,提交表单请求LoginServlet

> LoginServlet:获取请求参数,校验用户是否登录成功

<> 失败:保存错误信息到request域,转发到login.jsp(login.jsp显示request域中的错误信息)

<> 成功:保存用户信息到session域中,重定向到succ1.jsp页面,显示session域中的用户信息

> succ1.jsp:从session域获取用户信息,如果不存在,显示“您还没有登录”。存在则显示用户信息

> succ2.jsp:从session域获取用户信息,如果不存在,显示“您还没有登录”。存在则显示用户信息

只要用户没有关闭浏览器,session就一直存在,那么保存在session中的用户信息也就一起存在!那么用户访问succ1和succ2就会通过 login.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>

<head>

<title>login.jsp</title>

</head>

<body><%-- 本页面提供登录表单,还要显示错误信息 --%><h1>登录</h1><%/*读取名为uname的Cookie!如果为空显示:""如果不为空显示:Cookie的值*/String uname = "";Cookie[] cs = request.getCookies();//获取请求中所有的cookieif(cs != null) {// 如果存在cookie<span style="white-space:pre">

</span>for(Cookie c : cs) {//循环遍历所有的cookie<span style="white-space:pre">

</span>if("uname".equals(c.getName())) {//查找名为uname的cookie<span style="white-space:pre">

</span>uname = c.getValue();//获取这个cookie的值,给uname这个变量<span style="white-space:pre">

</span>}<span style="white-space:pre">

</span>}}%><%<span style="white-space:pre">

</span>String message = "";<span style="white-space:pre">

</span>String msg = (String)request.getAttribute("msg");//获取request域中的名为msg的属性<span style="white-space:pre">

</span>if(msg != null) {<span style="white-space:pre">

</span>message = msg;<span style="white-space:pre">

</span>}%><font color="red"><b><%=message %> </b></font><form action="/day11_3/LoginServlet" method="post"><span style="white-space:pre">

</span><%-- 把cookie中的用户名显示到用户名文本框中 --%><span style="white-space:pre">

</span>用户名:<input type="text" name="username" value="<%=uname%>"/><br/><span style="white-space:pre">

</span>密 码:<input type="password" name="password"/><br/><span style="white-space:pre">

</span><input type="submit" value="登录"/></form>

</body></html> index1.jsp(succ1, 2略) <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>

<head>

<title>index1.jsp</title>

</head>

 <body><h1>succ1</h1><%String username = (String)session.getAttribute("username");if(username == null) {<span style="white-space:pre">

</span>/*<span style="white-space:pre">

</span>1. 向request域中保存错误信息,转发到login.jsp<span style="white-space:pre">

</span>*/<span style="white-space:pre">

</span>request.setAttribute("msg", "您还没有登录,不要冒充领导!");<span style="white-space:pre">

</span>request.getRequestDispatcher("/session2/login.jsp").forward(request, response);<span style="white-space:pre">

</span>return;}%>欢迎欢迎,热烈欢迎,欢迎<%=username %>领导指导工作!

</body></html> LoginServlet public class LoginServlet extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

/*

* 1. 获取表单数据

*/

// 处理中文问题

request.setCharacterEncoding("utf-8");

// 获取

String username = request.getParameter("username");

String password = request.getParameter("password");

/*

* 2. 校验用户名和密码是否正确

*/

if(!"itcast".equalsIgnoreCase(username)) {//登录成功

/*

* 附加项:把用户名保存到cookie中,发送给客户端浏览器

* 当再次打开login.jsp时,login.jsp中会读取request中的cookie,把它显示到用户名文本框中

*/

Cookie cookie = new Cookie("uname", username);//创建Cookie

cookie.setMaxAge(60*60*24);//设置cookie命长为1天

response.addCookie(cookie);//保存cookie

/*

* 3. 如果成功

*

>

保存用户信息到session中

*

>

重定向到succ1.jsp

*/

HttpSession session = request.getSession();//获取session

session.setAttribute("username", username);//向session域中保存用户名

response.sendRedirect("/day11_3/session2/succ1.jsp");

} else {//登录失败

/*

* 4. 如果失败

*

> 保存错误信息到request域中

*

> 转发到login.jsp

*/

request.setAttribute("msg", "用户名或密码错误!");

RequestDispatcher qr = request.getRequestDispatcher("/session2/login.jsp");//得到转发器

qr.forward(request, response);//转发

}

}} 通过cookie保存登陆名

5. HttpSession原理(理解)

*request.getSession()方法:

> 获取Cookie中的JSESSIONID:

<> 如果sessionId不存在,创建session,把session保存起来,把新创建的sessionId保存到Cookie中

<> 如果sessionId存在,通过sessionId查找session对象,如果没有查找到,创建session,把session保存起来,把新创建的 sessionId保存到Cookie中

<> 如果sessionId存在,通过sessionId查找到了session对象,那么就不会再创建session对象了。

<> 返回session

> 如果创建了新的session,浏览器会得到一个包含了sessionId的Cookie,这个Cookie的生命为-1,即只在浏览器内存中存在,如果 不关闭浏览器,那么Cookie就一直存在。

> 下次请求时,再次执行request.getSession()方法时,因为可以通过Cookie中的sessionId找到session对象,所以与上一次请求使 用的是同一session对象。

* 服务器不会马上给你创建session,在第一次获取session时,才会创建!request.getSession();

*request.getSession(false)、request.getSession(true)、request.getSession(),后两个方法效果相同,

> 第一个方法:如果session缓存中(如果cookie不存在),不存在session,那么返回null,而不会创建session对象。

6. HttpSession其他方法:

*String getId():获取sessionId;

*int getMaxInactiveInterval():获取session可以的最大不活动时间(秒),默认为30分钟。当session在30分钟内没有使用,那么 Tomcat会在session池中移除这个session;

*void invalidate():让session失效!调用这个方法会被session失效,当session失效后,客户端再次请求,服务器会给客户端创建 一个新的session,并在响应中给客户端新session的sessionId;

*boolean isNew():查看session是否为新。当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端, 也就是还没有把sessionId响应给客户端时,这时session的状态为新。

7. web.xml中配置session的最大不活动时间

<session-config>

<session-timeout>30</session-timeout>

</session-config>

8. URL重写(理解)

就是把所有的页面中的路径,都使用response.encodeURL("..")处理一下!

*session依赖Cookie,目的是让客户端发出请求时归还sessionId,这样才能找到对应的session

* 如果客户端禁用了Cookie,那么就无法得到sessionId,那么session也就无用了!

* 也可以使用URL重写来替代Cookie

> 让网站的所有超链接、表单中都添加一个特殊的请求参数,即sessionId

<body><h1>URL重写</h1><a href='/day06_5/index.jsp;jsessionid=<%=session.getId() %>'[请求注意,在index.jsp后面使用的是分号,而不是问号,这是服务器对jsessionid这个参数的特殊要求。] >主页</a><form action='/day06_5/index.jsp;jsessionid=<%=session.getId() %>' method="post">

<input type="submit" value="提交"/></form>

</body>PS: 请求注意,在 index.jsp 后面使用的是分号,而不是问号,这是服务器对 jsessionid 这个参数的特殊要求。

> 这样服务器可以通过获取请求参数得到sessionId,从而找到session对象。

*response.encodeURL(String url)

> 该方法会对url进行智能的重写:当请求中没有归还sessionid这个cookie,那么该方法会重写url,否则不重写!当然url必须是指 向本站的url。 <a href='<%=response.encodeURL("/day06_5/index.jsp") %>' >主页</a><form action='<%=response.encodeURL("/day06_5/index.jsp") %>' method="post">

<input type="submit" value="提交"/></form>

9. 一次性图形验证码

* 编写VerifyCode,用来生成一次图形验证码

* 编写VerfiyServlet:

> 使用VerfiyCode来生成图形验证码

> 把文本保存到session中

> 把图片响应给客户。

* 在login.jsp页面中

> <img>元素请求VerfiyServlet,页面中显示图形验证码

> 表单给出用户输入的验证码

* 在LoginServlet中

> 获取用户输入的验证码,请求参数!!!

> 获取session中保存的真正的验证码文本,这是在打开login.jsp时已经保存到session中的

> 比较用户输入的验证码与session中真正的验证码 画图类使用

@Test

public void fun1() throws FileNotFoundException, IOException {

/*

* 1. 创建图片缓冲区

* 2. 设置其宽高

* 3. 得到这个图片的绘制环境(得到画笔)

* 4. 保存起来

*/

BufferedImage bi = new BufferedImage(70, 35, BufferedImage.TYPE_INT_RGB);

Graphics2D g = (Graphics2D)bi.getGraphics();//得到绘制环境

g.setColor(Color.WHITE);//把环境设置为白色

g.fillRect(0, 0, 70, 35);//填充矩形!填充矩形,从0,0点开始,宽70,高35,即整个图片,即为图片设置背景色

g.setColor(Color.RED);//把环境设置为红色

g.drawString("Hello", 2, 35-2);//向图片上写入字符串,其中2,2表示x,y轴的坐标

ImageIO.write(bi, "JPEG", new FileOutputStream("F:/xxx.jpg"));

}

@Test

public void fun2() throws FileNotFoundException, IOException {

VerifyCode vc = new VerifyCode();

BufferedImage bi = vc.getImage();

VerifyCode.output(bi, new FileOutputStream("F:/xxx.jpg"));

System.out.println(vc.getText());

} 一次性图形验证码源码 public class VerifyCode {

private int w = 70;

private int h = 35;

private Random r = new Random();

// {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}

private String[] fontNames

= {"宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"};

// 可选字符

private String codes

= "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";

// 背景色

private Color bgColor

= new Color(255, 255, 255);

// 验证码上的文本

private String text ;

// 生成随机的颜色

private Color randomColor () {

int red = r.nextInt(150);

int green = r.nextInt(150);

int blue = r.nextInt(150);

return new Color(red, green, blue);

}

// 生成随机的字体

private Font randomFont () {

int index = r.nextInt(fontNames.length);

String fontName = fontNames[index];//生成随机的字体名称

int style = r.nextInt(4);//生成随机的样式, 0(无样式), 1(粗体), 2(斜体), 3(粗体+斜体)

int size = r.nextInt(5) + 24; //生成随机字号, 24 ~ 28

return new Font(fontName, style, size);

}

// 画干扰线

private void drawLine (BufferedImage image) {

int num

= 3;//一共画3条

Graphics2D g2 = (Graphics2D)image.getGraphics();

for(int i = 0; i < num; i++) {//生成两个点的坐标,即4个值

int x1 = r.nextInt(w);

int y1 = r.nextInt(h);

int x2 = r.nextInt(w);

int y2 = r.nextInt(h);

g2.setStroke(new BasicStroke(1.5F));

g2.setColor(Color.BLUE); //干扰线是蓝色

g2.drawLine(x1, y1, x2, y2);//画线

}

}

// 随机生成一个字符

private char randomChar () {

int index = r.nextInt(codes.length());

return codes.charAt(index);

}

// 创建BufferedImage

private BufferedImage createImage () {

BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

Graphics2D g2 = (Graphics2D)image.getGraphics();

g2.setColor(this.bgColor);

g2.fillRect(0, 0, w, h);

return image;

}

// 调用这个方法得到验证码

public BufferedImage getImage () {

BufferedImage image = createImage();//创建图片缓冲区

Graphics2D g2 = (Graphics2D)image.getGraphics();//得到绘制环境

StringBuilder sb = new StringBuilder();//用来装载生成的验证码文本

// 向图片中画4个字符

for(int i = 0; i < 4; i++)

{//循环四次,每次生成一个字符

String s = randomChar() + "";//随机生成一个字母

sb.append(s); //把字母添加到sb中

float x = i * 1.0F * w / 4; //设置当前字符的x轴坐标

g2.setFont(randomFont()); //设置随机字体

g2.setColor(randomColor()); //设置随机颜色

g2.drawString(s, x, h-5); //画图

}

this.text = sb.toString(); //把生成的字符串赋给了this.text

drawLine(image); //添加干扰线

return image;

}

// 返回验证码图片上的文本

public String getText () {

return text;

}

// 保存图片到指定的输出流

public static void output (BufferedImage image, OutputStream out)

throws IOException {

ImageIO.write(image, "JPEG", out);

}} VerifyCodeServlet public class VerifyCodeServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

/*

* 1. 生成图片

* 2. 保存图片上的文本到session域中

* 3. 把图片响应给客户端

*/

VerifyCode vc = new VerifyCode();

BufferedImage image = vc.getImage();

request.getSession().setAttribute("session_vcode", vc.getText());//保存图片上的文本到session域

VerifyCode.output(image, response.getOutputStream());

}} 增加了验证码的login <script type="text/javascript">function _change() {

/*

1. 得到img元素

2. 修改其src为/day11_3/VerifyCodeServlet

*/

var imgEle = document.getElementById("img");

imgEle.src = "/day11_3/VerifyCodeServlet?a=" + new Date().getTime();}</script>

</head>

<body><%-- 本页面提供登录表单,还要显示错误信息 --%><h1>登录</h1><%/*读取名为uname的Cookie!如果为空显示:""如果不为空显示:Cookie的值*/String uname = "";Cookie[] cs = request.getCookies();//获取请求中所有的cookieif(cs != null) {// 如果存在cookie

for(Cookie c : cs) {//循环遍历所有的cookie

if("uname".equals(c.getName())) {//查找名为uname的cookie

uname = c.getValue();//获取这个cookie的值,给uname这个变量

}

}}%><%

String message = "";

String msg = (String)request.getAttribute("msg");//获取request域中的名为msg的属性

if(msg != null) {

message = msg;

}%><font color="red"><b><%=message %> </b></font><form action="/day11_3/LoginServlet" method="post">

<%-- 把cookie中的用户名显示到用户名文本框中 --%>

用户名:<input type="text" name="username" value="<%=uname%>"/><br/>

密 码:<input type="password" name="password"/><br/>

验证码:<input type="text" name="verifyCode" size="3"/>

<img id="img" src="/day11_3/VerifyCodeServlet"/>

<a href="javascript:_change()">换一张</a>

<br/>

<input type="submit" value="登录"/></form>

</body></html> LoginServlet验证码部分 /*

* 校验验证码

* 1. 从session中获取正确的验证码

* 2. 从表单中获取用户填写的验证码

* 3. 进行比较!

* 4. 如果相同,向下运行,否则保存错误信息到request域,转发到login.jsp

*/

String sessionCode = (String) request.getSession().getAttribute("session_vcode");

String paramCode = request.getParameter("verifyCode");

if(!paramCode.equalsIgnoreCase(sessionCode)) {

request.setAttribute("msg", "验证码错误!");

request.getRequestDispatcher("/session2/login.jsp").forward(request, response);

return;

}

主要内容: 1. JSP基础 2. Cookie 3. HttpSession   ================================   JSP基础   1. jsp的作用:   *Servlet:    > 缺点:不适合设置html响应体,需要大量的response.getWri

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。