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();

    }

}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。