@Jayfeather
2018-12-23T15:08:03.000000Z
字数 12426
阅读 745
Spring
| 更新时间 | 更新内容 |
|---|---|
| 20181223 | 创建该笔记,实现简单的登录模块 |
-
项目未结
使用了Spring MVC + Spring Boot + RESTful实现了一个简单的登录模块
依赖管理使用了maven
总体来说是前后端分离的思想,后端仅仅提供静态HTML文件和动态json内容,路由和页面渲染在前段完成
仅仅是完成了简单的登录+注册功能,还没有添加权限验证
<?xml version="1.0" encoding="UTF-8"?><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.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.1.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.heiyu</groupId><artifactId>blog</artifactId><version>0.0.1-SNAPSHOT</version><name>blog</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-rest</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId></dependency><!--<dependency>--><!--<groupId>org.springframework.boot</groupId>--><!--<artifactId>spring-boot-starter-security</artifactId>--><!--</dependency>--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.7</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.7</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.7</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.hsqldb</groupId><artifactId>hsqldb</artifactId><scope>runtime</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.11</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

包解释:
--Controller
|—MainController
package com.heiyu.blog.controller;import com.heiyu.blog.domain.User;import com.heiyu.blog.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.web.bind.annotation.*;import org.springframework.web.servlet.ModelAndView;import com.heiyu.blog.domain.LoginUser;import javax.servlet.http.HttpServletRequest;import static org.springframework.web.bind.annotation.RequestMethod.*;@EnableAutoConfiguration@RestController@RequestMappingpublic class MainController {@Autowiredprivate UserService userService;@Autowiredprivate HttpServletRequest request;@RequestMapping(value = "/login",method = GET)public ModelAndView login(){return new ModelAndView("login");}@RequestMapping(value = "/login",method = POST)@ResponseBodypublic String loginPost(@RequestBody LoginUser loginUser) {System.out.println(loginUser.toString());if (userService.isLoginMatch(loginUser)) {return "{\"login\":1}";} else {return "{\"login\":0}";}}@RequestMapping(value = "/resign",method = GET)public ModelAndView resign(){ return new ModelAndView("resign");}@RequestMapping(value = "/resign",method = POST)@ResponseBodypublic String resignPost(@RequestBody User user){request.getHeader("x-forwarded-for");System.out.println(user.toString());System.out.println( request.getHeader("x-forwarded-for"));return "{\"login\":1}";}}
--Domain
|--loginUser
package com.heiyu.blog.domain;import java.util.Objects;public class LoginUser {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public LoginUser(){}public LoginUser(String username, String password){this.username=username;this.password=password;}@Overridepublic String toString(){return "{\"username\":\""+username+"\",\"password\":\""+password+"\"}";}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;LoginUser loginUser = (LoginUser) o;return Objects.equals(username, loginUser.username) &&Objects.equals(password, loginUser.password);}@Overridepublic int hashCode() {return Objects.hash(username, password);}/** todo 将loginUser与User合并**/}
--domain
|-User
package com.heiyu.blog.domain;import jdk.nashorn.internal.objects.annotations.Getter;import jdk.nashorn.internal.objects.annotations.Setter;import javax.validation.constraints.Email;import java.util.Date;public class User extends LoginUser {private String email;private String phoneNumber;private String lastIp;private Date lastLoginTime;private Date creatTime;private Date updatTime;public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}public String getLastIp() {return lastIp;}public void setLastIp(String lastIp) {this.lastIp = lastIp;}public Date getLastLoginTime() {return lastLoginTime;}public void setLastLoginTime(Date lastLoginTime) {this.lastLoginTime = lastLoginTime;}public Date getCreatTime() {return creatTime;}public void setCreatTime(Date creatTime) {this.creatTime = creatTime;}public Date getUpdatTime() {return updatTime;}public void setUpdatTime(Date updatTime) {this.updatTime = updatTime;}public User(){}User(String username, String password) {super(username, password);}@Overridepublic String toString() {return "User{" +"userName='"+getUsername()+'\''+", password='"+getPassword()+'\''+", email='" + email + '\'' +", phoneNumber='" + phoneNumber + '\'' +", lastIp='" + lastIp + '\'' +", lastLoginTime=" + lastLoginTime +", creatTime=" + creatTime +", updatTime=" + updatTime +'}';}/**TODO 重写hash和equal方法**/}
--repository
|-UserResitory
package com.heiyu.blog.repository;import com.heiyu.blog.domain.User;import com.mysql.cj.result.Row;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import org.springframework.stereotype.Repository;import com.heiyu.blog.domain.LoginUser;import javax.validation.constraints.Email;import java.sql.ResultSet;import java.sql.SQLException;/*** @author Jayfeather**/@Repositorypublic class UserRepository {private JdbcTemplate jdbcTemplate;@Autowiredpublic void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public int LoginUserMatch (String username,String password){String sql=("SELECT COUNT(*) FROM user_admin WHERE admin_name=? and admin_password=?;");return (int)jdbcTemplate.queryForObject(sql,new Object[]{username,password}, Integer.class);}public void UserWrite(User user){String sql=("INSERT INTO user_admin VALUE(?,?,?,?,?,?,?,?)");jdbcTemplate.update(sql,new Object[]{user.getUsername(),user.getPassword(),user.getCreatTime(),user.getUpdatTime(),user.getEmail(),user.getPhoneNumber(),user.getLastIp(),user.getLastLoginTime()});}public User UserRead(String username){String sql=("SELECT * FROM user_amdin WHERE username=?;");return (User)jdbcTemplate.queryForObject(sql, new Object[]{username}, UserRowMapper);}protected RowMapper UserRowMapper = new RowMapper() {@Overridepublic Object mapRow(ResultSet resultSet, int rowNum) throws SQLException {User user = new User();user.setEmail(resultSet.getString("admin_email"));user.setLastIp(resultSet.getString("admin_last_ip"));user.setLastLoginTime(resultSet.getTime("admin_last_time"));user.setPhoneNumber(resultSet.getString("admin_phone_number"));return user;}};}
--Service
&emps;|-UserService
package com.heiyu.blog.service;import com.heiyu.blog.domain.LoginUser;import com.heiyu.blog.domain.User;import com.heiyu.blog.repository.UserRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class UserService {private UserRepository userRepository;@Autowiredpublic void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}public boolean isLoginMatch(LoginUser loginUser){return userRepository.LoginUserMatch(loginUser.getUsername(),loginUser.getPassword())>0;}public void resignUser(User user){userRepository.UserWrite(user);}/** TODO 注册功能对象User的字段补全,并且写入数据库**/}
BlogApplication
package com.heiyu.blog;import org.springframework.boot.SpringApplication;//import static org.springframework.web.bind.annoimport org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.servlet.config.annotation.EnableWebMvc;@SpringBootApplicationpublic class BlogApplication {public static void main(String[] args) {SpringApplication.run(BlogApplication.class, args);}}
--Static
|-login.html
<!DOCTYPE html><html lang="ch-zn"><script type="text/javascript">var request= new XMLHttpRequest();function check() {var userName = document.getElementById("userName").value;var password = document.getElementById("password").value;if (userName == null || userName == "" || password == null || password == "") {alert("请输入用户名或密码");return false;}var url="/login"var requestData = JSON.stringify({username:userName,password:password});request.open('POST',url,true);request.setRequestHeader('Content-Type','application/json');request.send(requestData);request.onreadystatechange=handleResult;}function handleResult() {if (request.readyState == 4 && request.status == 200) {var response = request.responseText;var json = JSON.parse(response)if (json.login == 1)window.location.href = "/user/${login.userName}";else if (json.login == 0)alert("用户名或密码错误");return false;}}</script><head><meta charset="UTF-8"><title>管理登录</title></head><body><form id="login_form">用户名: <input name="username" type="text" id="userName" placeholder="用户名" /><br>密码: <input name="passwore" type="password" id="password" placeholder="密码"/><br><input id="login" type="button" class="loginbtn" onclick="check()" value="登录"/><input id="resign" type="button" class="resiginbtn" onclick="location='/resign'" value="注册"/></form></body></html>
--Static
|-resign.html
<!DOCTYPE html><html lang="zh-cn"><head><meta charset="UTF-8"><title>注册</title></head><body><form>用户名: <input name="username" type="text" id="userName" placeholder="用户名" /><br>密码: <input name="password" type="password" id="password" placeholder="密码"/><br>确认密码:<input name="password" type="password" id="password2" placeholder="确认密码"/><br>邮箱:<input name="E-mail" type="email" id="e-mail" placeholder="E-mail"/><br>手机号:<input name="phoneNumber" type="text" id="phoneNumber" placeholder="手机号"/><br><input id="login" type="button" class="loginbtn" onclick="resign()" value="注册"/></form></body><script type="text/javascript">var request= new XMLHttpRequest();function resign() {var userName = document.getElementById("userName").value;var password = document.getElementById("password").value;var password2 = document.getElementById("password2").value;var email = document.getElementById("e-mail").value;var phoneNumber = document.getElementById("phoneNumber").value;if (userName == null || userName == "" || password == null || password == "") {alert("请输入用户名或密码");return false;}if (password2 == null || password2 == "") {alert("请确认密码");return false;}if (password != password2) {alert("第一次和第二次密码输入不一致")return false;}if (email == null || email == "") {alert("请输入邮箱");return false;}if (phoneNumber == null || phoneNumber == ""){alert("请输入手机号");return false}var url="/resign"var requestData = JSON.stringify({username:userName,password:password,email:email,phoneNumber:phoneNumber});request.open('POST',url,true);request.setRequestHeader('Content-Type','application/json');request.send(requestData);request.onreadystatechange=handleResult;}function handleResult(){if(request.readyState==4 && request.status==200){var response = request.responseText;var json = JSON.parse(response)if(json.login==1)window.location.href="/user/${login.userName}";else if(json.login==0)alert("未知错误????");return false;}}</script></html>