Spring MVC+mybatis项目入门:旅游网(五)登录与注销

个人博客:Spring MVC+mybatis项目入门:旅游网(五)登录与注销 | iwts's blog

先看这个!

这是18年的文章,回收站里恢复的,现阶段看基本是没有参考意义的,技术老旧脱离时代(2024年辣铁铁)

如果你在找相关的内容,建议先自我反省一下为什么会搜这么old school的关键词,其次请直接上b站搜索Spricing boot+培训班,看最新的项目相关视频

利用session实现登录逻辑

        登录逻辑还是比较简单的,后端调用数据库进行数据匹配,正确则登录,否则返回错误信息:这里可以详细一点,例如声明是账号不存在还是密码错误。这里并没有实现数据加密,而实际上应该是加密的比较好。如果加密的话,可能会将账号与密码合并在一起,所以这样就无法判定就是是账号不存在还是密码错误。

        而登录成功以后实际上就可以利用session,将数据信息装进session,这样,只要session有相应的值,整体逻辑就应该按照用户登录的情况考虑。例如首页,我们在用户没有登录的时候,显示登录按钮,如果登录就显示用户的昵称。这部分可以利用JSTL实现。

数据库匹配验证账号密码

        mybatis的使用上一章已经写过了,这里就不多说。只用直接select获取值就可以了。这里可以将用户全部搜索出来然后一个一个匹配,也可以直接将账号当做key直接搜索。如果有结果就可以认为找到了匹配,可以验证密码了。当密码验证成功就可以写入session。下面是代码:

package me.iwts.controller;import me.iwts.bean.User;
import me.iwts.mapper.UserMapper;
import me.iwts.tools.ViewTool;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import java.io.Reader;@Controller
public class UserController {public static SqlSessionFactory sessionFactory;public static SqlSession sqlSession;public static UserMapper mapper;// 查找数据库是否已经有该用户,并返回public static User selectUserByAccount(String account){try{User ret = mapper.selectUserByAccount(account);return ret;}catch (Exception e){e.printStackTrace();}return null;}// mybatis初始化static{try {Reader reader = Resources.getResourceAsReader("mybatis-config.xml");sessionFactory = new SqlSessionFactoryBuilder().build(reader);} catch (Exception e) {e.printStackTrace();}sqlSession =  sessionFactory.openSession();mapper = sqlSession.getMapper(UserMapper.class);}// 登录@RequestMapping("login.action")public ModelAndView login(@ModelAttribute User user, Model model, HttpSession session){User selectUser = selectUserByAccount(user.getAccount());if(selectUser == null){model.addAttribute("loginWrong","该账号不存在");model.addAttribute("user",user);return new ModelAndView(ViewTool.LOGIN);}else{if(selectUser.getPasswd().compareTo(user.getPasswd()) != 0){model.addAttribute("loginWrong","密码错误");model.addAttribute("user",user);return new ModelAndView(ViewTool.LOGIN);}else{// 可以登录session.setAttribute("isLogin",true);session.setAttribute("user",selectUser);session.setAttribute("userName",selectUser.getUserName());// 登录后进行一次转发,防止重复提交return new ModelAndView("redirect:/loginRedirect");}}}// 登录重定向@RequestMapping("loginRedirect")public ModelAndView loginRedirect(){return new ModelAndView(ViewTool.INDEX);}
}

可以看到,我的是直接利用账号在数据库进行搜索。而mybatis返回的是一个User对象,而这个对象就是当时定义的resultMap。接下来就是正常的匹配逻辑了。

        最后允许登录的话,就可以对session进行设置。将一些对象放进去就可以了。这样前端就可以利用这些值完成操作。当然最后也需要重定向。重复登录是没有意义的。

        这里我删减了一段代码,在源码中可以看到利用转发跳转的情况,这部分等之后再说。

Spring MVC中对于request、session等对象的处理

        这里不太入门了,可以看到,我写的方法里面直接声明了HttpSession对象,其他的例如ServletRequest等也都可以直接获得。如果不想了解太多,就当做这些“JSP内置对象”在Spring MVC中也可以直接调用。其本质仍然是因为前后端直接交互,因为存在请求,所以可以获得request,进而session、application等对象都是可以直接获得。

        简而言之,需要session的时候,直接在方法参数列表调用HttpSession的声明,然后就可以直接调用了。这里就将一些判定值以及User对象存进session里面供前端调用。

利用session实现前端优化

        配置EL语句,前端也可以进行新的操作了。可以看下现在JSP页的代码:

<%@ page import="me.iwts.bean.Tourism" %>
<%@ page import="java.util.List" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title><meta charset="UTF-8">
</head>
<body><p>首页测试</p><a href="/getRegister.action">注册</a><c:choose><c:when test="${sessionScope.isLogin == true}"><a href="/getProfile.action">${sessionScope.userName}</a></c:when><c:otherwise><a href="/getLogin.action">登录</a></c:otherwise></c:choose>
</body>
</html>

利用JSTL和EL语句,可以方便地实现逻辑:未登录则显示“登录”,登录过了则把用户名显示出来。

注销逻辑与实现

        注销当然也是非常简单了,把数据从session中抹除即可。这里我将注销写进了新的页面,这个页面是用户处理页面,可以查看行程、修改个人信息等。然后这里可以处理注销操作。入口就是当已经登录以后,自己的用户名是一个a标签可以完成发出请求的作用。

// 注销
@RequestMapping("logout")
public ModelAndView logout(HttpSession session){session.setAttribute("isLogin",false);session.removeAttribute("user");session.removeAttribute("userName");return new ModelAndView("redirect:/logoutRedirect");
}
// 注销重定向到首页
@RequestMapping("logoutRedirect")
public ModelAndView logoutRedirect(){return new ModelAndView(ViewTool.INDEX);
}

管理员登录与注销

        实际上就是Admin类了,其实整体几乎与User类一样,代码也很少变化。只是需要多配置Admin的mybatis以及写关于Admin的逻辑。这里就不多说了。只有JSP部分稍微多了一点内容。可一看到首页:

<%@ page import="me.iwts.bean.Tourism" %>
<%@ page import="java.util.List" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title><meta charset="UTF-8">
</head>
<body><p>首页测试</p><a href="/getRegister.action">注册</a><c:choose><c:when test="${sessionScope.isLogin == true}"><%--管理员入口和普通用户入口要分开--%><c:choose><c:when test="${sessionScope.isAdmin == true}"><a href="/getAdminConsole.action">${sessionScope.account}</a></c:when><c:otherwise><a href="/getProfile.action">${sessionScope.userName}</a></c:otherwise></c:choose></c:when><c:otherwise><a href="/getLogin.action">登录</a></c:otherwise></c:choose>
</body>
</html>

多了判定是管理员还是用户。

下一章链接

未完待续——缺哥哥里什么时候出黑暗剑22啊?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/15917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3款简洁个人网站引导页(附带源码)

3款个人网站引导页 效果图及部分源码1.个人页2.引导页3.导航页 领取源码下期更新预报 效果图及部分源码 1.个人页 部分源码 * {margin: 0;padding: 0; }body {background-image: linear-gradient(to left, rgba(255, 0, 149, 0.2), rgba(0, 247, 255, 0.2)), url(../img/bg.j…

新建一个STM32的工程

一、SMT32开发方式 1、基于寄存器的方式&#xff1a;和51单片机开发方式一样&#xff0c;是用程序直接配置寄存器&#xff0c;来达到我们想要的功能&#xff0c;这种方式最底层、最直接、效率会更高一些&#xff0c;但是STM32的结构复杂、寄存器太多&#xff0c;所以不推荐基于…

【408真题】2009-15

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

OmicsTools新增了22种发表级的配色方案

OmicsTools新增了22种发表级的配色方案 我开发了一款本地电脑无限使用的零代码生信数据分析作软图神器电脑软件OmicsTools&#xff0c;欢迎大家使用OmicsTools进行生物医学科研数据分析和作图&#xff0c;该软件件能让大家在不需要任何编程和代码编写的基础上&#xff0c;分析…

电子电器架构 - AUTOSAR软件架构Current Features in a Nutshell

电子电器架构 - AUTOSAR软件架构Current Features in a Nutshell 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的…

C++ windows api BYTE数据类型详解

说明 BYTE数据类型是unsigned char的别名&#xff0c;也就是说他的长度是一个字节。0x00-0xFF之间&#xff0c;并且通常没有固定的读取方式。 我们可以用BYTE类型来存储原始二进制数据&#xff0c;例如图像视频流数据&#xff0c;网络数据包&#xff0c;文件I/O等。 BYTE更广…

【笔记】Pytorch安装配置

参考视频 安装前建议预留至少10个G的空间&#xff0c;会省下很多麻烦 查看安装是否成功&#xff0c;可以在Anaconda Prompt里输入conda list查看conda环境是否配置了pytorch/torchvision 1.安装anaconda 2.安装 CUDA CUDA在官网直接安装即可&#xff0c;需要先查看自己电脑…

二分查找(经典)

文章目录 二分查找循环不变量算法实现 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums …

java list<AnalystEducationDO> 转成List<AnalystEducationRespVO>两个对象的属性一样

如果AnalystEducationDO和AnalystEducationRespVO两个类的属性完全相同&#xff0c;且遵循Java Bean的命名规范&#xff08;即具有相应的getter和setter方法&#xff09;&#xff0c;你可以利用一些库来简化转换过程&#xff0c;比如Apache BeanUtils或Spring Framework的BeanU…

容器是什么

什么是容器&#xff1f; 容器是一种轻量级、可移植的软件包&#xff0c;它包含软件运行所需的所有内容&#xff0c;包括代码、运行时环境、系统工具、系统库和设置。容器使得开发、部署和管理应用程序变得更加高效&#xff0c;因为它们提供了一个标准化的环境&#xff0c;确保…

云原生安全攻防--快速识别虚拟机、Docker和K8s集群环境

今天我们将一起学习一个非常实用的技巧&#xff0c;快速识别云原生环境。 对于攻击者而言&#xff0c;随着云原生应用普及&#xff0c;当攻击者获得一个shell权限时&#xff0c;那么这个shell可能处于虚拟主机里&#xff0c;也有可能在一个Docker环境里&#xff0c;或者在K8s集…

近邻算法模型

目录 1.概述 2.定义 3.优缺点 4.应用场景 5.未来展望 6.代码实现 7.应用实例 1.概述 近邻算法&#xff08;K-Nearest Neighbor&#xff0c;KNN&#xff09;是一种基本的机器学习算法&#xff0c;基本思想是&#xff1a;如果一个样本在特征空间中的 k 个最相似&#xff…

聚合函数查询语法,利用人工智能生成DDL,DML语句会省时省力

#聚合函数查询语法 #查询员工最大年龄 select max(age) from student; #查询名字叫做张三的人数 select userName,count(userName) from student where userName张三; #基本语法 select max/min/count/avg/sum(字段名) from 表名 where 字段名 ;#分组函数 #利用group by进行分…

数据结构面试题总结

本文总结面试题&#xff1a; 用Java实现一个栈用Java实现一个队列用Java实现一个链表 1. 用Java实现一个栈 import java.util.ArrayList; import java.util.EmptyStackException; import java.util.List;// 使用泛型&#xff0c;兼容各种数据类型 public class MyStack<T…

创客贴:极简高效的智能平面设计神器测评

给大家推荐一款智能平面设计作图软件——创客贴&#xff0c;简单来说&#xff0c;就是给那些需要频繁进行平面设计的人提供帮助的。它作为一款在线图片编辑器&#xff0c;可以免费使用&#xff0c;让你轻松进行创意设计。创客贴不仅提供了海量正版设计模板和图片素材&#xff0…

vue3 依赖-组件tablepage-vue3版本1.1.2~1.1.5更新内容

github求⭐ 可通过github 地址和npm 地址查看全部内容 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例-汇总 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#…

美甲店会员预约系统管理小程序的作用是什么

女性爱美体现在方方面面&#xff0c;美丽好看的指甲也不能少&#xff0c;市场中美甲店、小摊不少&#xff0c;也跑出了不少连锁品牌&#xff0c;70后到00后&#xff0c;每个层级都有不少潜在客户&#xff0c;商家需要获取和完善转化路径&#xff0c;不断提高品牌影响力与自身内…

JSON解析库之 Fastjson

在开发的过程中我们避免不了需要对json格式的数据进行处理&#xff0c;我们可以借助fastjson来帮助我们快速处理json。 1、特点 高性能&#xff1a;Fastjson通常被认为是最快的JSON解析库之一&#xff0c;具有较快的序列化和反序列化速度。广泛的Java对象支持&#xff1a;Fas…

wsl 无法进行域名解析

修改/etc/revsolv.conf /etc/resolv.conf nameserver 8.8.8.8 nameserver 114.114.114.114 nameserver 【本地电脑ipconfig下的网卡网关地址】 However, for some reason my resolv.conf keep getting recreated on every boot. So I had to make it immutable, like so: sudo …

stringcstring

<string>是C标准库头文件&#xff0c; <cstring>是C标准库头文件. string中可以进行 >等运算&#xff0c; 而cstring中不能进行相关运算。 using namespace std; #include <string> //可以定义string s&#xff1b;可以用到strcpy等函数 using …