JavaWeb基础三(Servlet、Cookie、Session)

HttpServletResponse

web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse对象。

  • 如果要获取客户端请求过来的参数,找HttpServletRequest
  • 如果要给客户端响应一些信息,找HttpServletResponse

简单的分类

负责向浏览器发送数据的方法

ServletOutputStream getOutputStream() throws IOException;

PrintWriter getWriter() throws IOException;

负责向浏览器发送响应头的办法

    void setCharacterEncoding(String var1);

    void setContentLength(int var1);

    void setContentLengthLong(long var1);

    void setContentType(String var1);

响应的状态码:可以在HttpServletResponse类中查看

1开头的表示临时响应 ,意思就是说需要请求的人要继续下一步
2开头的 表示响应成功,就是说服务正确接受到请求而且也把请求想要的内容返回回去了 
3开头的表示重定向,意思就是说服务器要求请求者发送另一个请求过来才能处理
4开头表示请求错误,就是说请求中的某些原因导致服务器不能正确处理,重点是请求 
5开头的表示服务器错误,表示服务器自己在处理请求的时候出错,重点是服务器

常见的应用

1.向浏览器输出信息(上一节已说明)

2.下载文件

  1. 要获取下载文件的路径
  2. 下载的文件名
  3. 设置想办法让浏览器支持下载我们需要的对象
  4. 获取下载文件的输入流
  5. 创建缓冲区
  6. 获取OutputStream对象
  7. 将FileOutputStream流写入buffer缓冲区
  8. 使用OutputStream将缓冲区的数据输出到客户端

根据以上步骤进行图片下载:

结果页面:

验证码功能

创建一个类,用来生成随机数

具体代码如下:

public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如何让浏览器3秒自动刷新一次
        resp.setHeader("refresh","3");
        //在内存中创建一个图片
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_3BYTE_BGR);
        //得到图片
        Graphics2D g =(Graphics2D) image.getGraphics();
        //设置图片的背景颜色
        g.setColor(Color.BLUE);
        g.fillRect(0,0,80,20);
        //给图片写数据
        g.setColor(Color.white);
        g.setFont(new Font(null,Font.BOLD,20));
        g.drawString(makeNum(),0,20);
        //告诉浏览器,这个请求用图片的方式打开
        resp.setContentType("image/jpeg");
        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");
        //把图片写给浏览器
        ImageIO.write(image,"jpg",resp.getOutputStream());
    }
    //生成随机数
    private  String makeNum(){
        Random random = new Random();
        String num=random.nextInt(9999999)+"";
        StringBuffer sb=new StringBuffer();
        for (int i = 0; i < 7 - num.length(); i++) {
            sb.append("0");
        }
        num=sb.toString()+num;
        return num;
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

结果页面:

实现重定向

原理:

B的一个web资源收到客户端A的请求后,B会通知A客户端去另外访问一个web资源C,这个过程叫做重定向。

常见场景:用户登录

void sendRedirect(String var1) throws IOException;

结果显示:URL会发送改变。

重定向和转发的区别:

相同点

  • 页面都会实现跳转

不同点

  • 请求转发的时候URL不会发生变化
  • 重定向的时候,URL地址栏会发生变化

 重定向的应用:用户登录

1.注意导入依赖:

2.编写提交数据的jsp页面;

3.编写接收数据的类

getParameter(String name): 根据名称获取请求参数,这是HttpServletRequest提供的方法

success页面;

结果页面:

HttpServletRequest

获取前端传递的参数以及请求转发

  • getParameter(String name): 根据名称获取请求参数。返回单个值

  • getParameterValues(String name): 根据名称获取请求参数列表,返回数组

HttpServletRequest 也可以用于请求转发,即一个web资源收到客户端请求后,通知服务器调用另一个web资源进行处理。可以通过 getRequestDispatcher(String path) 方法获取 RequestDispatcher 对象,并通过其 forward 方法实现请求转发。

如下:将请求转发到 success.jsp 页面

req.getRequestDispatcher("/success.jsp").forward(req,resp);

编写前端页面:

编写接收数据类:

结果显示:

Cookie、Session

会话

会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭资源,这个过程可以称之为会话

有状态会话:

怎么证明你是学校的学生。

1、学校给你发票

2、学生名单标记你的名字

一个网站,怎么证明你来过?

客户端        服务端

1、服务端给客户端一个信件,客户端下次访问服务器带上信件就可以了:cookie

2、服务器登记你来过了,下次你来的时候我来匹配你。seesion

保存会话的两种技术

  • cookie

客户端技术(响应、、请求)

  • session

服务器技术,利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放在Session中!

常见:网站登录之后,下次不用再登录了,第二次访问直接就登录上去了。

Cookie

从请求中拿到cookie信息

服务器响应给客户端cookie

Cookie[] cookies = req.getCookies();        //获得cookie

cookie.getName()        //获得cookie中的key

cookie.getValue()        //获得cookie中的value

new Cookie("lastLoginTime", System.currentTimeMillis()+"");        //新建一个cookie

cookie.setMaxAge(24*60*60);        //设置cookie的有效期

resp.addCookie(cookie);        //响应一个cookie给客户端

cookie:一般会保存在本地的用户目录下appdata;

一个网站cookie是否存在上限?

  • 一个Cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
  • Cookie大小有限制
  • 300个cookie浏览器上限

删除Cookie:

  • 不设置有效期,关闭浏览器自动失效;
  • 设置有效期时间为0;

配置好环境与工程结构之后,编写代码:

public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器告诉你,你来的时间,把这个时间封装成为一个信件,你下次来,服务器就知道你来了
        //解决中文乱码问题
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        PrintWriter out = resp.getWriter();
        //Cookie是服务器从客户端获取
        Cookie[] cookies = req.getCookies();//返回数组,说明cookie可能存在多个
        //判断cookie是否存在
        if (cookies!=null){
            //如果存在
            out.write("你的上一次访问时间");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //获取cookie的名字
                if (cookie.getName().equals("lastLoginTime")){
                    //获取cookie中的值
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.write(date.toLocaleString());
                }
            }
        }else {
            out.write("这是您第一次访问本站");
        }
        //服务器给客户端响应一个cookie
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
        //Cookie的有效期设置为一天
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

结果页面:

注意:

如果传入的cookie值是中文:注意使用编码utf-8

new Cookie("name",URLEncoder.encode("张三",utf-8));        //编码

out.write(URLDecoder.decode(cookie.getValue(),"utf-8"));        //解码

手动删除cookie实验:

添加一个类,用于执行删除cookie代码:

结果显示:

Session(重点)

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个Session对象;
  • 一个Session独占一个浏览器,只要浏览器没有关闭,没有Session就存在;
  • 用户登录之后,整个网站它都可以访问!->保存用户的信息;保存购物车的信息

Session和Cookie的区别:

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
  • Session把用户的数据写到用户独占Session中,服务器保存,(保存重要的信息,减少服务器资源的浪费)
  • Session对象由服务器创建;

使用场景:

  • 保存一个登录用户的信息
  • 购物车信息
  • 在整个网站中,经常会使用的数据,将它保存在Session中;

使用Session:

结果页面:

Session在创建的时候做了什么

Cookie cookie = new Cookie("JSESSIONID", sessionId);        //将sessionId放到Cookie中。
 resp.addCookie(cookie);

取出Session中的值

结果页面:

在给session赋值时,传入对象

会话过期:web.xml配置

<!--设置Session默认的失效时间-->
  <session-config>
    <!--15分钟后Session自动失效,以分钟为单位-->
    <session-timeout>15</session-timeout>
  </session-config>

手动注销:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值