JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)
1、转发和重定向
HttpServletResponse response
转发:
RequestDispatcher dispatcher = request.getRequestDispatcher("/secondServlet");
request.setAttribute("pwd","123");//这里设置的值在secondServlet中可以获取到
dispatcher.forward(request, response);//调用forward方法时会调用secondServlet中的doGet方法
//等到forward方法执行完毕后才会执行下面的代码
System.out.println("secondServlet执行完了");
重定向:
String url = "http://www.baidu.com";
response.sendRedirect(url);
* 对比
* 何时使用
* 重定向:可以指定当前web项目的URL,也可以指定其他web资源
* 转发:只能指定当前的web项目URL
* 确定使用
* 重定向:在第一次请求中设置值,在重定向后不能获取。两次请求,tomcat创建了两个request
* 完成跳转功能,选重定向
* 转发:设置的值可以在其他servlet或资源中使用。
* 多个servlet需要传递数据时,用转发。
* 总结:
* 请求次数
* 重定向:请求2次,tomcat创建了两个request对象
* 转发:请求1次,tomcat创建了2个request对象
* 将第一个request中的内容,拷贝给第二个request。值相同
* 浏览器地址栏是否修改
* 重定向:修改,看到跳转后页面的内容
* 转发:没有修改,看到的转发后最后一个servlet响应的内容
* request设置的值,是否共享
* 重定向:数据不共享
* 转发:数据共享 2、会话:当访问web资源之后,通过连接继续请求当前站点的资源,然后关闭浏览器的整个过程。
* 会话技术:cookie、session
* cookie:
* request.getCookies();获得当前web项目的所有的cookie信息
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for(Cookie c : cookies){
System.out.println(c.getName()+":"+c.getValue());
}
}
Cookie cookie = new Cookie("aa","aavalue");
cookie.setMaxAge(60*60*24);//单位是秒
cookie.setPath("/demo/");
response.addCookie(cookie); * 通过setPath可以设置cookie的访问路径
* 在cookie中存放中文
* 编码:String returnData = URLEncoder.encode(data, "UTF-8");
* 解码:String value = URLDecoder.decode(c.getValue(), "UTF-8");
* cookie的value可以设置多少个字符:4kb
* session:服务器在服务器端创建一个内存区域,用来存放当前用户的所有信息,通过cookie关联。
* 前提:必须使用cookie
* session:
* tomcat创建
* 销毁:30分钟
//获得session对象
HttpSession session = request.getSession();
//保存值
session.setAttribute("number", "abcd");
//获得保存的值number
String number = (String)session.getAttribute("number");
//移除值number
session.removeAttribute("number");
* URL重写
* 一般情况选择encodeURL
* 两个方法区别在于,如果参数为空字符串,返回结果不同。
public String encodeURL(String url) { String absolute = toAbsolute(url);
if (isEncodeable(absolute)) {
// W3c spec clearly said
if (url.equalsIgnoreCase("")){ //****
url = absolute;
}
return (toEncoded(url, request.getSessionInternal().getIdInternal()));
} else {
return (url);
} } public String encodeRedirectURL(String url) { if (isEncodeable(toAbsolute(url))) {
return (toEncoded(url, request.getSessionInternal().getIdInternal()));
} else {
return (url);
} }
* 注意:参数url必须有效,否则返回没有改变的URL
* 当使用"/"开头,相对于web站点
* response.encodeURL("/day07/urlSessionServlet2")//如果需要sessionid,则在地址中追加
* /day07/urlSessionServlet2;jsessionid=F85DB5EFDDB9A6B170AF2B4959EFC4FC
* 获得Web的绝对路径
String absolute = toAbsolute(url);
* http://localhost:8080/day07/
* 总结:
* 需要考虑用户的Cookie是否禁用了
* 将所有的链接全部进行URL重写(过滤器) 3.验证码实例
GetImageServlet.java
package com.yxl.servlet; import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
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 GetImageServlet 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 {
// 获得一张图片 // 创建图片 -- 在内存中
int width = 80;
int height = 40;
BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); // 创建图层,获得画板
Graphics g = image.getGraphics();
// 确定画笔颜色
g.setColor(Color.BLACK);
// 填充一个矩形
g.fillRect(0, 0, width, height);
// 只需要一个边框
// 设置颜色
g.setColor(Color.WHITE);
// 填充一个矩形
g.fillRect(1, 1, width - 2, height - 2); // 填充字符
String data = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
// 设置字体
g.setFont(new Font("宋体", Font.BOLD, 30)); // 缓存随机生成的字符
StringBuffer buf = new StringBuffer(); // 随机获得4个字符
Random random = new Random();
for (int i = 0; i < 4; i++) {
// 设置随机颜色
g.setColor(new Color(random.nextInt(255), random.nextInt(255),
random.nextInt(255)));
// 获得一个随机字符
int index = random.nextInt(62);
// 截取字符串
String str = data.substring(index, index + 1); // [)
// 需要将随机的字符,写到图片中
g.drawString(str, 20 * i, 30);
// 缓存
buf.append(str);
} // 将获得随机字符串,保存到session
// * 获得session
HttpSession session = request.getSession();
// * 保存值
session.setAttribute("number", buf.toString()); // 干扰线
for (int i = 0; i < 10; i++) {
// 设置随机颜色
g.setColor(new Color(random.nextInt(255), random.nextInt(255),
random.nextInt(255)));
// 随机画直线
g.drawLine(random.nextInt(width), random.nextInt(height),
random.nextInt(width), random.nextInt(height));
} /**
* <extension>jpg</extension> <mime-type>image/jpeg</mime-type>
*/
// 通知浏览器发送的数据时一张图片
response.setContentType("image/jpeg");
// 将图片发送给浏览器
ImageIO.write(image, "jpg", response.getOutputStream()); } } LoginServlet.java
package com.yxl.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 LoginServlet 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"); // 获得用户提交的数据 imageNumber
String imageNumber = request.getParameter("imageNumber");
// 需要判断 从session获得保存的验证码的信息
// * 获得session
HttpSession session = request.getSession();
// * 获得保存的值number
String number = (String) session.getAttribute("number"); PrintWriter out = response.getWriter(); // 匹配 用户提交的数据与程序保存的数据
if (number != null) { // 程序保存
if (number.equalsIgnoreCase(imageNumber)) {
// 输入正确
out.print("验证通过");
} else {
// 验证码错误
out.print("验证码错误");
}
// 无论情况,程序存储的数据,只能使用一次
session.removeAttribute("number");
} else {
out.print("验证码失效");
} } } 在WebRoot新建login.html页面
<!DOCTYPE html>
<html>
<head>
<title>1.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body>
<form action="/20141123/loginServlet" method="post">
<input type="text" name="imageNumber" /> <img src="/20141123/getImageServlet"/> <br/>
<input type="submit"/>
</form>
</body>
</html> 4.URLConnection使用(下载网页)
package com.yxl.demo; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner; public class UrlConnectionDemo { public static void main(String[] args) throws IOException {
// URL类对web资源的定位
URL url = new URL("http://localhost:8080/20141123/login.html");
// 获得连接 ,做准备
URLConnection conn = url.openConnection();
// 必须确定当前请求,是否可以读写
conn.setDoInput(true); // 确定是否可以读,默认是true
conn.setDoOutput(true);// 确定是否可以写,默认是false // 准备发送的数据 -- request填充
OutputStream out = conn.getOutputStream();
// out.write("user=abcd1234".getBytes()); //此方法将内容写到http请求体中 // 连接
// conn.connect();
// 建立链接之后,获得web资源
InputStream is = conn.getInputStream(); // 会自动链接,只有调用方法,整个请求才生效
// byte[] buf = new byte[];
// int len = -1;
// while( (len = is.read(buf)) > -1 ){
// String str = new String(buf,0,len);
// System.out.println(str);
// }
Scanner scanner = new Scanner(is);
while (scanner.hasNext()) {
System.out.println("url -->" + scanner.nextLine());
}
is.close(); } }
JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)的更多相关文章
- java ->会话技术Cookie&Session
会话技术Cookie&Session 会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户 ...
- Web核心之会话技术Cookie&Session
什么是会话技术? http协议是无状态协议.为了满足在多次请求之间数据进行交互,推出了会话技术. 会话概念:一次会话,指的是从客户端和服务器建立起连接开始,到客户端或服务器断开连接为止.中间可能进行多 ...
- JavaWeb学习笔记五 会话技术Cookie&Session
什么是会话技术? 例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话 ...
- javaWeb学习总结(6)- 会话之cookie技术
什么是会话? 在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话. 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为 ...
- JavaEE之会话技术Cookie&Session
会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪 里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并 ...
- 会话技术Cookie&Session
1.会话技术概述 从打开浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话.会话技术用于记录本次会话中客户端的状态与数据. 会话技术分为Cookie和Session: Cookie:数据存储 ...
- 03012_会话技术Cookie&Session
1.会话技术简介 (1)存储客户端的技术 网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识 ...
- Django2.2 会话技术cookie session token的区别以及实例介绍
一.区别: 本人见解:使用自定义数据项进行加密,作为唯一身份识别,登陆时写入cookie(session基于这个).在显示相关数据 1.cookie 属于客户端会话技术(数据存储在客户端) 默认的Co ...
- 会话技术 Cookie+Session
会话:这种在多次HTTP连接间维护用户与同一用户发出的不同请求之间关联的情况称为维护一个会话(session) 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开: 功能:在一次会话 ...
随机推荐
- GR32 TImage32的图层绘制原理
转载:http://blog.sina.com.cn/s/blog_491aced20100ded4.html TImage32的继承顺序如下:TCustomControl->TCustomPa ...
- livezilla账号或密码修改方法
livezilla的账号和密码不在数据库,保存在php文件里面. 今天想修改一下网站livezilla系统管理员账号和密码,去数据库找了半天没找到,推测可能是存在文件中.搜索了一下,果然是在livez ...
- Python自动化之socket初识
1. os.popen() os.system(cmd)会直接输出命令的结果到屏幕上,返回一个状态码0或1. os.popen(cmd)会返回一个<open file 'dir', mode ' ...
- ubuntu查找软件包
sudo apt-cache search s_name
- Git SourceTree 冲突解决方案
Git现在越来越火,很多人都从Svn迁移到Git上面,Git让我们更加与世界接轨,不再是"局域网"的程序猿,特别是掌握了Git之后,会发现它真的很好用,本文对Git中比较烦人的冲突 ...
- 普元部署多个应用的方法(适用EOS6.5以上版本,且无需governor中添加应用)
在EOS下跑default项目之外的另外一个项目,比如defaultNew 步骤1 安装EOS6.5,安装路径如下:E:\program\eos: 启动EOS Eos默认的应用名称为Default 步 ...
- js判断checkbox状态,处理表单提交事件
功能描述:手机网页需要一个投票功能,通过form的post提交.有5-20个checkbox选项,至少选一项,至多选三项.需要在用户点击提交按钮前,判断checkbox的状态是否符合条件,符合则提交到 ...
- openstacksdk enable logging
http://git.openstack.org/cgit/openstack/python-openstacksdk/tree/doc/source/users/guides/logging.rst
- Linux下VMware虚拟机网卡不能运行在混杂模式解决办法
转自: http://blog.csdn.net/henulwj/article/details/50347489 问题描述 在Linux如果以普通用户运行VMware Workstations,创建 ...
- JavaScript——Prototype详探
用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性,可以为其添加函数供实例访问,其它的就不清楚了, ...