首页 > 代码库 > 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)