书城项目二和Cookie和Session
<div id="main"> <form action="manager/bookServlet" method="post"> <!--这里需要name=action来传达,执行的方法--> <input type="hidden" name="action" value="${empty param.id ? "add":"update"}"> <input type="hidden" name="id" value="${requestScope.book.id}"> <table>
2.这里${empty param.id ? "add":"update"} 是用来区分,用户选择的是增加图书,还是修改图书,从而实现不同的功能,但是要注意,还要再下面再加一个隐藏域,因为,我们跟新图书是根据id来跟新的,如果不加下面的隐藏域,那么系统的id值为null
3.分页的计算公式:(pageNo-1)x pageSize;
Cookie
-
Cookie的创建,服务器创建,浏览器保存
//创建cookie对象 Cookie cookie = new Cookie("key1", "value1"); //通知客户端,保存cookie 这一步不可以省略,不然客户端不会收到cookie resp.addCookie(cookie); resp.getWriter().write("Cookie创建成功");
-
Cookie的接受,浏览器发送,服务器接受
//接受浏览器端发送来的cookie Cookie[] cookies = req.getCookies(); //得到的是一个cookies数组 for (Cookie cookie : cookies) { //遍历数组 System.out.println("Cookie:"+cookie.getName()+"="+cookie.getValue());
-
想找查找某一个name值的cookie,可以定义一个Cookie工具类,在里面创建一个findCookie方法
public class CookieUtils { //定义一个工具类,用来查找你要想的哪个name值的Cookie public static Cookie findCookie(String name, Cookie[] cookies){ if (name==null||cookies==null||cookies.length==0){ return null; } for (Cookie cookie : cookies) { if (name.equals(cookie.getName())){ return cookie; } } return null; } }
//接受浏览器端发送来的cookie Cookie[] cookies = req.getCookies(); //得到的是一个cookies数组 /* for (Cookie cookie : cookies) { //遍历数组 System.out.println("Cookie:"+cookie.getName()+"="+cookie.getValue()); }*/ //查找 name值为key2的cookie Cookie iWantCookie = CookieUtils.findCookie("key2",cookies); if (iWantCookie!=null){ resp.getWriter().write("找到了目标Cookie"+iWantCookie.getName()); }
-
修改一个Cookie 的值(//其实就相当于覆盖,创建了一个同名的Cookie,浏览器保存时,会将前面哪个Cookie覆盖)
方案一:
public void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //修改Cookie的值, //其实就相当于覆盖,创建了一个同名的Cookie,浏览器保存时,会将前面哪个Cookie覆盖 //第一步先创建一个你想要修改的Cookie的同名的、cookie对象 Cookie cookie = new Cookie("key1", "value9"); resp.addCookie(cookie); //通知浏览器,保存Cookie resp.getWriter().write("cookie修改成功"); }
方案二:
//方案二 //先找到你要修改的Cookie Cookie key1 = CookieUtils.findCookie("key1", req.getCookies()); if (key1!=null){ key1.setValue("newValue10"); resp.addCookie(key1); //必不可少 resp.getWriter().write("改变成功"); }
-
Cookie生命控制
-
正数:标识在指定的秒数后国企
public void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置Cookie存活时间为-1: 浏览器一关,马上删除 //先创建一个Cookie Cookie cookie = new Cookie("defaultLife", "defaultLife"); //设置时间 cookie.setMaxAge(-1); //注意 就算你不设置,系统也默认是认为 你的为-1 //通知浏览器保存 resp.addCookie(cookie); }
-
负数:标识浏览器一关,Cookie就会被删除(默认-1)
public void deleteCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置Cookie存活时间为0:马上删除 //先找到你要删除的对象 Cookie key1 = CookieUtils.findCookie("key2", req.getCookies()); //设置存货时间 if (key1!=null){ key1.setMaxAge(0); //通知浏览器保存 resp.addCookie(key1); }else{ resp.getWriter().write("没有合适的Cookie"); } }
-
零,标识马上删除Cookie
public void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置Cookie存活时间为一个小时后删除 //先创建一个Cookie Cookie cookie = new Cookie("key5", "value5"); //设置时间 cookie.setMaxAge(60*60); //通知浏览器保存 resp.addCookie(cookie); }
-
免用户名登录
Cookie的有效路径
-
Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器,哪些不发送,path属性是通过请求的地址来进行有效的过滤
-
CookieA path =/工程路径
CookieB path= /工程路径
请求地址如下:http://ip:port/工程路径/a.html
那么 CookieA发送 CookieB不发送
请求地址如下:http://ip:port/工程路径/abc/a.html
那么 CookieA发送,CookieB发送
-
LoginServlet文件代码
public class LoginServlet extends BaseServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取用户输入的值 String username = req.getParameter("username"); String password = req.getParameter("password"); //对比,来确实是否登录成功 if ("zhangsan".equals(username)&&"123456".equals(password)){ System.out.println("登录成功"); }else{ System.out.println("登录失败"); } //创建Cookie对象, 传入uername Cookie cookie = new Cookie("username", username); cookie.setMaxAge(60*60*24*7); //保留 Cookie一个星期 resp.addCookie(cookie); } }
-
login.jsp文件代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <base href="http://localhost:8080/demo_cookie_session/"> </head> <body> <form action="loginServlet" method="get"> 用户名<input type="text" name="username" value="${cookie.username.value}"><br> 密码<input type="password" name="password" ><br> <input type="submit" value="登录"> </form> </body> </html>
Session
-
Session就是一个接口(HttpSession)
-
Session就是会话,他是用来维护一个客户端和服务器之间关联的一种技术,每一个客户端都有自己的一个Session
-
Session会话中,我们经常用来保存用户登录之后的信息
-
Session只会创建一次,以后的每一次都是调用第一次创建的,而且他们有一个唯一不变的id
-
创建Session
//首先调用request.getSession方法创建Session HttpSession session = req.getSession(); //判度是否是第一次创建 boolean isNew = session.isNew(); //获取session的id String id = session.getId(); resp.getWriter().write("Session的id为"+id+"<br>"); resp.getWriter().write("Session是否是第一次创建"+isNew+"<br>");
-
为Session赋值
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建Session HttpSession session = req.getSession(); //为session赋值 session.setAttribute("key1","value1"); resp.getWriter().write("已经成功为session赋值"); }
-
取Session中的值
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建Session HttpSession session = req.getSession(); //为session赋值 session.setAttribute("key1","value1"); resp.getWriter().write("已经成功为session赋值"); }
Session的生命周期
-
public void setManlnactivelnterval(int interval) 设置Sessin的超时时间,以秒为单位(设置单独的超时时长)
protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //自己设置一个超时时长 HttpSession session = req.getSession(); session.setMaxInactiveInterval(60); int maxInactiveInterval = session.getMaxInactiveInterval(); resp.getWriter().write("设置的超时时长"+maxInactiveInterval); }
-
public int getManlnactivelnterval(),获取Session的超时时间
-
Session的默认超时时间为30分钟
-
如果想要更改Session的默认时间,可以在你的web.xml输入,将默认时间改为20分钟(这种是修改所有的默认时长)
<session-config> <session-timeout>20</session-timeout> </session-config>
-
Session超时的概念的介绍:Session的超时指的是,客户端两次请求的最长时间间隔,比如 我设置了超时时长为5秒,早五秒内,我一直点一个情趣,那么session的超时时长,本来已经走了1秒或者两秒,因为我请求了一下,马上又回到了5秒,又重新走
-
值为正数时,:设定超时时长,
-
值为负数时,:永不超时
-
立刻超时 session.invalidate();
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //马上销毁 HttpSession session = req.getSession(); session.invalidate(); resp.getWriter().write("立即销毁设置成功"); }
-
Session对象只会创建一次,以后的 每一次的requset.getSession();都是对第一次创建的Session的引用
-
服务器每次创建一个Session对象,都会产生一个Cookie对象,这个Cookie对象的key值永远都是JSESESSION,value值是Session的id值,然后将这个Cookie对象,保存到浏览器当作,以后的每一次,引用的都是第一次创建的Session的id值,得到了id值之后去服务器内存里面寻找与之对应的id值的Session,就可以找到第一次创建的Session
-
但是思考,如果我们先创建了一个Seesion之后,我们去把传到浏览器的Cookie删掉了,之后requset.getSession(),会找不到id值,那么是创建一个新的Session还是返回一个null呢?
答案是创建一个新的Session对象 并且也会创建一个Cookie对象跟第一次