【JavaWeb项目】一个众筹网站的开发(五)后台用户登录功能
用户模块
1)注册
- 表单校验,使用校验插件
- 用户密码需要加密存储
- 注册成功后来到管理控制台,将用户放在session中,防止以后获取
- 以后用户经常获取用户id,使用mabatis主键自增策略,保存用户的时候,将自增的主键放在TUser的id属性上
- 实际问题:用户的id不是自增
用户分开存储,经常查询需要根据关键字来直接锁定数据库
用户表合并,导致有问题
采取的策略;关键表的主键,一定不是自增的。美团:用户手机号等位id
2)登陆
- 输入登陆内容
- 来到controlller进行登陆
- 调用Service查询当前用户&密码是否存在
- 登陆成功来到控制台页面
- 登陆失败来到登陆页面
我们现在设置的是通过转发来到页面,此时刷新就是重复提交。我们要在关键位置解决表单重复提交问题。注册&登陆页面可以不用管,但是某些插入或者更新数据库转发到页面,数据CUD没有任何校验规则(直接就成功),一定要解决表单重复提交。表单重复提交解决办法:令牌机制;重定向(解决重复提交的根本方法)
登陆逻辑
login.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>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="keys" content="">
<meta name="author" content="">
<%@include file="/WEB-INF/includes/css-file.jsp" %>
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<div><a class="navbar-brand" href="${ctp}/index.jsp" style="font-size:32px;">尚筹网-创意产品众筹平台</a></div>
</div>
</div>
</nav> <div class="container"> <form class="form-signin" role="form" action="${ctp}/permission/user/login" method="post">
<h2 class="form-signin-heading"><i class="glyphicon glyphicon-log-in"></i> 用户登录</h2>
<div class="form-group has-success has-feedback">
<input type="text" class="form-control" name="loginacct"
id="loginacct_input" placeholder="请输入登录账号" value="${errorUser.loginacct }" autofocus>
<span class="glyphicon glyphicon-user form-control-feedback"></span>
<span style="color: red;">${msg }</span>
<!-- 取出一次就将session中的这个属性移除 -->
<!--
var="msg" 指定要从域中移除的key
scope="" 指定从哪个域中移除,不写默认会从所有域中移除,包括session
-->
<c:remove var="msg"/>
<c:remove var="errorUser"/>
</div>
<div class="form-group has-success has-feedback">
<input type="text" class="form-control" name="userpswd"
id="userpswd_input" placeholder="请输入登录密码" style="margin-top:10px;">
<span class="glyphicon glyphicon-lock form-control-feedback"></span>
</div>
<div class="form-group has-success has-feedback">
<select class="form-control" >
<option value="member">会员</option>
<option value="manager">管理</option>
</select>
</div>
<div class="checkbox">
<label>
<input type="checkbox" value="remember-me"> 记住我
</label>
<br>
<label>
忘记密码
</label>
<label style="float:right">
<a href="${ctp}/reg.jsp">我要注册</a>
</label>
</div>
<a class="btn btn-lg btn-success btn-block" onclick="dologin()" > 登录</a>
</form>
</div>
<script src="jquery/jquery-2.1.1.min.js"></script>
<script src="bootstrap/js/bootstrap.min.js"></script>
<script>
function dologin() {
var type = $(":selected").val();
if ( type == "manager" ) {
// 管理员登陆
// 当前页面只有一个表单,直接选第一个表单即可
$("form:first").submit();
//window.location.href = "main.html";
} else {
// 超链接跳转到指定的地址
window.location.href = "${ctp }/index.jsp";
}
}
</script>
</body>
</html>
<%@include file="/WEB-INF/includes/css-file.jsp" %>
提交表单转向
action="${ctp}/permission/user/login"
出错回显
value"${errorUser.loginacct }
显示出错信息<span style="color: red;">${msg }</span>
<!-- 取出一次就将session中的这个属性移除 -->
<!--
var="msg" 指定要从域中移除的key
scope="" 指定从哪个域中移除,不写默认会从所有域中移除,包括session
-->
<c:remove var="msg"/>
<c:remove var="errorUser"/>
控制器定义登陆的超链接
package com.atguigu.scw.manager.controller.permission; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; import com.atguigu.scw.manager.bean.TUser;
import com.atguigu.scw.manager.constant.Constants;
import com.atguigu.scw.manager.service.UserService; //处理所有/permission/user下的请求
@RequestMapping("/permission/user")
@Controller
public class UserController { private final String MANAGER_MAIN = "manager/main";
@Autowired
UserService userService; @RequestMapping("/login")
public String login(TUser user, HttpSession session) {
// 登陆后返回的用户要放在session中,用TUser
TUser login = userService.login(user);
if (login == null) {
// 登陆失败
session.setAttribute("errorUser", user);
session.setAttribute("msg", "登陆失败");
return "redirect:/login.jsp";
}
// 登陆成功
// 1.将用户放在session中
session.setAttribute(Constants.LOGIN_USER, login);
return MANAGER_MAIN;
} // /permission/user/reg
@RequestMapping("/reg")
public String reg(TUser user, Model model, HttpSession session) {
// ...
}
}
需要login方法
接口
package com.atguigu.scw.manager.service;
import com.atguigu.scw.manager.bean.TUser;
public interface UserService {
public boolean register(TUser user);
public TUser login(TUser user);
}
实现类
package com.atguigu.scw.manager.service.impl; import java.util.Date;
import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.atguigu.project.MD5Util;
import com.atguigu.project.MyStringUtils;
import com.atguigu.scw.manager.bean.TUser;
import com.atguigu.scw.manager.bean.TUserExample;
import com.atguigu.scw.manager.bean.TUserExample.Criteria;
import com.atguigu.scw.manager.dao.TUserMapper;
import com.atguigu.scw.manager.service.UserService; @Service
public class UserServiceImpl implements UserService { @Autowired
TUserMapper userMapper; public boolean register(TUser user) {
// ...
} public TUser login(TUser user) {
// 1.拿到用户名和密码
// 2.去数据库查询是否存在
TUserExample example = new TUserExample();
Criteria criteria = example.createCriteria();
// 设置查询条件
criteria.andLoginacctEqualTo(user.getLoginacct());
criteria.andUserpswdEqualTo(MD5Util.digest(user.getUserpswd()));
// 因为失误等原因,可能会查询到多个用户
List<TUser> list = null;
try {
list = userMapper.selectByExample(example);
} catch (Exception e) {
System.out.println(e);
}
// ==1的时候查询成功
return list.size() == 1 ? list.get(0) : null;
} }
spring默认是JDK动态代理,对实现类对象做增强得到的增强类与实现类是兄弟关系,所以不能用实现类接收增强类对象,只能用接口接收。
ssm项目中 @Autowired 注解在接口类上却是注入的是他的实现类
自动装配实现了接口的的实例,只有UserServiceImpl实现了接口,所以就会注入UserServiceImpl
【JavaWeb项目】一个众筹网站的开发(五)后台用户登录功能的更多相关文章
- 【JavaWeb项目】一个众筹网站的开发(四)后台用户注册功能
重点: 密码加密存储 使用jQuery插件做校验和错误提示等 密码不能明文存储,在数据库中是加密存储的 可逆加密:通过密文使用解密算法得到明文 DES AES 不可逆加密:通过密文,得不到明文 MD5 ...
- 【JavaWeb项目】一个众筹网站的开发(八)后台页面详细设置
一.user.jsp改造 删除引入菜单 抽取导航栏 nav-bar.jsp,删除引入导航栏 删除引入main.jsp的到好烂 数据库里添加url 报错,url不对 没有/ url正确 action=& ...
- 【JavaWeb项目】一个众筹网站的开发(一)架构搭建
本项目是@尚硅谷相关视频的记录. 本项目使用Maven构建,工程架构如下图所示: 一.公司的公共父工程和工具类包 1.父工程 每个公司都有自己的父工程 父工程作用:对公司使用的jar包进行统一管理,别 ...
- 【JavaWeb项目】一个众筹网站的开发(九)邮件开发
Java官方支持邮件开发,Javax-mail jdk中默认没有,需要另外下载 apache的基于Javax-mail开发了commons-mail,更加简单高效,推荐使用 一.电子邮件接收和发送协议 ...
- 【JavaWeb项目】一个众筹网站的开发(六)后台用户权限控制
登陆成功进入控制面板后 左侧的菜单是共同的元素,抽取出来做静态包含 要求必须是按照不同的用户得到不同的菜单 用户做了权限限制,哪个用户能操作哪些内容(链接.按钮.内容) 一.RBAC权限模型 权限管理 ...
- 【JavaWeb项目】一个众筹网站的开发(三)第一个网页
一.bootstrap 本项目采用bootstrap3 bootstrap中文网 https://www.bootcss.com/ 使用bootstrap三步: 1.导入jQuery 2.导入boot ...
- 【JavaWeb项目】一个众筹网站的开发(二)架构搭建之架构测试
1.dao层和pojo都是使用mbg生成,基本的CRUD以及JavaBean 2.将mbg放在dao层,一旦dao层打包以后mbg就删除掉 一.创建数据库用于测试 数据库名称:scw_0325 SQL ...
- 【JavaWeb项目】一个众筹网站的开发(七)后台用户菜单
mvn命令不能运行: jar-war-pom之间是可以直接写,优先找这个工程,而不是仓库的位置 pom-pom子父关系,需要去仓库中找,我们需要使用<relativePath>../pro ...
- javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
随机推荐
- mocha.js
mocha 如果你听说过“测试驱动开发”(TDD:Test-Driven Development),单元测试就不陌生. 单元测试是用来对一个模块.一个函数或者一个类来进行正确性检验的测试工作. 比如对 ...
- 带你逐行阅读redux源码
带你逐行阅读redux源码 redux版本:2019-7-17最新版:v4.0.4 git 地址:https://github.com/reduxjs/redux/tree/v4.0.4 redux目 ...
- MyISAM和InnoDB引擎的区别
MySQL默认采用的是MyISAM. MyISAM不支持事务,而InnoDB支持.InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以 ...
- Spring讲解(三)
依赖注入Bean属性,使用xml配置 1.构造方法注入 案例代码演示 public class User { private String username; private String passw ...
- 【leetcode】983. Minimum Cost For Tickets
题目如下: In a country popular for train travel, you have planned some train travelling one year in adva ...
- Kubernetes v1.16 对API的更改
前段时间安装Kubernetes v1.16.2,然后从v1.14版本的拷贝yaml文件过来执行,很多都报没有相应的api,查看一下新版本的api admissionregistration.k8s. ...
- JS基础入门篇(三十六)—面向对象( 三 )
1.class class es6 中 为 关键字用来声明 一个 类 1.只能通过new调用 2.不存在变量提升 3.多个方法之间直接书写,不需要,隔开 4.类的方法是直接定义在类的原型上的 5.定义 ...
- stm32 单片机
STM32系列基于专为要求高性能.低成本.低功耗的嵌入式应用专门设计的ARM Cortex-M3内核(ST's product portfolio contains a comprehensive r ...
- mongo大数据量更新服务端超时解决: Cursor not found, cursor id: 82792803897
mongodb pymongo.errors.CursorNotFound: Cursor not found, cursor id: 82792803897 默认 mongo server维护连接的 ...
- HP Server BIOS实验报告
原文链接http://www.hpiss.com/3924.html 注意:红色字体为HP手册中查找到的资源,及个人感觉应该注意的一些信息,个人翻译的也为红字体,网络中自行查找到的资源,以及询问各位师 ...