• 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[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();
    
        }
    
    }
  • 相关阅读:
    vue 组件之间相互传值 父传子 子传父
    krpano 常用标签
    krpano生成全景图
    github的基本使用
    transform:rotate3d/tranlate3d
    css3水波纹效果
    原型的迷惑
    JS变量作用域
    LeetCode Rotate List
    LeetCode Divide Two Integers
  • 原文地址:https://www.cnblogs.com/yxlblogs/p/4125546.html
Copyright © 2020-2023  润新知