Spring MVC实现带有验证码的登录注册模块

记:最近两天在完善毕业设计和论文终稿,完善毕业设计时想要在登录注册模块添加一个验证码功能,在网上找了很多参考资料,但是在实现的时候都不是很尽如人意。后来找了一个在前端直接生成的验证码代码,根据自己的毕设项目进行了修改,已经可以完美运行(姑且认为是完美吧~)并且符合我的要求。有点长,但是很详细,如果没有c币的可以留下邮箱~

(完整项目资源中包含的也有lib,js,css包,可以只下载完整登录注册项目)

完整登录注册项目下载地址:https://download.csdn.net/download/qq_38938670/12344968

js和css,lib包下载地址(image文件夹在登录注册时用不到):https://download.csdn.net/download/qq_38938670/12344986

1、效果图如下:

我的数据库中管理员账号:admin 密码:123456,普通用户自己注册就可以。后面我会给出数据库的相关代码,具体的界面就自己根据自己的项目进行添加和修改,我的毕设完整项目还未完全完成,完成后会进一步更新全部的项目。

2、登录注册小项目结构图如下:

3、详细代码如下:

(1)FormController.java

扫描二维码关注公众号,回复: 11216616 查看本文章
package org.fkit.dym.controller;

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

/**
 * 
 * @author 
 *页面跳转控制
 */
@Controller
public class FormController {
	@RequestMapping(value="/{formName}")
	
	/**pathvariabe注解可以方便获得请求url中的动态参数*/
	public String loginForm(@PathVariable String formName) {
		return formName;
	}
}

(2)UserController.java

package org.fkit.dym.controller;

import javax.servlet.http.HttpSession;

import org.fkit.dym.domain.User;
import org.fkit.dym.service.DymService;
import org.fkit.dym.util.common.DymConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

/**
 * 处理用户请求控制器
 * @author 
 *
 */
@Controller
public class UserController {
	//自动注入UserService
	@Autowired
	@Qualifier("dymService")
	private DymService dymService;
	/**
	 * 处理登陆请求
	 * @param loginname 登录名
	 * @param password 密码
	 * @param session 保存user对象
	 * @param mv 跳转的视图
	 */
	@RequestMapping(value="/login")
	public ModelAndView login(
			@RequestParam("loginname") String loginname,
			@RequestParam("password") String password,
			@RequestParam("flag") Integer flag,
			HttpSession session,
			ModelAndView mv) {
		//调用业务逻辑组件判断用户是否可以登陆
		User user=dymService.login(loginname, password);
		Integer status=dymService.testpass(loginname);
		if(flag==1)
		{
			if(user!=null) {
				//将用户保存到httpSession中
				session.setAttribute(DymConstants.USER_SESSION, user);
				if(loginname.equals("admin"))
				{
					//管理员登陆跳转到main页面,客户端跳转
					mv.setViewName("redirect:/main");
				}
				else
				{
					if(status==1)
					{
						//普通已审核用户登陆跳转到usermian页面
						mv.setViewName("redirect:/usermain");
					}
					else
					{
						//普通未审核用户跳转到LoginForm
						mv.addObject("message","用户信息未审核,请等待审核通过再登陆");
						mv.setViewName("forward:/LoginForm");
					}
					
				}
			}else {
				//设置登陆失败提示信息
				mv.addObject("message","用户未注册或者登录名、密码错误,请重新输入");
				//服务器内部跳转到登陆页面
				mv.setViewName("forward:/LoginForm");
			}
		}else {
			mv.addObject("message","验证码错误!");
			mv.setViewName("forward:/LoginForm");
		}
		
		return mv;
	}
	/**
	 * 处理用户注册信息
	 * @param loginname
	 * @param password
	 * @param realname
	 * @param realclass
	 * @param phonenum
	 * @param mv
	 * @return
	 */
	  @RequestMapping(value="/register") 
	  public ModelAndView register(
			  @RequestParam("loginname") String loginname,
			  @RequestParam("password") String password,
			  @RequestParam("realname") String realname,
			  @RequestParam("realclass") String realclass,
			  @RequestParam("phonenum") String phonenum,
			  ModelAndView mv) { 
		  dymService.register(loginname,password,realname,realclass,phonenum);
			 mv.setViewName("redirect:/LoginForm");
		  return mv;
	}
	  
}

(3)UserDao.java

package org.fkit.dym.dao;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import org.fkit.dym.domain.User;
import static org.fkit.dym.util.common.DymConstants.USERTABLE;



/**
 * UserMapper接口
 * @author 
 *
 */
public interface UserDao {
	//根据登录名和密码查询用户是否注册
	@Select("select * from "+USERTABLE+" where loginname=#{loginname} and password = #{password}")
	User selectByLoginnameAndPassword(
			@Param("loginname") String loginname,
			@Param("password") String password);
	
	//根据员工注册的信息将员工信息插入到数据库表user_inf中
	@Insert("insert into "+USERTABLE+"(loginname,password,realname,realclass,phonenum) values(#{loginname},#{password},#{realname},#{realclass},#{phonenum})")
	void insertByall(@Param("loginname") String loginname, 
			@Param("password") String password, 
			@Param("realname") String realname, 
			@Param("realclass") String realclass, 
			@Param("phonenum") String phonenum);
	
	//根据用户名查询已注册用户是否审核通过
	@Select("select userstatus from "+USERTABLE+" where loginname=#{loginname}")
	Integer selectByLoginnametostatus(@Param("loginname") String loginname);
}
	

(4)User.java

package org.fkit.dym.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
	private static final long serialVersionUID=1L;
	
	private Integer id;
	private String loginname;
	private String password;
	private Date createdate;
	private String realname;
	private String realclass;
	private String phonenum;
	private Integer userstatus;
	
	//无参数构造器
	public User() {
		super();
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getLoginname() {
		return loginname;
	}

	public void setLoginname(String loginname) {
		this.loginname = loginname;
	}

	public Date getCreatedate() {
		return createdate;
	}

	public void setCreatedate(Date createdate) {
		this.createdate = createdate;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getRealname() {
		return realname;
	}

	public void setRealname(String realname) {
		this.realname = realname;
	}

	public String getRealclass() {
		return realclass;
	}

	public void setRealclass(String realclass) {
		this.realclass = realclass;
	}

	public String getPhonenum() {
		return phonenum;
	}

	public void setPhonenum(String phonenum) {
		this.phonenum = phonenum;
	}

	public Integer getUserstatus() {
		return userstatus;
	}

	public void setUserstatus(Integer userstatus) {
		this.userstatus = userstatus;
	}
	
	
}

(5)AuthorizedInterceptor.java

package org.fkit.dym.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.fkit.dym.domain.User;
import org.fkit.dym.util.common.DymConstants;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/** 
 * 判断用户权限的Spring MVC的拦截器
 */
public class AuthorizedInterceptor  implements HandlerInterceptor {

    /** 定义不需要拦截的请求 */
    private static final String[] IGNORE_URI = {"/LoginForm", "/login","/404.html","registeForm"};
    
     /** 
     * 该方法需要preHandle方法的返回值为true时才会执行。
     * 该方法将在整个请求完成之后执行,主要作用是用于清理资源。
     */  
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception exception)
            throws Exception {
        
    }

     /** 
     * 这个方法在preHandle方法返回值为true的时候才会执行。
     * 执行时间是在处理器进行处理之 后,也就是在Controller的方法调用之后执行。
     */  
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler, ModelAndView mv) throws Exception {
        
    }

     /** 
     * preHandle方法是进行处理器拦截用的,该方法将在Controller处理之前进行调用,
     * 当preHandle的返回值为false的时候整个请求就结束了。 
     * 如果preHandle的返回值为true,则会继续执行postHandle和afterCompletion。
     */  
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler) throws Exception {
        /** 默认用户没有登录 */
        boolean flag = false; 
        /** 获得请求的ServletPath */
        String servletPath = request.getServletPath();
        /**  判断请求是否需要拦截 */
        for (String s : IGNORE_URI) {
            if (servletPath.contains(s)) {
                flag = true;
                break;
            }
        }
        /** 拦截请求 */
        if (!flag){
            /** 1.获取session中的用户  */
            User user = (User) request.getSession().getAttribute(DymConstants.USER_SESSION);
            /** 2.判断用户是否已经登录 */
            if(user == null){
                 /** 如果用户没有登录,跳转到登录页面 */
                request.setAttribute("message", "请先登录再访问网站!");
                request.getRequestDispatcher(DymConstants.LOGIN).forward(request, response);
                return flag;
            }else{
                 flag = true;
            }
        }
        return flag;
        
    }

}

(6)DymService.java

package org.fkit.dym.service;

import org.fkit.dym.domain.User;

/**
 * @Description:服务层接口
 * @author 
 *
 */
public interface DymService {
	/**
	 * 用户登陆
	 * @param loginname
	 * @param password
	 * @return User对象
	 */
	User login(String loginname,String password);

	/**
	 * 用户注册
	 * @param loginname
	 * @param password
	 * @param realname
	 * @param realclass
	 * @param phonenum
	 * @return
	 */
	void register(String loginname, String password, String realname, String realclass, String phonenum);

	
	/**
	 * 判断用户是否审核通过
	 * @param loginname
	 * @return
	 */
	Integer testpass(String loginname);
}

(7)DymServiceImpl.java

package org.fkit.dym.service.impl;

import org.fkit.dym.dao.UserDao;

import org.fkit.dym.domain.User;
import org.fkit.dym.service.DymService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Description:服务层接口实现类
 * @author 
 *
 */

@Service("dymService")
public class DymServiceImpl implements DymService {
	//自动注入持久层dao对象
	@Autowired
	private UserDao userDao;

	/**
	 * DymServiceImpl接口login方法实现
	 * 通过登录名和密码来查看用户是否已注册,返回值为user对象
	 */
	@Override
	public User login(String loginname, String password) {
		// TODO Auto-generated method stub
		return userDao.selectByLoginnameAndPassword(loginname, password);
	}
	
	
	/**
	 * DymServiceImpl接口testpass方法实现
	 * 通过登录名查看已注册的用户是否审核通过,范围之为userstatus的值,为1则审核通过,2审核为通过
	 */
	@Override
	public Integer testpass(String loginname) {
		// TODO Auto-generated method stub
		return userDao.selectByLoginnametostatus(loginname);
	}
	
	
	/**
	 * DymServiceImpl接口register方法实现
	 * 通过用户注册的信息将信息插入到数据库中
	 */
	@Override
	public void register(String loginname, String password, String realname, String realclass, String phonenum) {
		// TODO Auto-generated method stub
		userDao.insertByall(loginname,password,realname,realclass,phonenum);
	}

   
}

(8)DymConstants.java

package org.fkit.dym.util.common;

public class DymConstants {
	//数据库表常量
	public static final String USERTABLE="user_inf";
	
	
	//登陆以及用户的session对象
	public static final String LOGIN="LoginForm";
	public static final String USER_SESSION="user_session";
	
}

(9)db.properties

dataSource.driverClass=org.gjt.mm.mysql.Driver
dataSource.jdbcUrl=jdbc:mysql://127.0.0.1:3306/dymapp?useSSL=false
dataSource.user=你的数据库名
dataSource.password=你的数据库密码
dataSource.maxPoolSize=20
dataSource.maxIdleTime = 1000
dataSource.minPoolSize=6
dataSource.initialPoolSize=5

(10)LoginForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="zh">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>电脑医院信息管理与预约系统</title>

<link href="${ctx}/js/metronic/plugins/bootstrap/css/bootstrap.min.css"
    rel="stylesheet" type="text/css" />
<link
    href="${ctx}/js/metronic/plugins/bootstrap/css/bootstrap-responsive.min.css"
    rel="stylesheet" type="text/css" />
<link
    href="${ctx}/js/metronic/plugins/font-awesome/css/font-awesome.min.css"
    rel="stylesheet" type="text/css" />
<link href="${ctx}/js/metronic/css/style-metro.css" rel="stylesheet"
    type="text/css" />
<link href="${ctx}/js/metronic/css/style.css" rel="stylesheet"
    type="text/css" />
<link href="${ctx}/js/metronic/css/style-responsive.css" rel="stylesheet"
    type="text/css" />
<link href="${ctx}/js/metronic/css/themes/default.css" rel="stylesheet"
    type="text/css" id="style_color" />
<link href="${ctx}/js/metronic/plugins/uniform/css/uniform.default.css"
    rel="stylesheet" type="text/css" />

<link href="${ctx}/js/metronic/css/pages/lock.css" rel="stylesheet"
    type="text/css" />

<link rel="shortcut icon" href="favicon.ico" />

<script type="text/javascript" src="${ctx }/js/jquery-1.11.0.js"></script>
<script type="text/javascript" src="${ctx }/js/jquery-migrate-1.2.1.js"></script>

<link href="${ctx }/js/ligerUI/skins/Aqua/css/ligerui-all.css" rel="stylesheet" type="text/css" />  
 
<script src="${ctx }/js/ligerUI/js/core/base.js" type="text/javascript"></script>
<script src="${ctx }/js/ligerUI/js/plugins/ligerDialog.js" type="text/javascript"></script>
<script src="${ctx }/js/ligerUI/js/plugins/ligerDrag.js" type="text/javascript"></script>
<script src="${ctx }/js/ligerUI/js/plugins/ligerResizable.js" type="text/javascript"></script>
<script src="js/gVerify.js"></script>
<script type="text/javascript">

!(function(window, document) {
    var size = 5;//设置验证码长度
    function GVerify(options) { //创建一个图形验证码对象,接收options对象为参数
        this.options = { //默认options参数值
            id: "", //容器Id
            canvasId: "verifyCanvas", //canvas的ID
            width: "100", //默认canvas宽度
            height: "30", //默认canvas高度
            type: "blend", //图形验证码默认类型blend:数字字母混合类型、number:纯数字、letter:纯字母
            code: "",
        }
        if(Object.prototype.toString.call(options) == "[object Object]"){//判断传入参数类型
            for(var i in options) { //根据传入的参数,修改默认参数值
                this.options[i] = options[i];
            }
        }else{
            this.options.id = options;
        }
        
        this.options.numArr = "0,1,2,3,4,5,6,7,8,9".split(",");
        this.options.letterArr = getAllLetter();

        this._init();
        this.refresh();
    }

    GVerify.prototype = {
        /**版本号**/
        version: '1.0.0',
        
        /**初始化方法**/
        _init: function() {
            var con = document.getElementById(this.options.id);
            var canvas = document.createElement("canvas");
            this.options.width = con.offsetWidth > 0 ? con.offsetWidth : "100";
            this.options.height = con.offsetHeight > 0 ? con.offsetHeight : "30";
            canvas.id = this.options.canvasId;
            canvas.width = this.options.width;
            canvas.height = this.options.height;
            canvas.style.cursor = "pointer";
            canvas.innerHTML = "您的浏览器版本不支持canvas";
            con.appendChild(canvas);
            var parent = this;
            canvas.onclick = function(){
                parent.refresh();
            }
        },
        
        /**生成验证码**/
        refresh: function() {
            this.options.code = "";
            var canvas = document.getElementById(this.options.canvasId);
            if(canvas.getContext) {
                var ctx = canvas.getContext('2d');
            }else{
                return;
            }
            
            ctx.textBaseline = "middle";

            ctx.fillStyle = randomColor(180, 240);
            ctx.fillRect(0, 0, this.options.width, this.options.height);

            if(this.options.type == "blend") { //判断验证码类型
                var txtArr = this.options.numArr.concat(this.options.letterArr);
            } else if(this.options.type == "number") {
                var txtArr = this.options.numArr;
            } else {
                var txtArr = this.options.letterArr;
            }

            for(var i = 1; i <=size; i++) {
                var txt = txtArr[randomNum(0, txtArr.length)];
                this.options.code += txt;
                ctx.font = randomNum(this.options.height/2, this.options.height) + 'px SimHei'; //随机生成字体大小
                ctx.fillStyle = randomColor(50, 160); //随机生成字体颜色        
                ctx.shadowOffsetX = randomNum(-3, 3);
                ctx.shadowOffsetY = randomNum(-3, 3);
                ctx.shadowBlur = randomNum(-3, 3);
                ctx.shadowColor = "rgba(0, 0, 0, 0.3)";
                var x = this.options.width / (size+1) * i;
                var y = this.options.height / 2;
                var deg = randomNum(-30, 30);
                /**设置旋转角度和坐标原点**/
                ctx.translate(x, y);
                ctx.rotate(deg * Math.PI / 180);
                ctx.fillText(txt, 0, 0);
                /**恢复旋转角度和坐标原点**/
                ctx.rotate(-deg * Math.PI / 180);
                ctx.translate(-x, -y);
            }
            /**绘制干扰线**/
            for(var i = 0; i < 4; i++) {
                ctx.strokeStyle = randomColor(40, 180);
                ctx.beginPath();
                ctx.moveTo(randomNum(0, this.options.width), randomNum(0, this.options.height));
                ctx.lineTo(randomNum(0, this.options.width), randomNum(0, this.options.height));
                ctx.stroke();
            }
            /**绘制干扰点**/
            for(var i = 0; i < this.options.width/4; i++) {
                ctx.fillStyle = randomColor(0, 255);
                ctx.beginPath();
                ctx.arc(randomNum(0, this.options.width), randomNum(0, this.options.height), 1, 0, 2 * Math.PI);
                ctx.fill();
            }
        },
        
        /**验证验证码**/
        validate: function(code){
            var code = code.toLowerCase();
            var v_code = this.options.code.toLowerCase();
            if(code == v_code){
                return true;
            }else{
                this.refresh();
                return false;
            }
        }
    }
    /**生成字母数组**/
    function getAllLetter() {
        var letterStr = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
        return letterStr.split(",");
    }
    /**生成一个随机数**/
    function randomNum(min, max) {
        return Math.floor(Math.random() * (max - min) + min);
    }
    /**生成一个随机色**/
    function randomColor(min, max) {
        var r = randomNum(min, max);
        var g = randomNum(min, max);
        var b = randomNum(min, max);
        return "rgb(" + r + "," + g + "," + b + ")";
    }
    window.GVerify = GVerify;
})(window, document);
  

</script>
</head>

<body style="font-family: 微软雅黑">
    <div class="page-lock">
    
        <div class="page-logo" style="margin-bottom: 2px">
            <a class="brand" style="font-size: 22px; color: #FFF;"> 电脑医院信息管理与预约系统</a>
        </div>
        <span style="padding-top: 5px;margin-left:50px;font-size:20px"><font color="red">${requestScope.message}</font></span>
        <form action="login" method="post" id="LoginForm">
            <div class="page-body">
            	<div>
            		<img class="page-lock-img" src="${ctx}/js/metronic/img/profile/logo2.jpg" alt="">
            	</div> 

                <div style="margin-left:250px;margin-top:20px">
                	<input type="text" placeholder="账号" id="loginname" name="loginname" value="${loginname}"><br>
                	<input type="password" placeholder="密码" id="password" name="password" value="${password}"><br>
                	
                	<input type="text" id="code_input" value="" placeholder="请输入验证码"/><br><input type="hidden" name="flag" id="flag" value="0">
                	<div id="v_container" style="margin-left:15px; margin-top:0px; width:100px; height:40px"></div><br>
                	
            	    <button type="submit" style="margin-left:0px" id="login-submit-btn" class="btn green" >登录 </button>	
                </div>
            </div>
        </form>
        
        <form action="registeForm" method="post" id="registeForm">
        	<button type="submit" style="margin-left:350px;margin-top:-140px" id="registe" class="btn green">注册</button>
        </form>
        
        
    </div>

   <script src="js/gVerify.js"></script>
    <script type="text/javascript">
    
    var verifyCode = new GVerify("v_container");
   // var flag=0;
    document.getElementById("login-submit-btn").onclick = function(){
        var res = verifyCode.validate(document.getElementById("code_input").value);
        if(res){
            document.getElementById("flag").value=1;
          //  $("#LoginForm").submit();
        }
        
    }
    
    
    $(function(){
        /** 按了回车键 */
       $(document).keydown(function(event){
           if(event.keyCode == 13){
               $("#login-submit-btn").trigger("click");
           }
       })

       /** 给登录按钮绑定点击事件  */
       $("#login-submit-btn").on("click",function(){
           /** 校验登录参数 ctrl+K */
           var loginname = $("#loginname").val();
           var password = $("#password").val();
           
          
           var msg = "";
           
           if(!/^\w{4,20}$/.test(loginname)){
                 msg = "登录名长度必须是6~20之间";
           }else if(!/^\w{4,20}$/.test(password)){
                 msg = "密码长度必须是6~20之间";
           }
           if(msg !=""||flag==0){
               $.ligerDialog.error(msg);
               return;
           }
           if(flag==1&&msg!=""){
        	   $("#LoginForm").submit();
           }
           
       })
       
   })
   
   
       
    </script>
    
    <script
        src="${ctx}/js/metronic/plugins/jquery-ui/jquery-ui-1.10.1.custom.min.js"
        type="text/javascript">
    </script>
    
    <script src="${ctx}/js/metronic/plugins/bootstrap/js/bootstrap.min.js"
        type="text/javascript">
    </script>
    
    <script src="${ctx}/js/metronic/plugins/breakpoints/breakpoints.js"
        type="text/javascript">
    </script>
    
    <script src="${ctx}/js/metronic/plugins/uniform/jquery.uniform.min.js"
        type="text/javascript">
    </script>
   
    <script
        src="${ctx}/js/metronic/plugins/backstretch/jquery.backstretch.min.js"
        type="text/javascript">
    </script>
   
    <script src="${ctx}/js/metronic/scripts/app.js"></script>
    <script src="${ctx}/js/metronic/scripts/lock.js"></script>
   <script>
        $(function() {
            App.init();
            Lock.init();
        });
   </script> 

	
</body>
</html>

(11)registerForm.jsp(我自己写了个register.js保存在js包中,上面有js包的下载地址)

<%@ 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, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>User Register</title>
    <script src="${ctx}/js/metronic/scripts/register.js"></script>
    <link href="${ctx}/js/metronic/plugins/bootstrap/css/bootstrap.min.css"
    rel="stylesheet" type="text/css" />
<link
    href="${ctx}/js/metronic/plugins/bootstrap/css/bootstrap-responsive.min.css"
    rel="stylesheet" type="text/css" />
<link
    href="${ctx}/js/metronic/plugins/font-awesome/css/font-awesome.min.css"
    rel="stylesheet" type="text/css" />
<link href="${ctx}/js/metronic/css/style-metro.css" rel="stylesheet"
    type="text/css" />
<link href="${ctx}/js/metronic/css/style.css" rel="stylesheet"
    type="text/css" />
<link href="${ctx}/js/metronic/css/style-responsive.css" rel="stylesheet"
    type="text/css" />
<link href="${ctx}/js/metronic/css/themes/default.css" rel="stylesheet"
    type="text/css" id="style_color" />
<link href="${ctx}/js/metronic/plugins/uniform/css/uniform.default.css"
    rel="stylesheet" type="text/css" />

<link href="${ctx}/js/metronic/css/pages/lock.css" rel="stylesheet"
    type="text/css" />

<link rel="shortcut icon" href="favicon.ico" />

<script type="text/javascript" src="${ctx }/js/jquery-1.11.0.js"></script>
<script type="text/javascript" src="${ctx }/js/jquery-migrate-1.2.1.js"></script>

<link href="${ctx }/js/ligerUI/skins/Aqua/css/ligerui-all.css" rel="stylesheet" type="text/css" />  
 
<script src="${ctx }/js/ligerUI/js/core/base.js" type="text/javascript"></script>
<script src="${ctx }/js/ligerUI/js/plugins/ligerDialog.js" type="text/javascript"></script>
<script src="${ctx }/js/ligerUI/js/plugins/ligerDrag.js" type="text/javascript"></script>
<script src="${ctx }/js/ligerUI/js/plugins/ligerResizable.js" type="text/javascript"></script>
</head>
<body οnlοad="SubmitCheck()">
<!-- 从页面加载开始就检测是否可以提交 -->
    <div class="page-lock">
        <br/>
        <br/>
        <div class="page-logo" style="margin-bottom: 2px">
            <a class="brand" style="font-size: 22px; color: #FFF;"> 电脑医院信息管理与预约系统--用户注册</a>
        </div>
        
    <br/><br/>
    <form action="register" method="POST">
    	<div class="page-body">
    		<div>
    			<span></span>登录名称: <input onmouseout = "loginnameCheck()"  id="loginname"  type="text" name="loginname" /><span id="1"></span><br>
		  	  	<span></span>登陆密码: <input onmouseout = "passCheck()" id="password" type="password" name="password" ></input><span id="2"></span><br>
		  	  	<span></span>重复密码: <input onmouseout = "passTwoCheck()" id = "passtwo" type="password" name="passTwo" ></input><span id="3"></span><br>
		  	    <span></span>真实姓名: <input id="realname" type="text" name="realname" ></input><span id="4"></span><br>
		        <span></span>所在班级: <input id = "realclass" type="text" name="realclass" ></input><span id="5"></span><br>
		        <span></span>手机号码: <input onmouseout = "phonenumCheck()" id = "phonenum" type="text" name="phonenum" ></input><span id="6"></span><br>
    		</div>
    		<br><br>
    		<div>
    			<input id = "submit" class="btn green" disabled style="margin-left:150px" type="submit" value="立即注册"/><br>
    			
    		</div>
    	</div>
    	
   		
    </form>
    </div>
    <script
        src="${ctx}/js/metronic/plugins/jquery-ui/jquery-ui-1.10.1.custom.min.js"
        type="text/javascript">
    </script>
    
    <script src="${ctx}/js/metronic/plugins/bootstrap/js/bootstrap.min.js"
        type="text/javascript">
    </script>
    
    <script src="${ctx}/js/metronic/plugins/breakpoints/breakpoints.js"
        type="text/javascript">
    </script>
    
    <script src="${ctx}/js/metronic/plugins/uniform/jquery.uniform.min.js"
        type="text/javascript">
    </script>
   
    <script
        src="${ctx}/js/metronic/plugins/backstretch/jquery.backstretch.min.js"
        type="text/javascript">
    </script>
   
    <script src="${ctx}/js/metronic/scripts/app.js"></script>
    <script src="${ctx}/js/metronic/scripts/lock.js"></script>
   <script>
        $(function() {
            App.init();
            Lock.init();
        });
   </script> 
    
</body>
</html>

(12)taglib.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!-- 设置一个项目路径的变量  -->
<c:set var="ctx" value="${pageContext.request.contextPath}"></c:set>

(13)main.jsp和usermain.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="GBK">
<title>Insert title here</title>
</head>
<body>
管理员登录成功!!!
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="GBK">
<title>Insert title here</title>
</head>
<body>
普通用户登录成功!!
</body>
</html>

(14)applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context.xsd
                        http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx.xsd
                        http://mybatis.org/schema/mybatis-spring 
                        http://mybatis.org/schema/mybatis-spring.xsd ">
     <!-- 扫描org.fkit.dym.dao包里的所有接口当作spring的bean配置,之后可以进行依赖注入 -->
    <mybatis:scan base-package="org.fkit.dym.dao"/>
    
    <!-- 扫描org.fkit包下的所有Java文件,有spring的相关注解的类,则把这些类注册为spring的bean  -->
    <context:component-scan base-package="org.fkit.dym"/>
    
    <!-- 使用PropertyOverrideConfigurer后处理器加载数据源参数 -->
    <context:property-override location="classpath:db.properties"/>
    
    <!-- 配置c3p0数据源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"/>
    
    <!-- 配置SqlSessionFactory,org.mybaties.spring.SqlSessionFactoryBean是mybaties社区开发用于整合spring的bean-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
        p:dataSource-ref="dataSource"/>
    
    <!-- JDBC事务管理器 -->
    <bean id="transactionManager" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
         p:dataSource-ref="dataSource"/>
    
    <!-- 启用支持annotation注解方式事务管理 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    
</beans>

(15)springmvc-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd     
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd ">
        
    <!-- 自动扫描该包,SpringMVC会将包下用了@controller注解的类注册为Spring的controller -->
    <context:component-scan base-package="org.fkit.dym.controller"/>
    <!-- 设置默认配置方案 -->
    <mvc:annotation-driven/>
    <!-- 使用默认的Servlet来响应静态文件 -->
    <mvc:default-servlet-handler/>
    
    <!-- 定义Spring MVC的拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 拦截所有请求 -->
            <mvc:mapping path="/*"/>
            <!-- 自定义判断用户权限的拦截类   -->
             <bean class="org.fkit.dym.interceptor.AuthorizedInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

    <!-- 视图解析器   -->
     <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/> 
    
    <!-- 文件上传下载   -->
     <bean id="multipartResolver"  
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
        <!-- 上传文件大小上限,单位为字节(10MB) -->
        <property name="maxUploadSize">  
            <value>10485760</value>  
        </property>  
        <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
        <property name="defaultEncoding">
            <value>UTF-8</value>
        </property>
    </bean>
</beans>

(16)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
 <!-- 配置spring核心监听器,默认会以 /WEB-INF/applicationContext.xml作为配置文件 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- contextConfigLocation参数用来指定Spring的配置文件 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext*.xml</param-value>
    </context-param>
    
    <!-- 定义Spring MVC的前端控制器 -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/springmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  
  <!-- 让Spring MVC的前端控制器拦截所有请求 -->
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  
  <!-- 编码过滤器 -->
  <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>
    
    <!-- jsp的配置 -->
  <jsp-config>
    <jsp-property-group>
         <!-- 配置拦截所有的jsp页面  -->
      <url-pattern>*.jsp</url-pattern>
       <!-- 可以使用el表达式  -->
      <el-ignored>false</el-ignored>
      <!-- 不能在页面使用java脚本 -->
      <scripting-invalid>true</scripting-invalid>
      <!-- 给所有的jsp页面导入要依赖的库,tablib.jsp就是一个全局的标签库文件  -->
      <include-prelude>/WEB-INF/jsp/taglib.jsp</include-prelude>
    </jsp-property-group>
  </jsp-config>
  
  <error-page>
    <error-code>404</error-code>
    <location>/404.html</location>
  </error-page>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

(17)404.html和index.jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>电脑医院信息管理与预约系统-资源不存在!</title>
<base href="${basePath}">
</head>
<body style="background-color:#fff; ">
    <div style="margin:0 auto; width:500px; height:306px;">
         <input type="image" src="images/404.jpg" style="padding-top: 150px;"/>
    </div>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 立即请求/main -->
<jsp:forward page="main"/>

(18)数据库(直接从数据库导出的,应该没有错)

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `user_inf`
-- ----------------------------
DROP TABLE IF EXISTS `user_inf`;
CREATE TABLE `user_inf` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `loginname` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `password` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `createdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `realname` varchar(20) NOT NULL,
  `realclass` varchar(20) NOT NULL,
  `phonenum` varchar(20) NOT NULL,
  `userstatus` int(10) NOT NULL DEFAULT '2',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user_inf
-- ----------------------------
INSERT INTO `user_inf` VALUES ('1', 'admin', '123456', '2020-02-09 19:16:27', '范', '计科', '18838256188', '1');
INSERT INTO `user_inf` VALUES ('2', 'test', '123456', '2020-02-11 19:17:11', '范范', '软工', '15936948976', '1');
INSERT INTO `user_inf` VALUES ('3', 'test1', '123456', '2020-02-11 19:17:44', 'fanjunjjie', '信管', '15939845881', '2');
INSERT INTO `user_inf` VALUES ('4', 'test2', '123456', '2020-02-20 11:16:24', '小范', '计科', '18823456789', '2');
INSERT INTO `user_inf` VALUES ('5', 'test3', '123456', '2020-02-28 11:18:23', '公孙砾', '16制药工程', '15933457862', '2');
INSERT INTO `user_inf` VALUES ('6', 'test4', '123456', '2020-03-10 11:19:18', '松江', '17第一临床', '15858952881', '2');
原创文章 54 获赞 99 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_38938670/article/details/105635955
今日推荐