any question or wanna codes, just contact with me by loooln@126.com
If u're walking down 2 the right path and u're willing 2 keep walking, eventually u'll make progress! 与君共勉
项目利用Struts2框架实现了用户的登录注册以及注销功能。注册过程中服务端会对数据表进行校验并对密码进行加密,最后用户经过注册将数据表提交到数据库。登录过程中用Struts2的另一种校验方式对账号密码进行服务端校验。(也可以通过js在前台进行校验,不作赘述)
Eclipse(maven project)
mysql
tomcat v9.0
后台代码实现
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(25) NOT NULL, `password` blob NOT NULL, `trueName` varchar(32) DEFAULT NULL, `sex` int(11) DEFAULT NULL, `email` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>UseStrutsgroupId> <artifactId>UseStrutsartifactId> <version>1.0.0version> <packaging>warpackaging> <dependencies> <dependency> <groupId>org.apache.strutsgroupId> <artifactId>struts2-coreartifactId> <version>${struts2Ver}version> <exclusions> <exclusion> <artifactId>javassistartifactId> <groupId>javassistgroupId> exclusion> <exclusion> <artifactId>commons-ioartifactId> <groupId>commons-iogroupId> exclusion> exclusions> dependency> <dependency> <groupId>org.apache.strutsgroupId> <artifactId>struts2-json-pluginartifactId> <version>${struts2Ver}version> dependency> <dependency> <groupId>org.apache.strutsgroupId> <artifactId>struts2-convention-pluginartifactId> <version>${struts2Ver}version> dependency> <dependency> <groupId>log4jgroupId> <artifactId>log4jartifactId> <version>1.2.17version> dependency> <dependency> <groupId>org.apache.logging.log4jgroupId> <artifactId>log4j-apiartifactId> <version>${log4jVer}version> dependency> <dependency> <groupId>org.apache.logging.log4jgroupId> <artifactId>log4j-coreartifactId> <version>${log4jVer}version> dependency> <dependency> <groupId>org.apache.logging.log4jgroupId> <artifactId>log4j-1.2-apiartifactId> <version>${log4jVer}version> dependency> <dependency> <groupId>commons-logginggroupId> <artifactId>commons-logging-apiartifactId> <version>1.1version> dependency> <dependency> <groupId>javaxgroupId> <artifactId>javaee-apiartifactId> <version>8.0version> dependency> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <version>5.1.46version> dependency> <dependency> <groupId>commons-iogroupId> <artifactId>commons-ioartifactId> <version>2.4version> dependency> dependencies> <build> <sourceDirectory>src/mainsourceDirectory> <finalName>UseStrutsfinalName> <resources> <resource> <directory>src/main/javadirectory> <excludes> <exclude>**/*.javaexclude> excludes> resource> <resource> <directory>src/main/resourcesdirectory> resource> resources> <plugins> <plugin> <groupId>org.apache.maven.pluginsgroupId> <artifactId>maven-compiler-pluginartifactId> <version>3.7.0version> <configuration> <source>1.8source> <target>1.8target> <encoding>utf-8encoding> configuration> plugin> <plugin> <groupId>org.apache.maven.pluginsgroupId> <artifactId>maven-war-pluginartifactId> <version>3.0.0version> <configuration> <warSourceDirectory>WebContentwarSourceDirectory> <failOnMissingWebXml>falsefailOnMissingWebXml> configuration> plugin> plugins> build> <properties> <log4jVer>2.9.1log4jVer> <struts2Ver>2.5.16struts2Ver> properties> project>
package com.ruc.bean; public class User { private String userName; private String password; private String name; private String email; /** * @return the userName */ public String getUserName() { return userName; } /** * @param userName the userName to set */ public void setUserName(String userName) { this.userName = userName; } /** * @return the password */ public String getPassword() { return password; } /** * @param password the password to set */ public void setPassword(String password) { this.password = password; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the email */ public String getEmail() { return email; } /** * @param email the email to set */ public void setEmail(String email) { this.email = email; } }
<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">
<display-name>UseStrutsdisplay-name>
<welcome-file-list>
<welcome-file>Login.jspwelcome-file>
welcome-file-list>
<filter>
<filter-name>struts2filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilterfilter-class>
filter>
<filter-mapping>
<filter-name>struts2filter-name>
<url-pattern>/*url-pattern>
filter-mapping>
web-app>
package com.ruc.tools; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBConn { private static String dbDriver ="com.mysql.jdbc.Driver"; public static Connection getConnection() { //加载连接数据库到虚拟机 try { Class.forName(dbDriver); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } //取得数据库连接 String url = "jdbc:mysql://localhost:3306/userManager?useUnicode&characterEncoding=UTF-8&useSSL=false"; try { Connection conn = DriverManager.getConnection(url,"root",""); conn.setAutoCommit(false); return conn; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
package com.ruc.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.ruc.bean.User; import com.ruc.tools.DBConn; public class UserDao { public User userLogin(String userName,String password) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; User user = null; //connect the mysql conn = DBConn.getConnection(); //通过mysql的encode函数对密码字段进行加密。 String sqlCheck = "select * from user where userName=? and password = encode(?,\"web18\")"; try { ps = conn.prepareStatement(sqlCheck); ps.setString(1, userName); ps.setString(2, password); rs = ps.executeQuery(); if(rs.next()) { user = new User(); user.setUserName(rs.getString("userName")); user.setPassword(rs.getString("password")); } }catch(SQLException e) { e.printStackTrace(); System.out.println("登录异常!!!"); }finally { try { //此处应该封装 conn.close(); ps.close(); rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("关闭异常"); } } return user; } public int register(User user) { int i = 0; Connection conn = null; PreparedStatement ps = null; conn = DBConn.getConnection(); // "前加一个/是将"进行转义,用单引号也可以 String sql_insert = "insert into user(userName,password,trueName,email) values (?,encode(?,\"web18\"),?,?);"; try { ps = conn.prepareStatement(sql_insert); ps.setString(1, user.getUserName()); System.out.println(user.getUserName()); ps.setString(2, user.getPassword()); ps.setString(3, user.getName()); ps.setString(4, user.getEmail()); i = ps.executeUpdate(); conn.commit(); } catch (SQLException e) { // TODO Auto-generated catch block System.out.println("注册失败!"); e.printStackTrace(); }finally { try { conn.close(); ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return i; } }
package com.ruc.actions; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.ruc.bean.User; import com.ruc.dao.UserDao; public class LoginAction extends ActionSupport implements ModelDriven<User> { private static final long serialVersionUID = 1L; private User user = new User(); private UserDao userDao = new UserDao(); //getModel():Gets the model to be pushed onto the ValueStack instead of the Action itself. public User getModel() { // TODO Auto-generated method stub return user; } public String execute() { return ""; } public String login() { User usr = userDao.userLogin(user.getUserName(), user.getPassword()); if (null == usr) return "error"; else { ActionContext.getContext().getSession().put("user", usr); return "success"; } } }
package com.ruc.actions; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class LoginOut extends ActionSupport { //注销 public String execute() { Object obj = ActionContext.getContext().getSession().get("user"); if(obj != null) { ActionContext.getContext().getSession().clear(); } return "out"; } }
package com.ruc.actions; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.ruc.bean.User; import com.ruc.dao.UserDao; public class RegisterMDAction extends ActionSupport implements ModelDriven { private User user = new User(); private UserDao userDao= null; public Object getModel() { // TODO Auto-generated method stub return user; } public String execute() { return ""; } public String register() { userDao = new UserDao(); int i = userDao.register(user); System.out.println(i); if(i!=0) { return SUCCESS; }else { return ERROR; } } //第一种校验,方法名格式:validate+Action方法名 public void validateRegister() { if(user.getUserName().equals("") || user.getUserName() == null) { System.out.println("validate running"); addFieldError("userName","UserName cannot be null"); } if(user.getUserName().length()<6 || user.getUserName().length() >18) { addFieldError("userName","UserName limit the length of 6 to 18"); } if(user.getPassword().equals("") || user.getPassword() == null) { System.out.println("validate running"); addFieldError("password","password cannot be null"); } if(user.getPassword().length()<6 || user.getPassword().length() >18) { addFieldError("password","password limit the length of 6 to 18"); } //通过正则表达式来验证邮箱格式 boolean flag = false; String check = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; Pattern regex = Pattern.compile(check); Matcher matcher = regex.matcher(user.getEmail()); flag = matcher.matches(); if(!flag) addFieldError("email","pattern of email wrong!"); } }
xml version="1.0" encoding="UTF-8"?>
DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="userName">
<field-validator type="requiredstring">
<message>the name should not nullmessage>
field-validator>
<field-validator type="stringlength">
<param name="minLength">6param>
<param name="maxLength">18param>
<message>用户名长度要在6--18位之间message>
field-validator>
field>
validators>
<struts>
<package name="struts2" namespace="/" extends = "struts-default">
<action name="userlogin" class = "com.ruc.actions.LoginAction" method="login">
<result name="input">Login.jspresult>
<result name="error" type="redirect">Error.jspresult>
<result name="success">Welcome.jspresult>
action>
<action name="loginout" class="com.ruc.actions.LoginOut">
<result name="out" type="redirect">Login.jspresult>
action>
<action name="register" class="com.ruc.actions.RegisterMDAction" method="register" >
<result name="input">Register.jspresult>
<result name="success">Login.jspresult>
<result name="error">RegisterError.jspresult>
action>
package>
struts>
<%page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%taglib prefix="s" uri="/struts-tags"%> <html lang="en" class="no-js"> <head> <meta charset="UTF-8" /> <title>logintitle> <s:head /> head> <body> <div> <div> <div> <div class="logo_box"> <h3>欢迎你h3> <s:fielderror /> <form action="userlogin" method="post"> <div class="input_outer"> <span class="u_user">span> <input name="userName" class="text" style="color: #FFFFFF !important" type="text" placeholder="请输入账户"> div> <div class="input_outer"> <span class="us_uer">span> <input name="password" class="text" style="color: #FFFFFF !important; position: absolute; z-index: 100;" value="" type="password" placeholder="请输入密码"> div> <div class="mb2"> <input class="act-but submit" type="submit" value="登录" style="color: #FFFFFF; width: 210px; position: relative; left: 20%" /> <span><input class="act-but submit" type="button" value="注册" onclick='window.location.href="Register.jsp"' style="color: #FFFFFF; width: 210px; position: relative; left: 20%" />span> div> form> div> div> div> div> body> html>
<%page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%taglib prefix="s" uri="/struts-tags"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> head> <body> <div class="container demo-1"> <div class="content"> <div id="large-header" class="large-header"> <canvas id="demo-canvas">canvas> <div class="logo_box" style="top:35%"> <h3>注册页面h3> <form action="register" method="post"> <s:fielderror><s:param>userNames:param>s:fielderror> <div class="input_outer"> <span class="u_user">span> <input name="userName" class="text" style="color: #FFFFFF !important" type="text" placeholder="请输入登录用户名"> div> <s:fielderror><s:param>passwords:param>s:fielderror> <div class="input_outer"> <span class="us_uer">span> <input name="password" class="text" style="color: #FFFFFF !important; position: absolute; z-index: 100;" value="" type="password" placeholder="请输入密码"> div> <div class="input_outer"> <span class="u_user">span> <input name="trueName" class="text" style="color: #FFFFFF !important" type="text" placeholder="请输入姓名"> div> <s:fielderror><s:param>emails:param>s:fielderror> <div class="input_outer"> <span class="u_email">span> <input name="email" class="text" style="color: #FFFFFF !important" type="text" placeholder="请输入电子邮箱"> div> <div class="mb2"> <input class="act-but submit" type="submit" value="注册" style="color: #FFFFFF; width: 210px; position: relative; left: 20%" /> <input class="act-but submit" type="reset" value="重置" style="color: #FFFFFF; width: 210px; position: relative; left: 20%" /> div> form> div> div> div> div> body> html>
<%page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%prefix="S" uri="/struts-tags" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>登录失败title> head> <body> <h1> <S:text name="用户名或密码错误!">S:text> h1> body> html>
<%page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注册失败title> head> <body> <h3>注册失败h3> <hr/> <a href="Login.jsp">重新登录a><br/> <a href="Register.jsp">重新注册a> body> html>
<%page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%prefix="S" uri="/struts-tags"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>登录成功title> head> <body> <h2> <%-- <%= session.getAttribute("user") %> --%> <S:property value="#session.user.userName" /> ,欢迎登录! <S:form action="loginout"> <S:submit value="zhuxiao">S:submit> S:form> h2> body> html>