SpringMVC 入门——④[登录注册(+登录检测)]
在上个基础上加了一个登录检测功能
主要流程
创建 主页面.jsp 注册.jsp 登录.jsp 登录成功/失败.jsp
基本都会吧,就不重复了
配置拦截器,判断是否是登录状态
编写实现类(Controller)代码
实现如下逻辑

登录用户的时间线>

index.jsp
查看:链接的是成功的页面
登录:链接的是登录页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<title>Document</title>
</head>
<body>
<h1>宇宙的秘密,意识的源头,BUG的由来都在这了</h1>
<a href="${pageContext.request.contextPath}/demo1/succse">查看</a>
<a href="${pageContext.request.contextPath}/demo1/tologin">登录</a>
</body>
</html>
Controller层中的业务类 定义两个页面跳转方法
如果是已经登录用户的状态,则直接跳转到成功页面
如果是没有登录用户的状态,则跳转到登录用户页面
@RequestMapping("/succse")
public String succes() {
return "succse";
}
@RequestMapping("/tologin")
public String tologin() {
return "login";
}
@RequestMapping("/toRegister")
public String toRegister() {
return "regUser";
}
拦截器
程序要如何判断当前是否登录了用户,就要用到SpringMVC的拦截器
创建一个interceptor 代码包,在里面新建一个JAVA文件编写一个拦截器
//拦截器类似于动态代理,拦截器有三个方法:preHandle、postHandle、afterCompletion,拦截器位于控制器运行之前(preHandle)和之后(postHandle、afterCompletion)执行的。在这里preHandle是有一个boolean返回值的,返回true,执行控制器和另外两个方法,放回false,则只刷新页面,不做任何操作。
package com.Ten.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class DemoCommonInterceptor implements HandlerInterceptor {
/**
* Controller层中的业务类方法 执行之前 调用这个方法
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
String url = request.getRequestURI();
// 登录,注册请求都不拦截
if (url.indexOf("/tologin") >= 0||url.indexOf("/regUser")>=0||url.indexOf("/toregUser")>=0||url.indexOf("/tologin")>=0||url.indexOf("/login")>=0) {
return true;
}
//从前端获取Session值,判断当前是否是登录过的
HttpSession session = request.getSession();
if(session.getAttribute("uname")!=null){
//登录过用户的话就放下去
return true;
}else{
//没有登录就去登录
request.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(request,response);
return false;
}
}
}
配置拦截器
在Spring-mvc.xml 文件中配置拦截器
<!-- 登录拦截器 -->
<mvc:interceptors>
<!-- 配置一个全局拦截器,拦截所有请求 -->
<bean class="com.Ten.interceptor.DemoCommonInterceptor"/>
<mvc:interceptor>
<!-- 配置拦截器作用的路径 -->
<mvc:mapping path="/**"/>
<!-- 定义在<mvc: interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
<bean class="com.Ten.interceptor.DemoCommonInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
没有登录用户的时间线>
由于被拦截器拦截,判断没有登录用户,则跳转到注册界面
regUser.jsp
<%--
Created by IntelliJ IDEA.
User: Tenkinoko
Date: 2021/6/24
Time: 19:22
To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><%
request.setCharacterEncoding("utf-8");
%>
<html>
<head>
<title>用户注册</title>
</head>
<body>
<h3>用户注册</h3>
<form method="post" action="${pageContext.request.contextPath}/demo1/regUser">
<table>
<tr>
<td><label>注册用户名</label></td>
<td><input type="text" name="uname"></td>
</tr>
<tr>
<td><label>注册密码</label></td>
<td><input type="password" name="upassword"></td>
</tr>
<tr>
<td><label>用户名</label></td>
<td><input type="text" name="un"></td>
</tr>
<tr>
<td><label>注册</label></td>
<td><input type="submit" value="注册"></td>
</tr>
</table>
</form>
</body>
</html>
输入完数据后 提交给业务层的regUser.方法
//用MAP存储前端给予的数值
@RequestMapping("/regUser")
public String regUser(Map<String, Object> map, User user) {
map.put("uname", user.getUname());
map.put("upassword", user.getUpassword());
return "login";
}
在业务层这个类的上面加入@SessionAttributes()注释
@SessionAttributes(value = {"uname", "upassword"})
这个注释会在数据域把Value中相应 key 值的数据赋值给Session 供全层调用
注册完后转到登录界面
login.jsp
<%--
Created by IntelliJ IDEA.
User: Tenkinoko
Date: 2021/6/24
Time: 19:26
To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><%
request.setCharacterEncoding("utf-8");
%>
<html>
<head>
<title>登录界面</title>
</head>
<body>
<h3>用户登录</h3>
<form method="post" action="${pageContext.request.contextPath}/demo1/login">
<table>
<tr>
<td><label>登录账号</label></td>
<td><input type="text" name="uname"></td>
</tr>
<tr>
<td><label>登录密码</label></td>
<td><input type="password" name="upassword"></td>
</tr>
<tr>
<td><input type="submit" value="登录"></td>
</tr>
<tr>
<a href="${pageContext.request.contextPath}/demo1/toRegister">注册</a>
</tr>
</table>
</form>
</body>
</html>
登录完成后转到 业务层执行登录业务
@RequestMapping("/login")
public String login(HttpSession session, String uname, String upassword) {
if (userService.poker(session, uname, upassword)) {
session.setAttribute("userInfo",uname);
return "redirect:/index.jsp";
} else {
return "regUser";
}
}
userService是 Service层专门处理业务逻辑的类 poker 是判断登录的用户名和密码是否在”数据库”中
@Autowired
private UserService userService;
public interface UserService {
public boolean poker(HttpSession session,String uname, String upward);
}
@Service
public class UserServiceImpl implements UserService {
@Override
public boolean poker(HttpSession session,String uname, String upward) {
return (uname.equals(session.getAttribute("uname"))&&upward.equals(session.getAttribute("upassword")));
}
}
//我用session里面的key值 代表数据库(其实意思差不多,都是判断是否有这玩意)
登录成功就转到主页面,登录失败就转到登录失败的页面(重新登录)
结语
只是简简单单的配合拦截器写个登录拦截,其实也不太完善,没有错误提示,成功提示等等,Session其实这样用也不好。
由俭入奢易,由奢入俭难。
一入源码深似海,从此节操是路人