首页 > 代码库 > JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)
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 = http://www.mamicode.com/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.javapackage 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.javapackage 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="http://www.mamicode.com/styles.css">--> </head> <body> <form action="/20141123/loginServlet" method="post"> <input type="text" name="imageNumber" /> <img src="http://www.mamicode.com/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[1024]; // 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)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。