四月份4日 转发与重定向、Cookie、Session、验证码

4月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

请求未完成,服务器的请求继续操作

getRequestDispatcherString path

参数:目标servlet的相对路径,

如果以“/”开头,指的是context root ,项目名/

返回RequestDispatcher

 

转发操作:调用服务器端方法

dispatcher.forwardrequest,response--->

当调度器协调多个servlet时,此方法返回最后一个servlet的页面输出内容,将会去执行下一个页面。

两个Servlet使用的get/post方法是一样的。

之后的那个Servlet必须与调用的Servlet使用的流相同。

 

何时使用

重定向:可以指定当前web项目的URL,也可以指定其他web资源

转发:只能指定当前的web项目URL

确定使用

重定向:在第一次请求中设置值,在重定向后不能获取。两次请求,tomcat创建了两个request

 完成跳转功能,选重定向

转发:设置的值可以在其他servlet或资源中使用。

 多个servlet需要传递数据时,现在转发。

总结:

请求次数

重定向:请求2次,tomcat创建了两个request对象

转发:请求1次,tomcat创建了2request对象

 

 

include方法

合并当前所有执行页面的输出内容

 

forward方法 

显示最后一个输出的内容

 

 

关于“/”路径问题:

浏览器: localhost:8080

服务器: localhost8080/Webname

 

 

 

会话: 当访问web资源之后,通过连接连续请求当前站点的资源,然后关闭浏览器的整个过程。

 

会话技术: cookiesession

 

Cookie 将服务器的数据保存到浏览器端的技术。

要求保存数据:服务器

保存数据:浏览器

·IE中,将cookie保存到指定目录中,以文件的形式存储。

·火狐或谷歌:将cookie保存到指定的文件中。

使用HTTP协议进行通信:

1.创建cookie

2.使用response中的addCookiecookie

request中的getCookies(); 返回一个数组,包含所有的cookie

Cookie类中 getNamegetValue获取名称和值

 

遍历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类中:

setMaxAgeint) 设置cookie的有效时间 in second(单位为秒)

 

 

//设置cookie的有效时间,使会话级cookie变成持久化cookie

 

//创建cookie

 

//设置有效时间(60*60*24的格式)

 

//通知浏览器

 

 

getCookies() 获得当前servlet以及之上所有目录下的cookie信息

 

将当前servlet设置的cookie

 

 

Cookie修改路径 setpathString url

 

 

ISO8859-1不能处理中文。

 

Cookie中文:

如果直接使用中文作为cookie的值,将报500异常,即非法参数值

 

先编码,再解码

1,。编码  URLEncoder.encodeString , 字符集)

2.  解码  URLDecoder.decodeString , 字符集)

 

 

 

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() 判断是否为最新创建的。

Sessiontomcat创建,销毁:30分钟

 

 

 

URL重写技术:

Session也是会话级技术

 

response.encodeURL(String) 返回String

 

encodeURLencodeRedirectURL之间的区别:

当参数为null的时候,二者不同。一般情况下选择前者。

 

注意:参数url必须有效,否则返回没有改变的url

 

/”表示 WebRoot目录

Response.encodeURLString) 如果参数为null,返回绝对路径。

如果需要sessionId,则在url后面追加

 

 

一次性验证码:

写两个Servlet

第一个: 生成验证码

第二个: 用户写入的数据与验证码对比

 

生成图片,随机获取4个字母,

之后的servlet程序需要匹配,保存当前的session

 

 

 

Servlet1 获得一张图片

 

BufferedImage类  缓存图片

//创建图片:

BufferedImage image = new BufferedImagewidthheightimageType

 

字段TYPE_INT_RGB 用于三原色

 

创建图层,即获得画板:

getGraphics() 返回 Graphics

 

 

确定背景色: Graphics中的setColor() 

填充: fillRectx,y,width,height

 

通知浏览器,发送的数据是一张图片:

setContentType(“image/jpeg”)

 

将图片发送给浏览器:

ImageIO类 writeRenderImageString nameOutputStream

 

 

RenderImageBufferedImage的父类

name中,使用非正式的命名,如jpg

 

 

只需要一个边框:再画一个矩形(长宽都比原矩形小1像素),覆盖原矩形

 

设置字体: setFont(new Font(字体,类型,大小))

填充字符:

1.创建字符串

2.随即获取4个字符

3.将字符写入图片中 Graphics 中的 drawStringstringx,y

 

 

干扰线:

Graphics中的drawlinex1,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/csshref="./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)