1.Cookie记住用户名
1.1 修改_head.jsp页面的登录按钮使其指向登录页面
1.2 修改登录页面中的表单提交路径
1.3创建LoginServlet.java:其主要功能是负责创建cookie并设置时间和路径,并通过响应头传回给浏览器保存cookie
package com.easymall.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //登录Servlet public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //0.乱码处理 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); //1.获取参数 String username = request.getParameter("username"); String password = request.getParameter("password"); //获取是否记住用户名选项 String remname = request.getParameter("remname");//"true" null checkBox是否被勾选 //2.记住用户名--cookie //remname为"true"则需要记住用户名,反之为null不需要记住用户名。 if("true".equals(remname)){ //如果勾选了记住用户名选项 Cookie cookie = new Cookie("remname",URLEncoder.encode(username, "utf-8")); cookie.setMaxAge(60*60*24*30);//30天记住用户名 cookie.setPath(request.getContextPath()+"/"); response.addCookie(cookie); }else{ //如果没有勾选记住用户名选项,则创建一个新的cookie,name和path 一致,时长设置为0,替换掉原来的存储在浏览器的cooie,这个过程就是删除cooie Cookie cookie = new Cookie("remname", ""); cookie.setMaxAge(0); cookie.setPath(request.getContextPath()+"/"); response.addCookie(cookie); } //3.保存用户登录状态---session //4.跳转回首页 // response.sendRedirect("http://www.easymall.com"); response.sendRedirect(request.getContextPath()+"/"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
修改login.jsp页面:获取存储的cooie内容,并选出需要的cooie,恢复用户名文本框上的用户名
<table> <% //获取cookie中的remname 读取其中的用户名 Cookie[] cs = request.getCookies(); Cookie remnameC = null; //初次获取cookie数组为null if(cs !=null){ for(Cookie c:cs){//遍历cookie数组,寻找remname这个cookie if("remname".equals(c.getName())){ remnameC = c; } } } String username=""; if(remnameC !=null){ username = URLDecoder.decode(remnameC.getValue(), "utf-8"); //通过utf-8解码 } %>
<input type="checkbox" name="remname" value="true" <%="".equals(username)?"":"checked='checked'" %> />记住用户名
2.用session保持登录状态
通过登录功能,保存用户的登录状态。
request域~范围太小
ServletContext域~范围太大
session域--合适
a. 修改LoginServlet.java,添加如下代码:
//3.保存用户登录状态---session //判断用户名域密码是否匹配 Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JDBCUtils.getConnection(); ps = conn.prepareStatement("select * from user where username =? and password=?"); ps.setString(1, username); ps.setString(2, password); rs = ps.executeQuery(); if(rs.next()){//用户名和密码正确,完成登录 HttpSession session = request.getSession(); session.setAttribute("username", username); }else{//返回登录页面作出提示 request.setAttribute("msg", "用户名或密码不正确"); request.getRequestDispatcher("/login.jsp").forward(request, response); return; } } catch (SQLException e) { e.printStackTrace(); }finally{ JDBCUtils.close(conn, ps, rs); } //4.跳转回首页 // response.sendRedirect("http://www.easymall.com"); response.sendRedirect(request.getContextPath()+"/"); // /代表的是转到缺省应用,因为缺省应用的request.getContextPath()就是空
_head.jsp页面中添加如下内容:这个是可以分开的<%%>,只要保证是匹配的示行,中间可以穿插html代码 因为一个浏览器对同一个服务器只有一个session对象,而session就相当于是一个cooie,有其作用域,当你访问一定
url ,请求头才会自带相关cooie。
<% //判断是否存在登录状态 if(request.getSession(false) != null && request.getSession().getAttribute("username")!=null){ //第一个判断是确认session对象是否存在,如果存在仍然不能确定是否包含username域属性(登录状态) //第二个判断是确认当前session对象中是否包含username属性,如果包含才从中取出用户名,在页面中显示 %> <a href="#">欢迎<%=request.getSession().getAttribute("username") %>,回来</a> | <a href="#">注销</a> <% }else{ %> <a href="<%=request.getContextPath() %>/login.jsp">登录</a> | <a href="<%=request.getContextPath() %>/regist.jsp">注册</a> <% } %>
用户名不存在
c.注销功能
修改_head.jsp页面
创建LogOutServlet.java
package com.easymall.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //注销servlet public class LogOutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //注销用户就是销毁session if(request.getSession(false) !=null){ request.getSession().invalidate(); } //跳转回首页 response.sendRedirect(request.getContextPath()+"/"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
7. 验证码实现
a. 在ValidateServlet中添加如下内容:
response.setDateHeader("Expires", -1); response.setHeader("Cache-Control", "no-cache"); VerifyCode vc = new VerifyCode(); //当前servlet只有img标签调用,所以将图片放入缓冲区, //最终会在其调用的位置输出在浏览器中。 vc.drawImage(response.getOutputStream()); String code = vc.getCode(); //添加验证码到session域 request.getSession().setAttribute("code", code); System.out.println(code); System.out.println("执行成功~!");
b.在registServlet中添加如下内容:
//6.验证码校验 //TODO:session //获取域中验证码和用户输入的验证码,作比对 String code = (String) request.getSession().getAttribute("code"); if(!code.equalsIgnoreCase(valistr)){ request.setAttribute("msg", "验证码错误"); request.getRequestDispatcher("/regist.jsp").forward(request, response); return; }