如何实现SSM登陆注册功能

发布时间:2022-09-30 10:22:32 作者:iii
来源:亿速云 阅读:227

如何实现SSM登陆注册功能

目录

  1. 引言
  2. SSM框架简介
  3. 项目环境搭建
  4. 数据库设计
  5. 用户注册功能实现
  6. 用户登录功能实现
  7. 用户认证与授权
  8. 功能测试与优化
  9. 总结

引言

在现代Web应用开发中,用户登录和注册功能是最基础且必不可少的功能之一。本文将详细介绍如何使用SSM(Spring、Spring MVC、MyBatis)框架实现一个完整的用户登录和注册功能。我们将从项目环境搭建开始,逐步实现前后端的功能,并最终通过Spring Security实现用户认证与授权。

SSM框架简介

Spring

Spring是一个轻量级的Java开发框架,主要用于构建企业级应用。它提供了全面的基础设施支持,包括依赖注入(DI)、面向切面编程(AOP)、事务管理等功能。

Spring MVC

Spring MVC是Spring框架的一个模块,用于构建Web应用程序。它基于MVC(Model-View-Controller)设计模式,将应用程序分为模型、视图和控制器三个部分,便于开发和维护。

MyBatis

MyBatis是一个持久层框架,它简化了数据库操作。通过XML或注解配置,MyBatis可以将Java对象映射到数据库表中的记录,并提供了强大的SQL映射功能。

项目环境搭建

开发工具

项目结构

src
├── main
│   ├── java
│   │   ├── com.example.demo
│   │   │   ├── controller
│   │   │   ├── service
│   │   │   ├── dao
│   │   │   ├── model
│   │   │   └── config
│   ├── resources
│   │   ├── mybatis
│   │   ├── spring
│   │   └── application.properties
│   └── webapp
│       ├── WEB-INF
│       └── views
└── test
    └── java

依赖配置

pom.xml中添加以下依赖:

<dependencies>
    <!-- Spring MVC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.10</version>
    </dependency>

    <!-- Spring JDBC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.10</version>
    </dependency>

    <!-- MyBatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>

    <!-- MyBatis Spring -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.6</version>
    </dependency>

    <!-- MySQL Connector -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>

    <!-- Spring Security -->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>5.5.2</version>
    </dependency>

    <!-- JSTL -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <!-- Servlet API -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

数据库设计

用户表设计

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

数据库连接配置

application.properties中配置数据库连接:

spring.datasource.url=jdbc:mysql://localhost:3306/demo_db?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

mybatis.mapper-locations=classpath:mybatis/*.xml
mybatis.type-aliases-package=com.example.demo.model

用户注册功能实现

前端页面设计

webapp/views目录下创建register.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户注册</title>
</head>
<body>
    <h2>用户注册</h2>
    <form action="/register" method="post">
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username" required><br><br>
        <label for="password">密码:</label>
        <input type="password" id="password" name="password" required><br><br>
        <label for="email">邮箱:</label>
        <input type="email" id="email" name="email" required><br><br>
        <input type="submit" value="注册">
    </form>
</body>
</html>

后端控制器实现

com.example.demo.controller包下创建UserController

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/register")
    public String showRegisterForm() {
        return "register";
    }

    @PostMapping("/register")
    public String registerUser(@ModelAttribute User user, Model model) {
        if (userService.registerUser(user)) {
            model.addAttribute("message", "注册成功!");
            return "login";
        } else {
            model.addAttribute("message", "注册失败,请重试!");
            return "register";
        }
    }
}

服务层实现

com.example.demo.service包下创建UserService接口及其实现类UserServiceImpl

public interface UserService {
    boolean registerUser(User user);
}

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public boolean registerUser(User user) {
        return userDao.insertUser(user) > 0;
    }
}

数据访问层实现

com.example.demo.dao包下创建UserDao接口及其实现类UserDaoImpl

public interface UserDao {
    int insertUser(User user);
}

@Repository
public class UserDaoImpl implements UserDao {

    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;

    @Override
    public int insertUser(User user) {
        return sqlSessionTemplate.insert("UserMapper.insertUser", user);
    }
}

resources/mybatis目录下创建UserMapper.xml

<mapper namespace="UserMapper">
    <insert id="insertUser" parameterType="User">
        INSERT INTO users (username, password, email) VALUES (#{username}, #{password}, #{email})
    </insert>
</mapper>

用户登录功能实现

前端页面设计

webapp/views目录下创建login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户登录</title>
</head>
<body>
    <h2>用户登录</h2>
    <form action="/login" method="post">
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username" required><br><br>
        <label for="password">密码:</label>
        <input type="password" id="password" name="password" required><br><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

后端控制器实现

UserController中添加登录相关方法:

@GetMapping("/login")
public String showLoginForm() {
    return "login";
}

@PostMapping("/login")
public String loginUser(@RequestParam String username, @RequestParam String password, Model model) {
    User user = userService.loginUser(username, password);
    if (user != null) {
        model.addAttribute("message", "登录成功!");
        return "home";
    } else {
        model.addAttribute("message", "登录失败,请重试!");
        return "login";
    }
}

服务层实现

UserService接口中添加登录方法:

User loginUser(String username, String password);

UserServiceImpl中实现登录方法:

@Override
public User loginUser(String username, String password) {
    return userDao.selectUserByUsernameAndPassword(username, password);
}

数据访问层实现

UserDao接口中添加查询方法:

User selectUserByUsernameAndPassword(String username, String password);

UserDaoImpl中实现查询方法:

@Override
public User selectUserByUsernameAndPassword(String username, String password) {
    Map<String, Object> params = new HashMap<>();
    params.put("username", username);
    params.put("password", password);
    return sqlSessionTemplate.selectOne("UserMapper.selectUserByUsernameAndPassword", params);
}

UserMapper.xml中添加查询语句:

<select id="selectUserByUsernameAndPassword" resultType="User">
    SELECT * FROM users WHERE username = #{username} AND password = #{password}
</select>

用户认证与授权

Spring Security简介

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它主要用于保护基于Spring的应用程序,提供了全面的安全解决方案。

Spring Security配置

com.example.demo.config包下创建SecurityConfig类:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/register", "/login").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/home")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
}

用户认证实现

com.example.demo.service包下创建CustomUserDetailsService类:

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserDao userDao;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userDao.selectUserByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("用户未找到");
        }
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());
    }
}

用户授权实现

SecurityConfig中配置用户授权:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/home")
            .permitAll()
            .and()
        .logout()
            .permitAll();
}

功能测试与优化

功能测试

  1. 注册功能测试:访问/register页面,填写表单并提交,检查数据库是否成功插入用户数据。
  2. 登录功能测试:访问/login页面,使用已注册的用户名和密码登录,检查是否成功跳转到/home页面。
  3. 认证与授权测试:访问/admin/user页面,检查是否根据用户角色正确授权。

性能优化

  1. 数据库连接池:使用HikariCP等高性能连接池优化数据库连接。
  2. 缓存:使用Redis等缓存技术缓存用户数据,减少数据库查询压力。
  3. 异步处理:使用Spring的异步处理机制优化耗时操作,如邮件发送等。

总结

通过本文的详细讲解,我们使用SSM框架实现了一个完整的用户登录和注册功能,并通过Spring Security实现了用户认证与授权。在实际开发中,我们可以根据需求进一步优化和扩展功能,如添加验证码、第三方登录等。希望本文能为您的开发工作提供帮助。

推荐阅读:
  1. 小程序登陆注册功能的实现
  2. 如何实现ssm分页

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

ssm

上一篇:javascript要加分号吗

下一篇:如何用SSM修改密码

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》