[关闭]
@Jayfeather 2018-12-23T15:08:03.000000Z 字数 12426 阅读 745

简单的登录模块

Spring


1. 更新记录

更新时间 更新内容
20181223 创建该笔记,实现简单的登录模块

2. 问题

-

3. 总结

项目未结
使用了Spring MVC + Spring Boot + RESTful实现了一个简单的登录模块
依赖管理使用了maven
总体来说是前后端分离的思想,后端仅仅提供静态HTML文件和动态json内容,路由和页面渲染在前段完成
仅仅是完成了简单的登录+注册功能,还没有添加权限验证

4. 依赖包

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.1.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.heiyu</groupId>
  12. <artifactId>blog</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>blog</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-data-rest</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-integration</artifactId>
  27. </dependency>
  28. <!--<dependency>-->
  29. <!--<groupId>org.springframework.boot</groupId>-->
  30. <!--<artifactId>spring-boot-starter-security</artifactId>-->
  31. <!--</dependency>-->
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-web</artifactId>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-starter-test</artifactId>
  39. <scope>test</scope>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.springframework.security</groupId>
  43. <artifactId>spring-security-test</artifactId>
  44. <scope>test</scope>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-devtools</artifactId>
  49. <optional>true</optional>
  50. </dependency>
  51. <dependency>
  52. <groupId>com.fasterxml.jackson.core</groupId>
  53. <artifactId>jackson-core</artifactId>
  54. <version>2.9.7</version>
  55. </dependency>
  56. <dependency>
  57. <groupId>com.fasterxml.jackson.core</groupId>
  58. <artifactId>jackson-annotations</artifactId>
  59. <version>2.9.7</version>
  60. </dependency>
  61. <dependency>
  62. <groupId>com.fasterxml.jackson.core</groupId>
  63. <artifactId>jackson-databind</artifactId>
  64. <version>2.9.7</version>
  65. </dependency>
  66. <dependency>
  67. <groupId>org.springframework.boot</groupId>
  68. <artifactId>spring-boot-starter-data-jpa</artifactId>
  69. </dependency>
  70. <dependency>
  71. <groupId>org.hsqldb</groupId>
  72. <artifactId>hsqldb</artifactId>
  73. <scope>runtime</scope>
  74. </dependency>
  75. <dependency>
  76. <groupId>mysql</groupId>
  77. <artifactId>mysql-connector-java</artifactId>
  78. <version>8.0.11</version>
  79. </dependency>
  80. </dependencies>
  81. <build>
  82. <plugins>
  83. <plugin>
  84. <groupId>org.springframework.boot</groupId>
  85. <artifactId>spring-boot-maven-plugin</artifactId>
  86. </plugin>
  87. </plugins>
  88. </build>
  89. </project>

5. 文件目录:

image.png-26.5kB

包解释:


6. 具体代码:

--Controller
 |—MainController

  1. package com.heiyu.blog.controller;
  2. import com.heiyu.blog.domain.User;
  3. import com.heiyu.blog.service.UserService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  6. import org.springframework.web.bind.annotation.*;
  7. import org.springframework.web.servlet.ModelAndView;
  8. import com.heiyu.blog.domain.LoginUser;
  9. import javax.servlet.http.HttpServletRequest;
  10. import static org.springframework.web.bind.annotation.RequestMethod.*;
  11. @EnableAutoConfiguration
  12. @RestController
  13. @RequestMapping
  14. public class MainController {
  15. @Autowired
  16. private UserService userService;
  17. @Autowired
  18. private HttpServletRequest request;
  19. @RequestMapping(value = "/login",method = GET)
  20. public ModelAndView login(){
  21. return new ModelAndView("login");
  22. }
  23. @RequestMapping(value = "/login",method = POST)
  24. @ResponseBody
  25. public String loginPost(@RequestBody LoginUser loginUser) {
  26. System.out.println(loginUser.toString());
  27. if (userService.isLoginMatch(loginUser)) {
  28. return "{\"login\":1}";
  29. } else {
  30. return "{\"login\":0}";
  31. }
  32. }
  33. @RequestMapping(value = "/resign",method = GET)
  34. public ModelAndView resign(){ return new ModelAndView("resign");}
  35. @RequestMapping(value = "/resign",method = POST)
  36. @ResponseBody
  37. public String resignPost(@RequestBody User user){
  38. request.getHeader("x-forwarded-for");
  39. System.out.println(user.toString());
  40. System.out.println( request.getHeader("x-forwarded-for"));
  41. return "{\"login\":1}";
  42. }
  43. }

--Domain
 |--loginUser

  1. package com.heiyu.blog.domain;
  2. import java.util.Objects;
  3. public class LoginUser {
  4. private String username;
  5. private String password;
  6. public String getUsername() {
  7. return username;
  8. }
  9. public void setUsername(String username) {
  10. this.username = username;
  11. }
  12. public String getPassword() {
  13. return password;
  14. }
  15. public void setPassword(String password) {
  16. this.password = password;
  17. }
  18. public LoginUser(){}
  19. public LoginUser(String username, String password){
  20. this.username=username;
  21. this.password=password;
  22. }
  23. @Override
  24. public String toString(){
  25. return "{\"username\":\""+username+"\",\"password\":\""+password+"\"}";
  26. }
  27. @Override
  28. public boolean equals(Object o) {
  29. if (this == o) return true;
  30. if (o == null || getClass() != o.getClass()) return false;
  31. LoginUser loginUser = (LoginUser) o;
  32. return Objects.equals(username, loginUser.username) &&
  33. Objects.equals(password, loginUser.password);
  34. }
  35. @Override
  36. public int hashCode() {
  37. return Objects.hash(username, password);
  38. }
  39. /** todo 将loginUser与User合并
  40. *
  41. */
  42. }

--domain
 |-User

  1. package com.heiyu.blog.domain;
  2. import jdk.nashorn.internal.objects.annotations.Getter;
  3. import jdk.nashorn.internal.objects.annotations.Setter;
  4. import javax.validation.constraints.Email;
  5. import java.util.Date;
  6. public class User extends LoginUser {
  7. private String email;
  8. private String phoneNumber;
  9. private String lastIp;
  10. private Date lastLoginTime;
  11. private Date creatTime;
  12. private Date updatTime;
  13. public String getEmail() {
  14. return email;
  15. }
  16. public void setEmail(String email) {
  17. this.email = email;
  18. }
  19. public String getPhoneNumber() {
  20. return phoneNumber;
  21. }
  22. public void setPhoneNumber(String phoneNumber) {
  23. this.phoneNumber = phoneNumber;
  24. }
  25. public String getLastIp() {
  26. return lastIp;
  27. }
  28. public void setLastIp(String lastIp) {
  29. this.lastIp = lastIp;
  30. }
  31. public Date getLastLoginTime() {
  32. return lastLoginTime;
  33. }
  34. public void setLastLoginTime(Date lastLoginTime) {
  35. this.lastLoginTime = lastLoginTime;
  36. }
  37. public Date getCreatTime() {
  38. return creatTime;
  39. }
  40. public void setCreatTime(Date creatTime) {
  41. this.creatTime = creatTime;
  42. }
  43. public Date getUpdatTime() {
  44. return updatTime;
  45. }
  46. public void setUpdatTime(Date updatTime) {
  47. this.updatTime = updatTime;
  48. }
  49. public User(){}
  50. User(String username, String password) {
  51. super(username, password);
  52. }
  53. @Override
  54. public String toString() {
  55. return "User{" +
  56. "userName='"+getUsername()+'\''+
  57. ", password='"+getPassword()+'\''+
  58. ", email='" + email + '\'' +
  59. ", phoneNumber='" + phoneNumber + '\'' +
  60. ", lastIp='" + lastIp + '\'' +
  61. ", lastLoginTime=" + lastLoginTime +
  62. ", creatTime=" + creatTime +
  63. ", updatTime=" + updatTime +
  64. '}';
  65. }
  66. /**TODO 重写hash和equal方法
  67. *
  68. */
  69. }

--repository
 |-UserResitory

  1. package com.heiyu.blog.repository;
  2. import com.heiyu.blog.domain.User;
  3. import com.mysql.cj.result.Row;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.jdbc.core.JdbcTemplate;
  6. import org.springframework.jdbc.core.RowMapper;
  7. import org.springframework.stereotype.Repository;
  8. import com.heiyu.blog.domain.LoginUser;
  9. import javax.validation.constraints.Email;
  10. import java.sql.ResultSet;
  11. import java.sql.SQLException;
  12. /**
  13. * @author Jayfeather
  14. *
  15. */
  16. @Repository
  17. public class UserRepository {
  18. private JdbcTemplate jdbcTemplate;
  19. @Autowired
  20. public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  21. this.jdbcTemplate = jdbcTemplate;
  22. }
  23. public int LoginUserMatch (String username,String password){
  24. String sql=("SELECT COUNT(*) FROM user_admin WHERE admin_name=? and admin_password=?;");
  25. return (int)jdbcTemplate.queryForObject(sql,new Object[]{username,password}, Integer.class);
  26. }
  27. public void UserWrite(User user){
  28. String sql=("INSERT INTO user_admin VALUE(?,?,?,?,?,?,?,?)");
  29. jdbcTemplate.update(sql,new Object[]{
  30. user.getUsername(),
  31. user.getPassword(),
  32. user.getCreatTime(),
  33. user.getUpdatTime(),
  34. user.getEmail(),
  35. user.getPhoneNumber(),
  36. user.getLastIp(),
  37. user.getLastLoginTime()
  38. });
  39. }
  40. public User UserRead(String username){
  41. String sql=("SELECT * FROM user_amdin WHERE username=?;");
  42. return (User)jdbcTemplate.queryForObject(sql, new Object[]{username}, UserRowMapper);
  43. }
  44. protected RowMapper UserRowMapper = new RowMapper() {
  45. @Override
  46. public Object mapRow(ResultSet resultSet, int rowNum) throws SQLException {
  47. User user = new User();
  48. user.setEmail(resultSet.getString("admin_email"));
  49. user.setLastIp(resultSet.getString("admin_last_ip"));
  50. user.setLastLoginTime(resultSet.getTime("admin_last_time"));
  51. user.setPhoneNumber(resultSet.getString("admin_phone_number"));
  52. return user;
  53. }
  54. };
  55. }

--Service
&emps;|-UserService

  1. package com.heiyu.blog.service;
  2. import com.heiyu.blog.domain.LoginUser;
  3. import com.heiyu.blog.domain.User;
  4. import com.heiyu.blog.repository.UserRepository;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. @Service
  8. public class UserService {
  9. private UserRepository userRepository;
  10. @Autowired
  11. public void setUserRepository(UserRepository userRepository) {
  12. this.userRepository = userRepository;
  13. }
  14. public boolean isLoginMatch(LoginUser loginUser){
  15. return userRepository.LoginUserMatch(loginUser.getUsername(),loginUser.getPassword())>0;
  16. }
  17. public void resignUser(User user){
  18. userRepository.UserWrite(user);
  19. }
  20. /** TODO 注册功能对象User的字段补全,并且写入数据库
  21. *
  22. */
  23. }

BlogApplication

  1. package com.heiyu.blog;
  2. import org.springframework.boot.SpringApplication;
  3. //import static org.springframework.web.bind.anno
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  6. @SpringBootApplication
  7. public class BlogApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(BlogApplication.class, args);
  10. }
  11. }

--Static
 |-login.html

  1. <!DOCTYPE html>
  2. <html lang="ch-zn">
  3. <script type="text/javascript">
  4. var request= new XMLHttpRequest();
  5. function check() {
  6. var userName = document.getElementById("userName").value;
  7. var password = document.getElementById("password").value;
  8. if (userName == null || userName == "" || password == null || password == "") {
  9. alert("请输入用户名或密码");
  10. return false;
  11. }
  12. var url="/login"
  13. var requestData = JSON.stringify({username:userName,password:password});
  14. request.open('POST',url,true);
  15. request.setRequestHeader('Content-Type','application/json');
  16. request.send(requestData);
  17. request.onreadystatechange=handleResult;
  18. }
  19. function handleResult() {
  20. if (request.readyState == 4 && request.status == 200) {
  21. var response = request.responseText;
  22. var json = JSON.parse(response)
  23. if (json.login == 1)
  24. window.location.href = "/user/${login.userName}";
  25. else if (json.login == 0)
  26. alert("用户名或密码错误");
  27. return false;
  28. }
  29. }
  30. </script>
  31. <head>
  32. <meta charset="UTF-8">
  33. <title>管理登录</title>
  34. </head>
  35. <body>
  36. <form id="login_form">
  37. 用户名: <input name="username" type="text" id="userName" placeholder="用户名" /><br>
  38. 密码: <input name="passwore" type="password" id="password" placeholder="密码"/><br>
  39. <input id="login" type="button" class="loginbtn" onclick="check()" value="登录"/>
  40. <input id="resign" type="button" class="resiginbtn" onclick="location='/resign'" value="注册"/>
  41. </form>
  42. </body>
  43. </html>

--Static
 |-resign.html

  1. <!DOCTYPE html>
  2. <html lang="zh-cn">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>注册</title>
  6. </head>
  7. <body>
  8. <form>
  9. 用户名: <input name="username" type="text" id="userName" placeholder="用户名" /><br>
  10. 密码: <input name="password" type="password" id="password" placeholder="密码"/><br>
  11. 确认密码:<input name="password" type="password" id="password2" placeholder="确认密码"/><br>
  12. 邮箱:<input name="E-mail" type="email" id="e-mail" placeholder="E-mail"/><br>
  13. 手机号:<input name="phoneNumber" type="text" id="phoneNumber" placeholder="手机号"/><br>
  14. <input id="login" type="button" class="loginbtn" onclick="resign()" value="注册"/>
  15. </form>
  16. </body>
  17. <script type="text/javascript">
  18. var request= new XMLHttpRequest();
  19. function resign() {
  20. var userName = document.getElementById("userName").value;
  21. var password = document.getElementById("password").value;
  22. var password2 = document.getElementById("password2").value;
  23. var email = document.getElementById("e-mail").value;
  24. var phoneNumber = document.getElementById("phoneNumber").value;
  25. if (userName == null || userName == "" || password == null || password == "") {
  26. alert("请输入用户名或密码");
  27. return false;
  28. }
  29. if (password2 == null || password2 == "") {
  30. alert("请确认密码");
  31. return false;
  32. }
  33. if (password != password2) {
  34. alert("第一次和第二次密码输入不一致")
  35. return false;
  36. }
  37. if (email == null || email == "") {
  38. alert("请输入邮箱");
  39. return false;
  40. }
  41. if (phoneNumber == null || phoneNumber == ""){
  42. alert("请输入手机号");
  43. return false
  44. }
  45. var url="/resign"
  46. var requestData = JSON.stringify({username:userName,password:password,email:email,phoneNumber:phoneNumber});
  47. request.open('POST',url,true);
  48. request.setRequestHeader('Content-Type','application/json');
  49. request.send(requestData);
  50. request.onreadystatechange=handleResult;
  51. }
  52. function handleResult(){
  53. if(request.readyState==4 && request.status==200){
  54. var response = request.responseText;
  55. var json = JSON.parse(response)
  56. if(json.login==1)
  57. window.location.href="/user/${login.userName}";
  58. else if(json.login==0)
  59. alert("未知错误????");
  60. return false;
  61. }
  62. }
  63. </script>
  64. </html>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注