四月份4日 转发与重定向、Cookie、Session、验证码
转发与重定向
·重定向 重新确定浏览器发给服务器的请求方向
·发送者:服务器---->response响应浏览器
·执行者:浏览器---->request 重新发送请求
doGet 、doPost(HttpServletRequest,HttpServletResponse)
重定向:服务器通知浏览器,重新发送请求
参数:确定重新发送的绝对路径url
sendRedirect(String ) 将其跳转到指定的路径
相当于超链接
跳转到百度:
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 TiaoZhuanBaiDu extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendRedirect("http://www.baidu.com");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
转发:
操作地点:服务器
调用一个方法,指向另一个servlet
请求未完成,服务器的请求继续操作
getRequestDispatcher(String path)
参数:目标servlet的相对路径,
如果以“/”开头,指的是context root ,项目名/
返回RequestDispatcher
转发操作:调用服务器端方法
dispatcher.forward(request,response)--->
当调度器协调多个servlet时,此方法返回最后一个servlet的页面输出内容,将会去执行下一个页面。
两个Servlet使用的get/post方法是一样的。
之后的那个Servlet必须与调用的Servlet使用的流相同。
* 何时使用
* 重定向:可以指定当前web项目的URL,也可以指定其他web资源
* 转发:只能指定当前的web项目URL
* 确定使用
* 重定向:在第一次请求中设置值,在重定向后不能获取。两次请求,tomcat创建了两个request
完成跳转功能,选重定向
* 转发:设置的值可以在其他servlet或资源中使用。
多个servlet需要传递数据时,现在转发。
* 总结:
* 请求次数
* 重定向:请求2次,tomcat创建了两个request对象
* 转发:请求1次,tomcat创建了2个request对象
include方法
合并当前所有执行页面的输出内容
forward方法
显示最后一个输出的内容
关于“/”路径问题:
浏览器: localhost:8080
服务器: localhost:8080/Webname
会话: 当访问web资源之后,通过连接连续请求当前站点的资源,然后关闭浏览器的整个过程。
会话技术: cookie,session
Cookie 将服务器的数据保存到浏览器端的技术。
要求保存数据:服务器
保存数据:浏览器
·IE中,将cookie保存到指定目录中,以文件的形式存储。
·火狐或谷歌:将cookie保存到指定的文件中。
使用HTTP协议进行通信:
1.创建cookie
2.使用response中的addCookie(cookie)
request中的getCookies(); 返回一个数组,包含所有的cookie。
Cookie类中 getName,getValue获取名称和值
遍历cookie的时候,要用判断确定非空。
//实例:
import java.io.IOException;
import java.io.PrintWriter;
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 MyCookie01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset:UTF-8");
request.setCharacterEncoding("UTF-8");
Cookie[] cookies = request.getCookies();
Cookie cookie = new Cookie("name","ly");
Cookie cookie2 = new Cookie("age","22");
response.addCookie(cookie);
response.addCookie(cookie2);
if(cookies != null)
{
for(Cookie cook : cookies)
{
System.out.println(cook.getName()+"::"+cook.getValue());
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
持久化Cookie
Cookie类中:
setMaxAge(int) 设置cookie的有效时间 in second(单位为秒)
//设置cookie的有效时间,使会话级cookie变成持久化cookie
//创建cookie
//设置有效时间(60*60*24的格式)
//通知浏览器
getCookies() 获得当前servlet以及之上所有目录下的cookie信息
将当前servlet设置的cookie
Cookie修改路径 setpath(String url)
ISO8859-1不能处理中文。
Cookie中文:
如果直接使用中文作为cookie的值,将报500异常,即非法参数值
先编码,再解码
1,。编码 URLEncoder.encode(String , 字符集)
2. 解码 URLDecoder.decode(String , 字符集)
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
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 mineCookie extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String cn = "中文";
String bm = URLEncoder.encode(cn, "UTF-8");
Cookie cookie = new Cookie("cn",bm);
response.addCookie(cookie);
Cookie[] cookies = request.getCookies();
if(cookies != null)
{
for(Cookie c : cookies)
{
if("cn".equals(c.getName()))
{
String values = URLDecoder.decode(c.getValue(),"UTF-8");
out.println("name:"+c.getName());
out.println("<br/>");
out.println("value:"+values);
}
}
}
}
}
Cookie的最大value长度:4kb
由于cookie的数据大小有限,因此,将数据存入服务器端,通过cookie关联。
session:前提:必须使用cookie
在request中,有getSession方法;返回HttpSession。
可以传入布尔值作为参数,确定是否创建
httpSession中有一个方法 isNew() 判断是否为最新创建的。
Session:tomcat创建,销毁:30分钟
URL重写技术:
Session也是会话级技术
response.encodeURL(String) 返回String
encodeURL和encodeRedirectURL之间的区别:
当参数为null的时候,二者不同。一般情况下选择前者。
注意:参数url必须有效,否则返回没有改变的url。
“/”表示 WebRoot目录
Response.encodeURL(String) 如果参数为null,返回绝对路径。
如果需要sessionId,则在url后面追加
一次性验证码:
写两个Servlet,
第一个: 生成验证码
第二个: 用户写入的数据与验证码对比
生成图片,随机获取4个字母,
之后的servlet程序需要匹配,保存当前的session
Servlet1 获得一张图片
BufferedImage类 缓存图片
//创建图片:
BufferedImage image = new BufferedImage(width,height,imageType)
字段TYPE_INT_RGB 用于三原色
创建图层,即获得画板:
getGraphics() 返回 Graphics
确定背景色: Graphics中的setColor()
填充: fillRect(x,y,width,height)
通知浏览器,发送的数据是一张图片:
setContentType(“image/jpeg”)
将图片发送给浏览器:
ImageIO类 write(RenderImage,String name,OutputStream)
RenderImage是BufferedImage的父类
name中,使用非正式的命名,如jpg
只需要一个边框:再画一个矩形(长宽都比原矩形小1像素),覆盖原矩形
设置字体: setFont(new Font(字体,类型,大小))
填充字符:
1.创建字符串
2.随即获取4个字符
3.将字符写入图片中 Graphics 中的 drawString(string,x,y)
干扰线:
Graphics中的drawline(x1,y1,x2,y2)
验证:
另一个Servlet
获取用户输入的值:
Request.getParameter(String);
缓存验证码中的字符
判断从session中获得的数据是否与用户的输入数据一致
//Servlet01 用于写一个验证码
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class YanZhengMa01Servlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Random rand = new Random();
//写一个矩形 宽80,高40,黑背景
BufferedImage bufImg = new BufferedImage(80, 40, BufferedImage.TYPE_INT_RGB);
Graphics graph = bufImg.getGraphics();
graph.fillRect(0, 0, 80, 40);
graph.setColor(Color.BLACK);
//再写一个矩形,随机色
graph = bufImg.getGraphics();
graph.setColor(new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255)));
graph.fillRect(1, 1, 78, 38);
//写入字符串
String dataAll = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
//缓存数据:
StringBuffer sb = new StringBuffer();
for(int i = 0 ; i < 4; i++)
{
int index = rand.nextInt(62);
String str = dataAll.substring(index,index+1);
graph.setFont(new Font("宋体", Font.BOLD, 28));
graph.setColor(new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255)));
graph.drawString(str, i*20, 30);
sb.append(str);
}
String str = sb.toString();
//获取Session 保存值
HttpSession session = request.getSession();
session.setAttribute("number", str);
//画干扰线
for(int i = 0;i < 10; i++)
{
graph.drawLine(rand.nextInt(80), rand.nextInt(40), rand.nextInt(80), rand.nextInt(40));
}
//发送到浏览器
response.setContentType("image/jpeg");
ImageIO.write(bufImg, "jpg",response.getOutputStream());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
//网页
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>index.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<form action="/YanZheng/yzs" method="post">
<input type="text" name="images"/><img src="http://localhost:8080/YanZheng/YZMServlet" /> <br/>
<input type="submit"/>
</form>
</body>
</html>
//另一个验证的Servlet
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;
import javax.servlet.http.HttpSession;
public class YanZheng02 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
//获取用户提交的数据:
String imgs = request.getParameter("images");
//获取验证码上的字符
HttpSession sessions = request.getSession();
String value = (String)sessions.getAttribute("number");
if(imgs != null)
{
if(imgs.equalsIgnoreCase(value))
{
pw.println("验证码正确!!");
}
else
{
pw.println("输入错误!!");
}
}
sessions.removeAttribute("number");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
一次性表单的URL重写
Response.encode(url)