预期的效果:
以百度为例:
一: 登陆界面,显示下次自动登录---选中
二:点击登录,完成登录实现跳转。。。
三:关闭页面:重新打开百度。。。
四:实现自动登录。。。完成跳转。。。
自我分析后,使用session,cookie filter 等技术实现基本功能。
代码区:
一:实体bean:
package www.csdn.net.day56.bean; public class Admin { private Integer id; private String name; private String pass; public Admin() { super(); // TODO Auto-generated constructor stub } public Admin(Integer id, String name, String pass) { super(); this.id = id; this.name = name; this.pass = pass; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } @Override public String toString() { return "Admin [id=" + id + ", name=" + name + ", pass=" + pass + "]"; } }
二:AdminDao 接口
package www.csdn.net.day56.dao; import www.csdn.net.day56.bean.Admin; public interface AdminDao extends BaseDao<Admin, Integer> { /** * 用户登录验证的 操作 * @param name * @param pass * @return */ public Admin checkLogin(String name,String pass); /** * * @param name * @return */ public Admin checkLogin(String name); }
三:Admin dao Impl 类 实现 AdminDao 的接口方法
package www.csdn.net.day56.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import www.csdn.net.day56.bean.Admin; import www.csdn.net.day56.dao.AdminDao; import www.csdn.net.day56.util.DBConn; public class AdminDaoImpl implements AdminDao{ private Connection conn; private PreparedStatement pstmt; private ResultSet rs; @Override public Admin checkLogin(String name, String pass) { Admin entity=null; conn=DBConn.getConn(); String sql="select id, name,pass from admin where name=? and pass=?"; try { pstmt=conn.prepareStatement(sql); int index=1; pstmt.setString(index++, name); pstmt.setString(index++, pass); rs=pstmt.executeQuery(); if(rs.next()){ entity=new Admin(rs.getInt("id"), rs.getString("name"), rs.getString("pass")); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBConn.release(rs, pstmt); } return entity; } @Override public Admin checkLogin(String name) { Admin entity=null; conn=DBConn.getConn(); String sql="select id, name,pass from admin where name=?"; try { pstmt=conn.prepareStatement(sql); int index=1; pstmt.setString(index++, name); rs=pstmt.executeQuery(); if(rs.next()){ entity=new Admin(rs.getInt("id"), rs.getString("name"), rs.getString("pass")); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBConn.release(rs, pstmt); } return entity; } }
四:Admin Service 用来处理事务 或日志的接口
package www.csdn.net.day56.service; import www.csdn.net.day56.bean.Admin; public interface AdminService extends BaseService<Admin, Integer>{ /** * 用户登录验证的操作 * @param name * @param pass * @return */ public Admin checkLogin(String name,String pass); /** * * @param name * @return */ public Admin checkLogin(String name); }
五:Admin Service Impl 实现类
package www.csdn.net.day56.service; import www.csdn.net.day56.bean.Admin; import www.csdn.net.day56.dao.AdminDao; import www.csdn.net.day56.dao.impl.AdminDaoImpl; public class AdminServiceImpl implements AdminService { private AdminDao adminDao =new AdminDaoImpl(); @Override public Admin checkLogin(String name, String pass) { System.out.println("。。。。记录日志操作。。。。。。。。"); Admin entity=adminDao.checkLogin(name, pass); return entity; } @Override public Admin checkLogin(String name) { return adminDao.checkLogin(name); } }
六: index.jsp 一个登录链接,跳转到loginServlet---- 经过filter过滤器
<a href="${pageContext.request.contextPath}/login.do">登录</a>
七:autoLoginFilter 过滤器,对session会话,及cookie 等的检测
package www.csdn.net.day56.filter; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import sun.misc.BASE64Encoder; import www.csdn.net.day56.bean.Admin; import www.csdn.net.day56.service.AdminService; import www.csdn.net.day56.service.AdminServiceImpl; public class AutoLoginFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { // 第一步造型 HttpServletRequest request=(HttpServletRequest) req; HttpServletResponse response=(HttpServletResponse) res; // 1. 首先判断session 中 有没有 admin Object object=request.getSession().getAttribute("admin"); if(object!=null){ request.getRequestDispatcher("./sc.jsp").forward(request, response); return; } // 第二步 判断cookie 中是否存在 Cookie autoCookie=null; Cookie cookies[]=request.getCookies(); if(cookies!=null){ // 遍历cookie for (Cookie cookie : cookies) { // 判断cookie 中是否有autologin 标示符的cookie if("autologin".equals(cookie.getName())){ autoCookie=cookie;// 赋值 } } System.out.println("----------"+autoCookie+"------"); //判断cookie 中是否有 if(autoCookie == null){ chain.doFilter(request,response); return; } System.out.println("+++++++++++"+autoCookie); // 判断 cookie 的值 // 获取cookie 的值 String value=autoCookie.getValue(); // 拆分 String temp[]=value.split(":"); System.out.println("length::::::::;;"+temp.length); // 判断长度 对否等于自己拼凑的长度 if(temp.length!=3){ chain.doFilter(request, response); return; } String name=temp[0]; String time=temp[1]; String service_md5Value=temp[2]; System.out.println(Long.valueOf(time)+"----- 时间------"+System.currentTimeMillis()); // 判断是否失效 if(Long.valueOf(time)<=System.currentTimeMillis()){ chain.doFilter(request, response); return; } // 根据用户名去查询永华 AdminService adminService=new AdminServiceImpl(); // 查询用户 Admin entity=adminService.checkLogin(name); System.out.println("-------- 重新查询"+entity); if(entity==null){ chain.doFilter(request, response); return; } // 拼接的字符 String md5Temp=entity.getName()+":"+entity.getPass()+":"+time; System.out.println(md5Temp+"-----"+service_md5Value); if(!(md5Value(md5Temp).equals(service_md5Value))){ chain.doFilter(request, response); return; } request.getSession().setAttribute("admin", entity); request.getRequestDispatcher("./sc.jsp").forward(request, response); }else{ chain.doFilter(request, response); return; } } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } public String md5Value(String value) { try { MessageDigest digest = MessageDigest.getInstance("md5"); byte result[] = digest.digest(value.getBytes()); BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(result); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ""; }}
filter 在xml 文件中的描述信息
<filter> <filter-name>AutoLoginFilter</filter-name> <filter-class>www.csdn.net.day56.filter.AutoLoginFilter</filter-class> </filter> <filter-mapping> <filter-name>AutoLoginFilter</filter-name> <url-pattern>/login.do</url-pattern> </filter-mapping>
八:loginServlet ---实现转发----login.jsp
package www.csdn.net.day56.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("./login.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}
loginServlet 在xml 中的 描述信息:
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>www.csdn.net.day56.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login.do</url-pattern> </servlet-mapping>
九:登陆界面,表单提交到AdminServlet
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@include file="/common/tag.jsp" %> <%@include file="/common/jquery.jsp" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> ${requestScope.msg}<br/> <form action="${pageContext.request.contextPath }/AdminOper.do" method="get"> <table> <tr> <td>用户名:</td> <td><input type="text" name="name"></td> </tr> <tr> <td>密码</td> <td><input type="password" name="pass"/></td> </tr> <tr> <td colspan="2"> <input type="radio" name="day" value="1"> 一天 <input type="radio" name="day" value="7"> 一周 <input type="radio" name="day" value="15"> 半月 <input type="radio" name="day" value="30"> 一月 <input type="radio" name="day" value="180"> 半年 <input type="radio" name="day" value="360"> 一年 </td> </tr> <tr> <td><input type="checkbox" name="mark" value="mark"/></td> <td>下次自动登录</td> </tr> <tr> <td><input type="submit" value="登录"/></td> <td><input type="reset" value="重置"/></td> </tr> </table> <input type="hidden" name="oper" value="login"/> </form> </body> </html>
十:AdminServlet---实现对用户的验证及cookie,session 的存储调用
package www.csdn.net.day56.servlet; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import sun.misc.BASE64Encoder; import com.sun.mail.util.BASE64EncoderStream; import www.csdn.net.day56.bean.Admin; import www.csdn.net.day56.service.AdminService; import www.csdn.net.day56.service.AdminServiceImpl; public class AdminServlet extends HttpServlet { private AdminService adminService = new AdminServiceImpl(); private int expires = 7 * 24 * 60 * 60;// 7 就是天数 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取 请求的 方法 String method = request.getMethod(); String oper = request.getParameter("oper"); if ("login".equals(oper)) { String name = request.getParameter("name"); String pass = request.getParameter("pass"); String mark = request.getParameter("mark"); System.out.println(name + pass + mark + "==========="); // 验证用户名和密码是否正确 Admin entity = adminService.checkLogin(name, pass); if (entity != null) { if ("mark".equals(mark)) { // 声明 cookie Cookie autoCookie = null; // 获取所有的 cookie Cookie cookies[] = request.getCookies(); // 遍历cookie for (Cookie cookie : cookies) { // 判断是否存在自动登录记录 if ("autologin".equals(cookie.getName())) { autoCookie = cookie;// 赋值 // 当cookie 存在的时候 我需要重新设置值 long time = System.currentTimeMillis() + expires * 1000; String newValue = name + ":" + time + ":" + md5Value(name + ":" + pass + ":" + time); cookie.setValue(newValue); } else { // 不在创建 long time = System.currentTimeMillis() + expires * 1000; String cookieValue = name + ":" + time + ":" + md5Value(name + ":" + pass + ":" + time); autoCookie = new Cookie("autologin", cookieValue); } } autoCookie.setMaxAge(expires);// 10 分钟 response.addCookie(autoCookie);// 添加里边去了 } // admin 存入到 session request.getSession().setAttribute("admin", entity); request.getRequestDispatcher("./sc.jsp").forward(request, response); } else { request.setAttribute("msg", "用户名 或密码错误"); request.getRequestDispatcher(",/index.jsp").forward(request, response); } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } public String md5Value(String value) { MessageDigest digest; try { digest = MessageDigest.getInstance("md5"); byte result[] = digest.digest(value.getBytes()); BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(result); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ""; } }
AdminServlet 在web.xml 的描述信息:
<servlet> <servlet-name>AdminServlet</servlet-name> <servlet-class>www.csdn.net.day56.servlet.AdminServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AdminServlet</servlet-name> <url-pattern>/AdminOper.do</url-pattern> </servlet-mapping>
十一:检测成功:跳转到指定的界面--显示登录人的信息
欢迎${sessionScope.admin.name}登录<br/>
效果展示:
一:输入指定的地址:点击登录:
二:提交表单: 跳转到指定的jsp 页面:
三:跳转到指定页面--显示登录信息
四:重新打开index 界面--点击登录将直接跳转到登录成功页面---这是session会话的作用
五:关闭Tomact--session会话结束--用来检测cookie
以上是使用filter,cookie,session等技术是小的效果。。。仅供参考。。。希望能给大家解除疑惑