玩命加载中 . . .

Spring-MVC ④ [登录注册 (登录拦截)]


SpringMVC 入门——④[登录注册(+登录检测)]

在上个基础上加了一个登录检测功能

主要流程

  1. 创建 主页面.jsp 注册.jsp 登录.jsp 登录成功/失败.jsp

    基本都会吧,就不重复了

  2. 配置拦截器,判断是否是登录状态

  3. 编写实现类(Controller)代码

  4. 实现如下逻辑

登录用户的时间线>


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其实这样用也不好。

由俭入奢易,由奢入俭难。

一入源码深似海,从此节操是路人


文章作者: 青逝痕
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 青逝痕 !
  目录