步骤分析:

步骤分析:
1.数据库和表
create database day16;
use day16;
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20)
);
insert into user values(null,'tom','123');
2.web项目
jar包 工具类 配置文件
3.新建一个登录页面 表单
4.表单提交 loginservlet
接受用户名和密码
调用service完成登录操作,返回值User
判断user是否为空
若不为空,将user放入session中
判断是否勾选了自动登录
若勾选了:
需要将用户名和密码写回浏览器
5.下次访问网站的时候
过滤器拦截任意请求
判断有无指定的cookie
有cookie,获取用户名和密码
调用service完成登录操作,返回user
当user不为空的时候将user放入session中. 当我们换用jack登录的时候发现登录不了
自动登录只需要登录一次:当session中没有用户的时候
访问有些资源是不需要自动登录的(和登录还有注册相关的资源) 修改filter的逻辑:
首先判断session中是否有user
若没有 并且访问的路径不是和登录注册相关的时候
才去获取指定的cookie

项目结构:

项目展示:

数据库:

/*
SQLyog Ultimate v12.09 (64 bit)
MySQL - 5.5.53 : Database - autologin
*********************************************************************
*/ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`autologin` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `autologin`; /*Table structure for table `user` */ DROP TABLE IF EXISTS `user`; CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`username` varchar(255) DEFAULT NULL COMMENT '用户名',
`password` varchar(255) DEFAULT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; /*Data for the table `user` */ insert into `user`(`id`,`username`,`password`) values (1,'tom','123'),(2,'jack','123'); /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

项目代码:

com.gordon.constant:

--

package com.gordon.constant;

public class Constant {
/**
* 是否自动登录
*/
public static String IS_AUTO_LOGIN = "ok"; /**
* 是否记住用户名
*/
public static String IS_REMEMBER_USER = "ok";
}

com.gordon.dao:

--UserDao.java:

package com.gordon.dao;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler; import com.gordon.domain.User;
import com.gordon.utils.DataSourceUtil; public class UserDao { /**
* 用户登录
*
* @param username
* @param password
* @return
* @throws SQLException
*/
public User login(String username, String password) throws SQLException {
QueryRunner qr = new QueryRunner(DataSourceUtil.getDataSource());
String sql = "select * from user where username = ? and password = ? limit 1";
return qr.query(sql, new BeanHandler<User>(User.class), username, password);
} }

com.gordon.domain:

--User.java:

package com.gordon.domain;

public class User {
private int id;
private String username;
private String password; public User() {
} public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}

com.gordon.service:

--UserService.java:

package com.gordon.service;

import java.sql.SQLException;

import com.gordon.dao.UserDao;
import com.gordon.domain.User; public class UserService { /**
* 用户登录
* @param username
* @param password
* @return
* @throws SQLException
*/
public User login(String username, String password) throws SQLException {
return new UserDao().login(username, password);
} }

com.gordon.utils:

--CookieUtil.java

package com.gordon.utils;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Cookie工具类
*
*/
public class CookieUtil { /**
* 添加cookie
*
* @param response
* @param name
* @param value
* @param maxAge
*/
public static void addCookie(HttpServletResponse response, String name, String value) {
Cookie cookie = new Cookie(name, value);
cookie.setPath("/");
response.addCookie(cookie);
} /**
* 添加cookie
*
* @param response
* @param name
* @param value
* @param maxAge
*/
public static void addCookie(HttpServletResponse response, String name, String value, int maxAge) {
Cookie cookie = new Cookie(name, value);
cookie.setPath("/");
if (maxAge > 0) {
cookie.setMaxAge(maxAge);
}
response.addCookie(cookie);
} /**
* 删除cookie
*
* @param response
* @param name
*/
public static void removeCookie(HttpServletResponse response, String name) {
Cookie uid = new Cookie(name, null);
uid.setPath("/");
uid.setMaxAge(0);
response.addCookie(uid);
} /**
* 获取cookie值
*
* @param request
* @return
*/
public static String getUid(HttpServletRequest request, String cookieName) {
Cookie cookies[] = request.getCookies();
for (Cookie cookie : cookies) {
if (cookie.getName().equals(cookieName)) {
return cookie.getValue();
}
}
return null;
}
}

--DataSourceUtil.java:

package com.gordon.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DataSourceUtil {
private static ComboPooledDataSource ds = new ComboPooledDataSource(); /**
* 获取数据源
*
* @return 连接池
*/
public static DataSource getDataSource() {
return ds;
} /**
* 获取连接
*
* @return 连接
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
} /**
* 释放资源
*
* @param conn
* 连接
* @param st
* 语句执行者
* @param rs
* 结果集
*/
public static void closeResource(Connection conn, Statement st, ResultSet rs) {
closeResultSet(rs);
closeStatement(st);
closeConn(conn);
} /**
* 释放连接
*
* @param conn
* 连接
*/
public static void closeConn(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
} } /**
* 释放语句执行者
*
* @param st
* 语句执行者
*/
public static void closeStatement(Statement st) {
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
st = null;
} } /**
* 释放结果集
*
* @param rs
* 结果集
*/
public static void closeResultSet(ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
} }
}

com.gordon.web.filter:

--AutoLoginFilter.java

package com.gordon.web.filter;

import java.io.IOException;
import java.net.URLDecoder; 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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.gordon.domain.User;
import com.gordon.service.UserService;
import com.gordon.utils.CookieUtil; /**
* 自动登录过滤器
*/
@WebFilter(urlPatterns = { "/*" })
public class AutoLoginFilter implements Filter { public AutoLoginFilter() {
} public void destroy() {
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response; // 判断用户是否已经登录,如果不存在user,则未登录,开始自动登录
if (req.getSession().getAttribute("user") == null) { // 判断是否存在cookie
if (CookieUtil.getUid(req, "autologin") != null) { // 排除指定的路径(指定路径下不需要自动登录,如登录请求,注册请求)
if (!req.getServletPath().contains("/login")) { System.out.println("执行了自动登录操作......"); // 获取cookie中的用户名密码
String userCookieValue = CookieUtil.getUid(req, "autologin");
String username = userCookieValue.split("-")[0];
String password = userCookieValue.split("-")[1]; User user = null;
try {
user = new UserService().login(URLDecoder.decode(username, "UTF-8"), password);
} catch (Exception e) {
e.printStackTrace();
} if (user != null) {
// 将user放入session
req.getSession().setAttribute("user", user); // 直接转入成功页面,不需要自动传递
resp.sendRedirect(req.getContextPath() + "/");
}
}
}
} chain.doFilter(request, response);
} public void init(FilterConfig fConfig) throws ServletException {
}
}

com.gordon.web.servlet:

--LoginServlet.java

package com.gordon.web.servlet;

import java.io.IOException;
import java.net.URLEncoder;
import java.sql.SQLException; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.gordon.constant.Constant;
import com.gordon.domain.User;
import com.gordon.service.UserService;
import com.gordon.utils.CookieUtil; /**
* 用户登录
*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { request.setCharacterEncoding("utf-8"); String username = request.getParameter("username");
String password = request.getParameter("password");
String autologin = request.getParameter("autologin");
String rememberuser = request.getParameter("rememberuser"); User user = null;
try {
user = new UserService().login(username, password);
} catch (SQLException e) {
e.printStackTrace();
} if (user != null) { // 将user放入session
request.getSession().setAttribute("user", user); // 如果开启记住用户名,将用户名称存入cookie
if (rememberuser != null && Constant.IS_REMEMBER_USER.equals(rememberuser)) { // 记住用户名cookie存储60天
CookieUtil.addCookie(response, "rememberuser", URLEncoder.encode(user.getUsername(), "UTF-8"),
60 * 24 * 3600);
} // 如果开启自动登录,将用户存入cookie
if (autologin != null && Constant.IS_AUTO_LOGIN.equals(autologin)) { // 自动登录Cookie存储30天
CookieUtil.addCookie(response, "autologin",
URLEncoder.encode(user.getUsername(), "UTF-8") + "-" + user.getPassword(), 30 * 24 * 3600);
}
} response.sendRedirect(request.getContextPath() + "/");
} protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

--LogoutServlet.java

package com.gordon.web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.gordon.utils.CookieUtil; /**
* 用户登录
*/
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { request.getSession().removeAttribute("user");
CookieUtil.removeCookie(response, "autologin"); response.sendRedirect(request.getContextPath() + "/");
} protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

c3p0-config.xml:

<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<!-- 基本配置 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/autologin</property>
<property name="user">root</property>
<property name="password">root</property> <!--扩展配置-->
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config> <!-- 命名的配置 -->
<named-config name="itcast">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/xxxx</property>
<property name="user">root</property>
<property name="password">1234</property> <!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">20</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">40</property>
<property name="maxStatements">20</property>
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>

-----------------------------------------------------

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="username" value="${ sessionScope.user.username }"></c:set>
<c:choose>
<c:when test="${ not empty username }">
网站首页:欢迎您的使用:${ username } | <a href="${ pageContext.request.contextPath }/logout">退出登录</a>
</c:when>
<c:otherwise>
您还没有登录,请登录:<a href="${ pageContext.request.contextPath }/login.jsp">登录</a>
</c:otherwise>
</c:choose>
</body>
</html>

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${ pageContext.request.contextPath }/login" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value="${ cookie.rememberuser.value }" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="text" name="password" /></td>
</tr>
<tr>
<td><input type="checkbox" name="rememberuser" value="ok" />记住用户名</td>
<td><input type="checkbox" name="autologin" value="ok" />自动登录</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录" /></td>
</tr>
</table>
</form>
</body>
</html>

show_product.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
商品展示:欢迎您的使用:${ sessionScope.user.username } |
<a href="${ pageContext.request.contextPath }/logout">退出登录</a>
</body>
</html>

java-自动登录 与 记住用户名的更多相关文章

  1. PLSQL自动登录,记住用户名密码

    转: PLSQL自动登录,记住用户名密码&日常使用技巧 配置启动时的登录用户名和密码 这是个有争议的功能,因为记住密码会给带来数据安全的问题. 但假如是开发用的库,密码甚至可以和用户名相同,每 ...

  2. js cookie介绍和实例(用于自动登录,记住用户名等)

    js cookie介绍和实例(用于自动登录,记住用户名等) 一.总结 1.cookie在客户端:因为js是最初是用来在客户端和服务器端进行通信使用的,所以客户端比如js可以操作cookie正常 2.c ...

  3. [No00008F]PLSQL自动登录,记住用户名密码&日常使用技巧

    配置启动时的登录用户名和密码 这是个有争议的功能,因为记住密码会给带来数据安全的问题. 但假如是开发用的库,密码甚至可以和用户名相同,每次输入密码实在没什么意义,可以考虑让PLSQL Develope ...

  4. ASP.NET中登录时记住用户名和密码(附源码下载)--ASP.NET

    必需了解的:实例需要做的是Cookie对象的创建和对Cookie对象数据的读取,通过Response对象的Cookies属性创建Cookie,通过Request对象的Cookies可以读取Cookie ...

  5. java 自动登录代码

    javaBean的代码    package bean;    import java.io.Serializable;    public class Admin implements Serial ...

  6. JavaWeb学习记录总结(二十九)--Servlet\Session\Cookie\Filter实现自动登录和记住密码

    一.Servlet package autologin.servlet.login; import java.io.IOException;import java.security.MessageDi ...

  7. Android自动登录与记住密码

    // 获取实例对象 sp = this.getSharedPreferences("userInfo", Context.MODE_WORLD_READABLE); rem_pw ...

  8. Android_SharedPreferences实现的自动登录和记住密码

    效果: 先贴一个SharedPreferences工具类: package com.example.didida_corder.ToolClass; import android.content.Co ...

  9. Android实现自动登录和记住密码

    效果图: 在勾选自动登录后下次打开软件会直接跳过登录界面 代码: protected void onCreate(Bundle savedInstanceState) { super.onCreate ...

随机推荐

  1. Cannot refer to the non-final local variable user defined in an enclosing scope 内部类定义在方法内,方法定义的参数(形参)无法被内部类直接访问,需要用final定义

    为什么匿名内部类参数必须为final类型 1)  从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量 ...

  2. Python基本数据类型详细介绍(转)

    1.空(None)表示该值是一个空对象,空值是Python里一个特殊的值,用None表示.None不能理解为0,因为0是有意义的,而None是一个特殊的空值.2.布尔类型(Boolean)在 Pyth ...

  3. Android开发之模仿UC浏览器的菜单

    这个内容内容涉及到的了两个知识点: PopupWindow:使用PopupWindow创建一个简单的菜单 使用TabHost创建标签:这个网上好多教程随便看看就好. 实现思路: 观察一下UC浏览器的菜 ...

  4. Python学习笔记015——序列(字节数组 bytearray)

    1 序列 常见的序列有:list   tuple  str  bytes(字节串)  bytearray 2 字节数组bytearray 可变的字节序列,相当于bytes的可变版本. 3 创建函数by ...

  5. Chrome 错误代码:ERR_UNSAFE_PORT

    最近在用Nginx发布多个站点测试,使用了87.88端口, 88端口访问正常,87端口就怎么也访问不了, 点击更多,提示错误代码:ERR_UNSAFE_PORT 不安全的端口?尼玛就只靠端口就能解决不 ...

  6. Xcode6:解决_NSURLAuthenticationMethodServerTrust异常问题

    一.在使用Xcode6进行执行项目时.发现程序直接Crash了,控制台信息例如以下: dyld: Symbol not found: _NSURLAuthenticationMethodServerT ...

  7. POJ 1789:Truck History(prim&amp;&amp;最小生成树)

    id=1789">Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17610   ...

  8. Dom4j解析和sax解析xml

    xml基础知识 1)标签对大小写敏感,2)xml解析方式有两种dom解析和sax解析  3)常用的解析工具有dom的dom4j和sax的sax解析工具 4)文档声明中使用<?xml versio ...

  9. javascript array操作

    首先来看一下怎么判断一个对象是不是数组: 1.Array.isArray(obj) 调用数组的isArray方法 2.obj instanceof Array 判断对象是否是Array的实例 3.Ob ...

  10. 将linux下的rm命令改造成mv到指定的目录下

    rm是Linux下文件删除的命令,它是Linux下非常强大却又非常危险的一条命令,特别是rm -rf有时候强大到让你欲哭无泪,当你想清除当前目录下的所有文件和目录时,很简单#rm -rf ./*这没什 ...