SSH框架(Struts2 + Spring + Hibernate)是Java开发中常用的企业级框架组合,通过它可以高效实现基于数据库的用户登录功能,下面将从环境准备、数据库设计、代码实现等方面详细说明如何利用SSH框架实现数据库登录。

环境准备与依赖配置
确保开发环境已安装JDK、Maven(或手动管理依赖)及IDE(如Eclipse/IntelliJ IDEA),在项目中引入SSH核心依赖:Struts2用于处理请求与响应,Spring负责管理Bean和事务,Hibernate实现ORM操作数据库,需添加的依赖包括struts2-core、spring-context、spring-orm、hibernate-core等,同时配置数据库连接池(如c3p0或dbcp)。
数据库表设计
登录功能需用户表(如user)存储账户信息,表字段至少包括:id(主键,自增)、username(用户名,唯一)、password(密码,需加密存储),创建SQL表语句为:
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(100) NOT NULL
);
密码建议通过BCrypt等加密算法处理,避免明文存储。
Hibernate实体类与映射
创建User实体类,使用JPA注解映射数据库表:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(unique = true, nullable = false)
private String username;
@Column(nullable = false)
private String password;
// getters/setters
}
配置Hibernate映射文件(或注解),确保实体类与表结构对应。
Spring配置数据源与事务
在Spring配置文件(如applicationContext.xml)中配置数据源和Hibernate SessionFactory:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.entity"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
同时配置事务管理器,确保数据操作的事务性。
Struts2登录Action实现
创建登录Action类(如LoginAction),继承ActionSupport并实现ModelDriven接口绑定User对象:
public class LoginAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
@Autowired
private UserService userService;
@Override
public String execute() {
User existUser = userService.login(user);
if (existUser != null) {
return SUCCESS;
}
return ERROR;
}
@Override
public User getModel() {
return user;
}
}
通过@Autowired注入Service层,处理业务逻辑。
Service层与DAO层实现
Service层(如UserService)调用DAO层完成数据库查询:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDAO userDAO;
@Override
public User login(User user) {
return userDAO.findByUsernameAndPassword(user.getUsername(), user.getPassword());
}
}
DAO层(如UserDAO)通过HibernateTemplate或Hibernate API操作数据库:
@Repository
public class UserDAOImpl implements UserDAO {
@Autowired
private HibernateTemplate hibernateTemplate;
@Override
public User findByUsernameAndPassword(String username, String password) {
String hql = "FROM User WHERE username = ? AND password = ?";
return (User) hibernateTemplate.find(hql, username, password).get(0);
}
}
前端页面与结果跳转
编写JSP登录页面(如login.jsp),使用Struts2标签提交表单:

<s:form action="login">
<s:textfield name="username" label="用户名"/>
<s:password name="password" label="密码"/>
<s:submit value="登录"/>
</s:form>
在struts.xml配置Action结果跳转,成功跳转到welcome.jsp,失败返回login.jsp并显示错误信息。
安全与优化建议
- 密码加密:使用Spring Security或BCryptPasswordEncoder对密码加密存储和验证。
- SQL注入防护:避免直接拼接SQL,使用参数化查询(如Hibernate HQL)。
- 异常处理:统一捕获并处理数据库异常,避免敏感信息泄露。
FAQs
Q1: 登录时如何实现验证码功能?
A1: 可在Action中生成随机验证码(如Kaptcha库),存入Session并与用户输入比对,前端通过<img src="captcha.action"/>显示验证码,提交时携带验证码参数,Service层验证Session中的验证码是否匹配。
Q2: 忘记密码功能如何实现?
A2: 添加email字段至用户表,用户提交邮箱后,生成随机重置令牌(UUID),存入数据库并通过邮件发送链接,用户点击链接后,验证令牌有效性并引导至密码重置页面,更新密码后清除令牌。