使用SpringMVC实现简单的注册登录功能(带拦截器)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44296929/article/details/102515503

一、前言:

上一篇文章我们使用springMVC实现了一个简单的HelloWorld,这篇文章我们实现一个小的Demo,使用springMVC实现简单的注册登录(带拦截器)功能。

二、需求:

1、创建新项目 SPRINGMVC-USER。
2、要求对 /reg.do和 /login.do 能作出响应,响应方式是显示 reg.jsp 和 login.jsp 页面。
3、注册页(reg.jsp)要求有用户名、密码、年龄、手机、邮箱这5个输入项和1个提交按钮。
4、登录页(login.jsp)要求有用户名、密码这2个输入项和1个提交按钮。
5、登录成功以后可以跳转到user_info.jsp和user_password.jsp页面。

首先先分析一下需求,因为我们这里没有使用数据库,所以要将登录信息存到session中,当用户直接访问user_info或user_password页面时,我们去session中查找是否有登录信息,如果有则说明登录过了,直接跳转,如果没有,则重定向到登录页让用户登录,所以这里需要用到拦截器,对直接访问user_info和user_password页面的请求进行拦截,进行登录验证。
(该demo并没有真正的实现注册和登录功能,只是将SpringMVC的流程走了一遍,主要目的是从头到尾的把上一章的HelloWorld练习一遍)

三、实现过程:针对小白的实现过程:
1、首先创建一个maven项目,SPRINGMVC-USER。(创建过程和上篇文章一样,别忘了生成web.xml文件,添加Tomcat运行环境
在这里插入图片描述
2、配置web.xml文件(字符集编码过滤器:放置中文乱码,下面的配置前面都有介绍)。

<!-- 配置字符集编码过滤器 -->
<filter>
  	<filter-name>CharacterEncodingFilter</filter-name>
  	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>utf-8</param-value>
  	</init-param>
</filter>
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置DispatcherServlet -->
<servlet>
  	<servlet-name>DispatcherServlet</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<!-- 1.配置spring的配置文件 -->
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:spring.xml</param-value>
  	</init-param>
  	  	<!-- 2.启动Tomcat时即初始化该Servlet -->
  	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  	<servlet-name>DispatcherServlet</servlet-name>
  	<url-pattern>*.do</url-pattern>
</servlet-mapping>

3、在src\recourses下添加一个spring.xml配置文件。
在这里插入图片描述
配置组件扫描:根目录cn.tedu.spring,和前缀后缀。

<beans xmlns="http://www.springframework.org/schema/beans" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context" 
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"  
	xmlns:jee="http://www.springframework.org/schema/jee" 
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
	<!-- 组件扫描 -->
	<context:component-scan base-package="cn.tedu.spring"/>
	<!-- 配置视图解析器ViewResolver -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 配置前缀 -->
		<property name="prefix" value="/WEB-INF/"></property>
		<!-- 配置后缀 -->
		<property name="suffix" value=".jsp"></property>
		<!-- 经过以上配置后,当前项目中的jsp文件都应该放在/WEB-INF/下-->	
	</bean>
</beans>

4、创建一个User实体类,并生成set、get方法。
在这里插入图片描述

package entity;

public class User {
	private String username;
	private String password;
	private Integer age;
	private String phone;
	private String email;
	public String getUsername() {
		return username;
	}
	public String getPassword() {
		return password;
	}
	public Integer getAge() {
		return age;
	}
	public String getPhone() {
		return phone;
	}
	public String getEmail() {
		return email;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
}

5、创建一个controller来处理请求。
在这里插入图片描述

package cn.tedu.spring.controller;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/user")
public class UserController {
	@RequestMapping("/login.do")
	public String showLogin(){
		System.out.println("开始处理登录业务");
		return "login";
	}

	@RequestMapping("/reg.do")
	public String showReg(){
		System.out.println("开始处理注册业务");
		return "reg";
	}
	@RequestMapping("/info.do")
	public String showInfo(HttpSession session){
		return "user_info";
	}
	@RequestMapping("/password.do")
	public String showPassword(HttpSession session){
		return "user_password";
	}
	@RequestMapping(value="/handler_login.do",method=RequestMethod.POST)
	public String handlerLogin(@RequestParam("username")String username,@RequestParam("password")String password,ModelMap modelMap,HttpSession session){
		System.out.println("username=" + username);
		System.out.println("password=" + password);
		String message;
		if ("root".equals(username)) {
			if ("1234".equals(password)) {
				// 登录成功,记录Session
				session.setAttribute("username", username);
				// 当前位置:/user/handle_login.do
				// 目标位置:/main/index.do
				return "redirect:../main/index.do";
			} else {
				message = "登录失败!密码错误!";
			}
		} else {
			message = "登录失败!用户名不存在!";
		}
		modelMap.addAttribute("msg", message);
		return "error";
	}
	// 3.5. 附:重定向
	@RequestMapping(value="/handler_reg.do",method=RequestMethod.POST)
	public String handleReg(@RequestParam("username") String username,ModelMap modelMap){
		System.out.println("UserController.handleReg()");
		if ("root".equals(username)) {
			String message = "您尝试注册的用户名" + username + "已经被占用!";
			modelMap.addAttribute("msg", message);
			return "error";
		}
		return "redirect:login.do";
	}
}

创建MainController用来最后登录成功以后展示user_infouser_password页面。

package cn.tedu.spring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/main")
public class MainController {
	@RequestMapping("/index.do")
	public String showIndex(){
		
		return "index";
	}
}

6、添加页面
在这里插入图片描述
error.jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Error Message</title>
</head>
<body>
	<h1>${msg }</h1>
</body>
</html>

index.jsp页面:

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
<title>错误页面</title>
</head>
<body style="font-size: 30px;">
	<h1>登陆成功</h1>
	<a href="../user/info.do">User_Info.Jsp页面</a><br>
	<a href="../user/password.do">User_Password.Jsp页面</a>
</body>
</html>

login.jsp页面:

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
<title>登录业务</title>
</head>
<body style="font-size: 30px;">
	<form action="handler_login.do" method="post">
	<fieldset>
		<legend>登录页面</legend>
		用户名:<input name="username"><br>
		密码:<input type="password" name="password"><br>
		<input type="submit" value="确定">
	</fieldset>
	</form>
</body>
</html>

reg.jsp页面:

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
<title>注册业务</title>
</head>
<body style="font-size: 30px;">
	<form action="handler_reg.do" method="post">
	<fieldset>
		<legend>注册页面</legend>
		用户名:<input name="username"><br>
		密码:<input type="password" name="password"><br>
		年龄:<input name="age"><br>
		电话:<input name="phone"><br>
		邮箱:<input name="email"><br>
		<input type="submit" value="提交">
	</fieldset>
	</form>
</body>
</html>

user_info和user_password页面自己随便添加点什么就行,目前还没什么意义。

7、添加拦截器:点击了解 SpringMVC拦截器的使用
在这里插入图片描述

package cn.tedu.spring.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class LoginInterceptor implements HandlerInterceptor{
	CharacterEncodingFilter cef;
	//1
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
		System.out.println("preHandle()");
		//判断session中的数据,得知是否登录表
		HttpSession session=request.getSession();
		if(session.getAttribute("username")==null){
			response.sendRedirect("../user/login.do");
			//返回false拦截
			return false;
		}
		//返回true不拦截
		return true;
	}
	
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("afterCompletion()");
	}

	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("postHandle()");
	}
}

spring.xml文件中添加拦截器的配置信息:点击了解 如何配置SpringMVC拦截器

<!-- 配置拦截器 -->
<mvc:interceptors>
	<!-- 配置第一个拦截器 -->
	<mvc:interceptor >
		<!-- 指定拦截路径 不再拦截路径之内的将不予处理,即不在拦截器根本就不运行-->
		<mvc:mapping path="/user/info.do"/>
		<mvc:mapping path="/user/password.do"/>
		<!-- 指定拦截器类 -->
		<bean class="cn.tedu.spring.interceptor.LoginInterceptor"/>
	</mvc:interceptor>
</mvc:interceptors>

8、启动tomcat,访问 http://localhost:8080/SPRINGMVC-02-USER/user/reg.do
注:此处的注册功能并没有真正的实现注册功能,所以登录的时候一定要使用 用户名:root 和 密码:1234,来进行登录。(这里的spring版本为3.2.8 兼容的jdk1.7以下版本)

9、最后说一下整体的执行流程:
首先访问:http://localhost:8080/SPRINGMVC-02-USER/user/reg.do 后。
1)spring会根据路径/user/reg.do找到对应的Controller来处理该请求。
在这里插入图片描述
2)然后 return ''reg",所以会跳转到/WEB-INF/reg.jsp,进行处理。
(因为我们之前配置了 前缀 和 后缀)
在这里插入图片描述
3)用户添加完信息之后 会根据action提交到handler_reg.do来处理。
在这里插入图片描述
4)如果注册成功,则直接重定向到登录页面进行登录。return "redirect:login.do";
在这里插入图片描述
5)然后跳转到login.jsp来进行登录。
在这里插入图片描述
6)登录成功以后会提交到action="handler_login.do"来进行处理提交的信息。
在这里插入图片描述
7)如果登录成功则重定向到index页面return "redirect:../main/index.do";
在这里插入图片描述
如果登录失败,则跳转到错误页面。
在这里插入图片描述
8)此外说下拦截器,如果用户直接访问user_password.jsp页面或user_info.jsp页面,拦截器会判断用户是否完成了登录操作,如果没登录则会重定向到登录页面让用户进行登录。
在这里插入图片描述
到这整个流程就完成了,这个小Demo完全就是对上一章的巩固,可以敲着玩玩。

注:如果文章对你有一点帮助,请点个赞吧,谢谢!

点击了解:SpringMVC Controller接收请求参数
点击了解:SpringMVC 控制器的响应
点击了解:SpringMVC 拦截器的内容
点击了解:SpringMVC 的路径问题

猜你喜欢

转载自blog.csdn.net/weixin_44296929/article/details/102515503