JavaWeb学习第三天

1.HttpServletResponse

1.1实现重定向

image-20210621091728997

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

  • 常用场景

    • 用户登录

void sendRedirect(String var1) throws IOException;

测试:

public class RedirectServlet extends HttpServlet  {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /* 实现原理
            resp.setHeader("location","/ig");
             resp.setStatus(302);
         */
        resp.sendRedirect("/ig");//重定向
    }
}

面试题:请你聊聊重定向和转发的区别

相同点:

  • 页面都会出现跳转

不同点:

  • 请求转发的时候,url不会发生变换,307

  • 重定向URL会发生变换。302

public class RequestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("进入login请求");
    req.getParameter("userName");
    req.getParameter("password");
    resp.sendRedirect("/66.jsp");
}
}
  • 当登录后,重定向跳转到66.jsp页面

2.HttpServletRequest

HttpServletRequest代表客户端的请求,用户通过http协议访问服务器,http请求中的所有信息会被封装到HttpServletRequest,通过这个方法,获得客户端所有信息。

1.获取前端参数

image-20210621095342080

public class loginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf-8");
    String userName = req.getParameter("userName");
    String password = req.getParameter("password");
    String[] hobbys = req.getParameterValues("hobbys");
​
    System.out.println(userName);
    System.out.println(password);
    System.out.println(Arrays.toString(hobbys));
//        resp.sendRedirect("/666.jsp");
    //通过请求转发
  req.getRequestDispatcher(req.getContextPath()+"/666.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet(req,resp);
}
}
​
  • 以上通过getParameter方法获取前端传递来的数据。

  • 然后请求转发到登录成功页面。

3.Cookie、session

3.1、会话

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

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

  • 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以;cookie

  • 服务器登记你来过,下次你来的时候我匹配你;session

3.2、保存会话的两种技术

cookie

  • 客户端技术(响应,请求)

session

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

常见实例:网站登录之后,你下次不用登录,可以直接登录。

3.3、Cookie


  1. 从请求中拿到Cookie信息

  2. 服务器响应给客户端cookie

public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setCharacterEncoding("utf-8");
    req.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    PrintWriter out = resp.getWriter();
    //Cookie
    Cookie[] cookies = req.getCookies();
    if (cookies!=null){
        out.write("你上次访问时间是:");
        for (int i = 0; i < cookies.length; i++) {
            Cookie cookie = cookies[i];
            //获取名字
            if (cookie.getName().equals("Time")){
                //获取Cookie中的值
                long Time = Long.parseLong(cookie.getValue());
                Date date= new Date(Time);
                out.write(date.toLocaleString());
            }
        }
    }else {
        out.write("这是你第一次访问");
    }
    //服务器给客户端响应一个Cookie
    Cookie cookie = new Cookie("Time",System.currentTimeMillis()+"");
    cookie.setMaxAge(24*60*60);
    resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet(req, resp);
}
}
Cookie[] cookies = req.getCookies();//创建一个Cookie
cookie.getName()//获取cookie中的key
cookie.getValue()//获取cookie中的value
cookie.setMaxAge(24*60*60);//设置cookie的有效期
resp.addCookie(cookie);//响应给客户端一个cookie

一个网站的cookie是否有上限

  • 一个cookie只能保存一个信息

  • 一个web站点可以给浏览器发送多个cookie,最多存放20个。

  • cookie大小由限制4KB

  • 浏览器上限300个cookie

删除Cookie

  • 不设置有效期,关闭浏览器会自动消失

  • 将有效日期为0。

3.4、Session(重点)

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个Session对象;

  • 一个Session独占一个浏览器,只要浏览器没关闭,这个Session就存在。

  • 用户登录之后,整个网站都可以访问

Cookie和Session的区别:

  • Cookies是把用户的数据写给用户的浏览器,浏览器保存。

  • Session把用户的数据写到用户独占的Session中,服务器保存,(保存重要的信息,减少资源浪费)

  • Session由服务器创建

使用场景:

  • 保存一个登录用户的信息

  • 购物车信息;

  • 在整个网站中经常会使用的数据,我们会保存在Session中

session的使用

image-20210621154104927

import pojo.student;
​
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
​
public class SeesionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //解决乱码问题
    req.setCharacterEncoding("utf-8");
    resp.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    //得到Session
    HttpSession session = req.getSession();
    //给Session中存放东西
    session.setAttribute("name",new student("qwe",16));
    //获取ID
    String id = session.getId();
    //判断session是不是新创建的
    if (session.isNew()){
        resp.getWriter().write("sesstion创建成功,id:"+id);
    }else{
        resp.getWriter().write("session已经存在,id:"+id);
    }
}
}
​
​
//得到Session
HttpSession session = req.getSession();
    student name = (student) session.getAttribute("name");
    resp.getWriter().print(name.toString());

注销Session

HttpSession session = req.getSession();
session.removeAttribute("name");//消除name
session.invalidate();//注销session

自动过期:在web.xml中配置

<session-config>
    <session-timeout>2</session-timeout>
</session-config>

image-20210621154050545



posted on 2021-06-21 16:24  阿滨滨  阅读(60)  评论(0)    收藏  举报