预期的效果:
以百度为例:
一: 登陆界面,显示下次自动登录---选中
二:点击登录,完成登录实现跳转。。。
三:关闭页面:重新打开百度。。。
四:实现自动登录。。。完成跳转。。。
自我分析后,使用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等技术是小的效果。。。仅供参考。。。希望能给大家解除疑惑