【Spring实战-1】网站登录系统
2015年5月8日 14:05:49
1. 使用
JdbcTemplate 实现Mysql数据库的增、删、改、查操作;
<!-- 从类路径下加载Spring配置文件,classpath关键字特指从类路径下加载 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- 负责启动Spring容器的监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
8. 配置Spring MVC:(web.xml)
<!-- 配置Spring MVC,其对应的配置文件为:servlet-name-servlet.xml,本项目的为:baobaotao-servlet.xml --><servlet><servlet-name>baobaotao</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>3</load-on-startup></servlet><servlet-mapping><servlet-name>baobaotao</servlet-name><url-pattern>*.html</url-pattern></servlet-mapping>
9. Spring声明式事务;
项目整体布局:



下面是配置文件及前端界面等;

DROP DATABASE IF EXISTS sampledb;CREATE DATABASE sampledb DEFAULT CHARACTER SET utf8;USE sampledb;##创建用户表CREATE TABLE t_user (user_id INT AUTO_INCREMENT PRIMARY KEY,user_name VARCHAR(30),credits INT,password VARCHAR(32),last_visit datetime,last_ip VARCHAR(23))ENGINE=InnoDB;##创建用户登录日志表CREATE TABLE t_login_log (login_log_id INT AUTO_INCREMENT PRIMARY KEY,user_id INT,ip VARCHAR(23),login_datetime datetime)ENGINE=InnoDB;##插入初始化数据INSERT INTO t_user (user_name,password)VALUES('admin','123456');COMMIT;
上述指令执行完成后,在Mysql创建的情况如下:


package com.baobaotao.domain;import java.io.Serializable;import java.util.Date;public class LoginLog implements Serializable{private int loginLogId;private int userId;private String ip;private Date loginDate;public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}public Date getLoginDate() {return loginDate;}public void setLoginDate(Date loginDate) {this.loginDate = loginDate;}public int getLoginLogId() {return loginLogId;}public void setLoginLogId(int loginLogId) {this.loginLogId = loginLogId;}public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}}
package com.baobaotao.domain;import java.io.Serializable;import java.util.Date;public class User implements Serializable{private int userId;private String userName;private String password;private int credits;private String lastIp;private Date lastVisit;public String getLastIp() {return lastIp;}public void setLastIp(String lastIp) {this.lastIp = lastIp;}public Date getLastVisit() {return lastVisit;}public void setLastVisit(Date lastVisit) {this.lastVisit = lastVisit;}public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}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;}public int getCredits() {return credits;}public void setCredits(int credits) {this.credits = credits;}}
package com.baobaotao.dao;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Repository;import com.baobaotao.domain.LoginLog;@Repositorypublic class LoginLogDao {@Autowiredprivate JdbcTemplate jdbcTemplate;/*** 插入登录信息* @param loginLog*/public void insertLoginLog(LoginLog loginLog) {String sqlStr = "INSERT INTO t_login_log(user_id,ip,login_datetime) "+ "VALUES(?,?,?)";Object[] args = { loginLog.getUserId(), loginLog.getIp(),loginLog.getLoginDate() };jdbcTemplate.update(sqlStr, args);}}
package com.baobaotao.dao;import java.sql.ResultSet;import java.sql.SQLException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowCallbackHandler;import org.springframework.stereotype.Repository;import com.baobaotao.domain.User;@Repositorypublic class UserDao {@Autowiredprivate JdbcTemplate jdbcTemplate;/*** 获取匹配的用户数量* @param userName* @param password* @return*/public int getMatchCount(String userName, String password) {String sqlStr = " SELECT count(*) FROM t_user "+ " WHERE user_name =? and password=? ";return jdbcTemplate.queryForInt(sqlStr, new Object[] { userName, password });}/*** 查询用户* @param userName* @return*/public User findUserByUserName(final String userName) {String sqlStr = " SELECT user_id,user_name,credits "+ " FROM t_user WHERE user_name =? ";final User user = new User();jdbcTemplate.query(sqlStr, new Object[] { userName },new RowCallbackHandler() {public void processRow(ResultSet rs) throws SQLException {user.setUserId(rs.getInt("user_id"));user.setUserName(userName);user.setCredits(rs.getInt("credits"));}});return user;}/*** 更新登录信息* @param user*/public void updateLoginInfo(User user) {String sqlStr = " UPDATE t_user SET last_visit=?,last_ip=?,credits=? "+ " WHERE user_id =?";jdbcTemplate.update(sqlStr, new Object[] { user.getLastVisit(),user.getLastIp(),user.getCredits(),user.getUserId()});}}
package com.baobaotao.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.baobaotao.dao.LoginLogDao;import com.baobaotao.dao.UserDao;import com.baobaotao.domain.LoginLog;import com.baobaotao.domain.User;@Servicepublic class UserService {@Autowiredprivate UserDao userDao;@Autowiredprivate LoginLogDao loginLogDao;/*** 是否有匹配的用户* @param userName* @param password* @return*/public boolean hasMatchUser(String userName, String password) {int matchCount =userDao.getMatchCount(userName, password);return matchCount > 0;}/*** 根据用户名查找用户* @param userName* @return*/public User findUserByUserName(String userName) {return userDao.findUserByUserName(userName);}/*** 登录成功时,更新登录信息并添加登录记录* @param user*/public void loginSuccess(User user) {user.setCredits( 5 + user.getCredits()); //信用加5LoginLog loginLog = new LoginLog();loginLog.setUserId(user.getUserId());loginLog.setIp(user.getLastIp());loginLog.setLoginDate(user.getLastVisit());userDao.updateLoginInfo(user);loginLogDao.insertLoginLog(loginLog);}}
package com.baobaotao.web;public class LoginCommand {private String userName;private String password;public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}}
package com.baobaotao.web;import java.util.Date;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;import com.baobaotao.domain.User;import com.baobaotao.service.UserService;@Controllerpublic class LoginController{@Autowiredprivate UserService userService;@RequestMapping(value = "/index.html")public String loginPage(){return "login";}@RequestMapping(value = "/loginCheck.html")public ModelAndView loginCheck(HttpServletRequest request,LoginCommand loginCommand){boolean isValidUser =userService.hasMatchUser(loginCommand.getUserName(),loginCommand.getPassword());if (!isValidUser) {return new ModelAndView("login", "error", "用户名或密码错误。");} else {User user = userService.findUserByUserName(loginCommand.getUserName());user.setLastIp(request.getLocalAddr());user.setLastVisit(new Date());userService.loginSuccess(user);request.getSession().setAttribute("user", user);return new ModelAndView("main");}}}
说明:
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><!-- 从类路径下加载Spring配置文件,classpath关键字特指从类路径下加载 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- 负责启动Spring容器的监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 配置Spring MVC,其对应的配置文件为:servlet-name-servlet.xml,本项目的为:baobaotao-servlet.xml --><servlet><servlet-name>baobaotao</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>3</load-on-startup></servlet><servlet-mapping><servlet-name>baobaotao</servlet-name><url-pattern>*.html</url-pattern></servlet-mapping></web-app>
说明:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd"><!-- 扫描类包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入 --><context:component-scan base-package="com.baobaotao.dao"/><context:component-scan base-package="com.baobaotao.service"/><!-- 配置数据源 --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"p:driverClassName="com.mysql.jdbc.Driver"p:url="jdbc:mysql://localhost:3306/sampledb"p:username="root"p:password="xxx" /><!-- 配置Jdbc模板 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"p:dataSource-ref="dataSource" /><!-- 配置事务管理器 --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"p:dataSource-ref="dataSource" /><!-- 通过AOP配置提供事务增强,让service包下所有Bean的所有方法拥有事务 --><aop:config proxy-target-class="true"><aop:pointcut id="serviceMethod"expression=" execution(* com.baobaotao.service..*(..))" /><aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice" /></aop:config><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="*" /></tx:attributes></tx:advice></beans>
说明:
<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd"><!-- 扫描web包,应用Spring的注解 --><context:component-scan base-package="com.baobaotao.web"/><!-- 配置视图解析器,将ModelAndView及字符串解析为具体的页面 --><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"p:viewClass="org.springframework.web.servlet.view.JstlView"p:prefix="/WEB-INF/jsp/"p:suffix=".jsp" /></beans>
说明:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><html><head><title>论坛登录</title></head><body><c:if test="${!empty error}"><font color="red"><c:out value="${error}" /></font></c:if><form action="<c:url value="loginCheck.html"/>" method="post">用户名:<input type="text" name="userName"><br>密 码:<input type="password" name="password"><br><input type="submit" value="登录" /><input type="reset" value="重置" /></form></body></html>
说明:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>论坛</title></head><body>${user.userName},欢迎您进入宝宝淘论坛,您当前积分为${user.credits};</body></html>
log4j.rootLogger=DEBUG,A1log4j.appender.A1=org.apache.log4j.ConsoleAppenderlog4j.appender.A1.layout=org.apache.log4j.PatternLayoutlog4j.appender.A1.layout.ConversionPattern=%d %5p [%t] (%F:%L) - %m%n





com.baobaotao.service包:TestUserService.java
package com.baobaotao.service;import static org.junit.Assert.*;import java.util.Date;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.baobaotao.domain.User;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations={"classpath:applicationContext.xml"})public class TestUserService {@Autowiredprivate UserService userService;@Testpublic void testHasMatchUser() {boolean b1 = userService.hasMatchUser("admin", "123456");boolean b2 = userService.hasMatchUser("admin", "1111");assertTrue(b1);assertTrue(!b2);}@Testpublic void testFindUserByUserName() {User user = userService.findUserByUserName("admin");assertEquals(user.getUserName(), "admin");}@Testpublic void testAddLoginLog() {User user = userService.findUserByUserName("admin");user.setUserId(1);user.setUserName("admin");user.setLastIp("192.168.12.7");user.setLastVisit(new Date());userService.loginSuccess(user);}}


附件列表
【Spring实战-1】网站登录系统的更多相关文章
- 实战开发,使用 Spring Session 与 Spring security 完成网站登录改造!!
上次小黑在文章中介绍了四种分布式一致性 Session 的实现方式,在这四种中最常用的就是后端集中存储方案,这样即使 web 应用重启或者扩容,Session 都没有丢失的风险. 今天我们就使用这种方 ...
- spring security 管理会话 多个用户不可以使用同一个账号登录系统
多个用户不能使用同一个账号同时登陆系统. 1. 添加监听器 在web.xml中添加一个监听器,这个监听器会在session创建和销毁的时候通知Spring Security. <listener ...
- Spring Security 实战:QQ登录实现
准备工作 1.在 QQ互联 申请成为开发者,并创建应用,得到APP ID 和 APP Key.2.了解QQ登录时的 网站应用接入流程.(必须看完看懂) 为了方便各位测试,直接把我自己申请的贡献出来:A ...
- 多平台的网站实现单点登录系统(SSO)的开发思路 让你的会员中心更加统一(参考资料)
单点登录并不是一个新鲜的玩意儿,比较官方的解释是企业业务整合的解决方案之一,通俗来讲SSO就是一个通用的用户中心,国内比较流行的UCenter就是一套单点登录解决方案.而近期以CSDN明文存储用户密码 ...
- 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第十天】(单点登录系统实现)
https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...
- Django实战(一)-----用户登录与注册系统2(数据模型、admin后台、路由视图)
使用Django开发Web应用的过程中,很多人都是急急忙忙地写视图,写前端页面,把最根本的模型设计给忽略了. 模型中定义了数据如何在数据库内保存,再直白点说就是数据表的定义.这部分工作体现在Djang ...
- Spring实战5:基于Spring构建Web应用
主要内容 将web请求映射到Spring控制器 绑定form参数 验证表单提交的参数 对于很多Java程序员来说,他们的主要工作就是开发Web应用,如果你也在做这样的工作,那么你一定会了解到构建这类系 ...
- 【SSO】单点登录系统
一.单点登录系统介绍 对于一个开发项目来说,每个项目都必不可少要有登录的这个功能.但是随着项目的变大,变大,再变大.系统可能会被拆分成多个小系统,咱们就拿支付宝和淘宝来说,咱们在淘宝上购物,然后就可以 ...
- Spring实战5-基于Spring构建Web应用
主要内容 将web请求映射到Spring控制器 绑定form参数 验证表单提交的参数 写在前面:关于Java Web,首先推荐一篇文章——写给java web一年左右工作经验的人,这篇文章的作者用精练 ...
随机推荐
- glusterfs分布式存储
一,分布式文件系统理论基础 1.1 分布式文件系统出现 计算机通过文件系统管理,存储数据,而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长,单纯通过增加硬盘个数来扩展计算机文件系统的存储容量 ...
- Activity与Service数据交互:Binder、bindService的用法
package com.lixu.jiaohu; import com.lixu.jiaohu.MyAppService.Mybind; import android.app.Activity; im ...
- Mysql/Mariadb 升级注意事项
因需要使用到分区表,在业务不中断的情况下,可以新增分区,需要将原来的Mariadb10.1.25版本升级到Mariadb10.3.8. 1.升级步骤如下 1)新搭建Mariadb10.3.8版本的DB ...
- python面试知识总结
1. 先做自我介绍 2. 做Python几年了?为什么选择Python?3. 学历?大学什么专业?4. 除了Python以外对其他语言有没有了解?5. 你对Python这门语言的看法?6. 在学习Py ...
- JavaScript 自定义文本框光标——初级版
文本框(input或textarea)的光标无法修改样式(除了通过color修改光标颜色).但笔者希望个人创建自己的网站时,文本框的光标有属于自己的风格.所以,尝试模拟文本框的光标,设计有自己风格的光 ...
- 【Cocos2d-X(1.x 2.x) 修复篇】iOS6 中 libcurl.a 无法通过armv7s编译以及iOS6中无法正常游戏横屏的解决方法
本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/1000.html ...
- union-find算法
1.背景 <算法>一书中提到了关于算法的一些基本思想 优秀的算法因为能够解决实际的问题而变得更为重要: 高效算法的代码可以很简单: 理解某个实现的性能特点是一项有趣而令人满足的挑战: 在 ...
- Android 自定义圆形旋转进度条,仿微博头像加载效果
微博 App 的用户头像有一个圆形旋转进度条的加载效果,看上去效果非常不错,如图所示: 据说 Instagram 也采用了这种效果.最近抽空研究了一下,最后实现的效果是这样: 基本上能模拟出个大概,代 ...
- linux下忘记mysql密码的几种找回方法
今天我们主要是讲一下关于linux忘记mysql密码处理方法,下面提供了5种linux忘记mysql密码找回方法哦.方法一(先进入root权限):# /etc/init.d/mysql stop# m ...
- CentOS7安装OpenStack(Rocky版)-08.启动一个虚拟机实例
安装完openstack的必要组件keystone,nova,glance,neutron以后就可以使用openstack命令创建一台云虚拟机了 ------------------- 完美的分割线 ...