您好,登录后才能下订单哦!
在现代Web应用开发中,用户登录和注册功能是最基础且必不可少的功能之一。本文将详细介绍如何使用SSM(Spring、Spring MVC、MyBatis)框架实现一个完整的用户登录和注册功能。我们将从项目环境搭建开始,逐步实现前后端的功能,并最终通过Spring Security实现用户认证与授权。
Spring是一个轻量级的Java开发框架,主要用于构建企业级应用。它提供了全面的基础设施支持,包括依赖注入(DI)、面向切面编程(AOP)、事务管理等功能。
Spring MVC是Spring框架的一个模块,用于构建Web应用程序。它基于MVC(Model-View-Controller)设计模式,将应用程序分为模型、视图和控制器三个部分,便于开发和维护。
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的应用程序,提供了全面的安全解决方案。
在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();
}
/register
页面,填写表单并提交,检查数据库是否成功插入用户数据。/login
页面,使用已注册的用户名和密码登录,检查是否成功跳转到/home
页面。/admin
和/user
页面,检查是否根据用户角色正确授权。通过本文的详细讲解,我们使用SSM框架实现了一个完整的用户登录和注册功能,并通过Spring Security实现了用户认证与授权。在实际开发中,我们可以根据需求进一步优化和扩展功能,如添加验证码、第三方登录等。希望本文能为您的开发工作提供帮助。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。