Cookie 实现免登陆和Session
01、 需求说明
完成用户登录功能
登录成功后跳到成功页面,显示用户名
登录失败可以跳回登录页面
登录成功后后续操作均能显示当前登录的用户名
02、完成代码
DologinServlet.java
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决中文乱码req.setCharaterEncoding("utf-8");//[1]接受页面(前台的页面)的数据String uname = req.getParameter("uname");String pwd = req.getParameter("pwd");String ch = req.getParameter("ch");//[2]数据的处理--连接数据库作比较返回结果boolean flag=false;if("是下他".equals(uname)&&"123".equals(pwd)){flag=true;}//[3]根据返回的结果给用户做出响应if(flag){/**********Session实现欢迎xx登录***********///[A]获得session对象HttpSession session = req.getSession();//[B]把对应的值保存到session中session.setAttribute("uname",uname);/**********使用Cookie记住密码的操作***********///[1]申请卡片 填写卡片的信息//把uname 中文的字符串进行UTF-8格式的编码Cookie cookie=new Cookie("u",URLEncoder.encode(uname, "utf-8"));Cookie cookie2=new Cookie("p",pwd);//[2]规定卡片的使用规则//指定卡片的使用范围 --/ 在当前服务器内都有效 /servlet04--只在当前项目中有效cookie.setPath("/");cookie2.setPath("/");//设置Cookie的有效的时间if("yes".equals(ch)){//勾选了记住我操作//设置cookie 有效的时间cookie.setMaxAge(60*60*24*10);cookie2.setMaxAge(60*60*24*10);}else{cookie.setMaxAge(0);cookie2.setMaxAge(0);}//[3]把卡片交给到用户手中resp.addCookie(cookie);resp.addCookie(cookie2);//登录成功resp.sendRedirect("/servlet04/success.jsp");}else{//登录失败req.setAttribute("msg","用户名和密码不匹配");req.getRequestDispatcher("/login.jsp").forward(req,resp);}
}
Login.jsp
<body><%String uname="";String pwd="";String ch="";//获得所有本地Cookie 内容Cookie[] cookies = request.getCookies();if(cookies!=null){for(Cookie c :cookies){if("u".equals(c.getName())){// c--代表的就是用户名对应的Cookie对象uname= URLDecoder.decode(c.getValue(),"utf-8");ch="checked";}if("p".equals(c.getName())){// c--代表的就是密码对应的Cookie对象pwd= c.getValue();}}}%><h3>登录页面</h3><form action="DoLogin"><p>用户名:<input type="text" id="uname" name="uname" value="<%=uname%>"/></p><p>密码:<input type="text" name="pwd" value="<%=pwd%>"/></p><p><input type="checkbox" name="ch" value="yes" <%=ch%> />记住密码</p><p><input type="submit" value="登录"/></p></form>
</body>
success.jsp(登录成功界面)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>$Title$</title><base href= "<%=request.getContextPath() + "/" %>"
</head>
<body><h3>成功页面<h3>输出的值:<%String uname = (String)session.getAttribute("uname");out.print(uname);%><hr/><a href= "update.jsp" >update.jsp</a><hr/>JsessionID<%=session.getId() %></body>
</html>
update.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>update.jsp</title><base href= "<%=request.getContextPath() + "/" %>"
</head>
<body><h3>成功页面<h3>输出的值:<%String uname = (String)session.getAttribute("uname");out.print(uname);%><hr/><a href= "delete.jsp" >delete.jsp</a><hr/>JsessionID<%=session.getId() %></body>
</html>
delete.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>delete.jsp</title><base href= "<%=request.getContextPath() + "/" %>"
</head>
<body><h3>成功页面<h3>输出的值:<%String uname = (String)session.getAttribute("uname");out.print(uname);%><hr/>JsessionID<%=session.getId() %></body>
</html>
03、理解示意图
cookie
session
04、Session 的失效时机
[1]Session.invalidate()
[2]超过最大非活动间隔时间
[3]关闭浏览器(该方式没有立刻结束session)
session失效的方式
[1]手动注销sesison
session.invalidate();
[2]超过session 活动的有效时间
Session 最大活动时间是30分钟,我们可以更改这个默认的时间
A、更改TomCat中web.xml中的配置
影响的是:所有项目中的所有session
<session-config><session-timeout>30</session-timeout></session-config>
B、更改自己项目的web.xml
影响的是:当前项目的所有session
<session-config><session-timeout>40</session-timeout></session-config>
C、更改当前项目的当前session 失效的时间
session.setMaxInactiveInterval(10);
[3]关闭浏览器
这种红方式只是把浏览器中保存到cookie 中的Jsession 给清除了
保存到服务器中的session并没有真正的消失
05、Session和Cookie的区别
cookie数据存放在客户端,session数据放在服务器上(sessionid可以通过cookie保存在客户端,也可以使用URL重写方式)
cookie不是很安全(可以加密),别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE
单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
Cookie的数据都以字符串的形式保存。Session中可以保存对象信息。
典型使用
Cookie:记住我 最近浏览商品 网页皮肤
session:登录信息 购物车(也可以使用Cookie)