基于Spring的网站注册登录系统
半年前写了篇博文《Spring 3.1 + JPA 2.0 (Hibernate 4) + MySQL配置》,留意到仍有不少访客阅读,最近打算再写一篇关于Spring的文章回馈Spring的爱好者。这篇文章采用了和上篇不同的方式来对Spring相关的技术进行介绍,作者业余时间查阅了不少相关资料,开发实现了网站注册、登录系统,本文以该系统为主线展开。文章涉及到的主要技术有:Spring、 Spring MVC、 Hibernate、EhCache、Spring DATA JPA、Spring Mail、Recapcha、 Spring Security等。
系统使用了4个类:User(用户)、UserList(保持多个User的链表)、Role(用户的角色)和 Address(用户的地址信息)。
User:User类定义前使用了3个注释(Annotation):@Entity用于说明User本身是一个实体,对应到数据库的一个表格;@Table(name="User")用于说明了数据库表格的名字,不使用@Table(name="User")的话表格的名字和类名保持一致,即User;@Cache注释说明了对数据库表USER进行读写缓存,本文使用了EhCache作为数据库的二级缓存。
用户类包含了下列成员信息:id、firstname、lastname、username、sex、email、password、address、role、confirmed、create和update。
id:该成员使用了@Id、@GeneratedValue、@Column注释。@Id用户说明该成员为USER表的identity列;@GeneratedValue说明该列的值由数据库自动产生;@Column用于自定义该成员在数据库表格中的列名,不使用@Column,数据库表格列名和该成员名保持一致,这一点@Column和上面提到的@Table作用类似。
firstname、lastname:这两个成员都是使用了@Column的nullable = false,说明当向数据库表格插入数据时该成员对应的列不能为空,为空的话数据插入失败。
username:unique = true 说明了数据库中不能存放相同username的记录;updatable = false说明记录一旦插入数据库表格,该值不能进行修改。
address:@ManyToMany定义了User和Address间多对多的映射关系,cascade = CascadeType.ALL说明当USER表格插入一条含有新address的记录时,ADDRESS表格也会自动插入新的记录。@JoinTable用于说明为表格USER和ADDRESS创建一个连接表。
confirmed:该成员用于标示用户注册后有没有打开发送到注册邮箱中的链接进行确认,只有确认后才算成功注册。
confirmedID:该成员是发送到注册邮箱的确认链接的一部分。
create、update:这两个成员分别表示记录的创建和修改时间,@Temporal用于说明是时间戳。注意相关函数onCreate、onUpdate及注释,@PrePersist说明当记录插入数据库时执行,@PreUpdate说明当更新记录时执行。
getCaptcha:该方法比较特殊,只是一个哑方法,用于支持验证错误信息。
<?xml version="1.0" encoding="UTF-8"?><beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"><http pattern="/resources/**" security="none" /><http auto-config="true" use-expressions="true" disable-url-rewriting="true"><intercept-url pattern="/register" access="permitAll" /><intercept-url pattern="/registerSuccess" access="permitAll" /><intercept-url pattern="/confirmSuccess" access="permitAll" /><intercept-url pattern="/login" access="permitAll" /><intercept-url pattern="/logout" access="permitAll" /><intercept-url pattern="/denied" access="hasRole('ROLE_USER')" /><intercept-url pattern="/" access="hasRole('ROLE_USER')" /><intercept-url pattern="/user" access="hasRole('ROLE_USER')" /><intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')" /><form-login login-page="/login" authentication-failure-url="/login/failure"default-target-url="/" /><access-denied-handler error-page="/denied" /><logout invalidate-session="true" logout-success-url="/logout/success"logout-url="/logout" /></http><!-- Declare an authentication-manager to user a custom userDetailService --><authentication-manager><authentication-provider user-service-ref="customUserDetailsService"><password-encoder hash="md5" /></authentication-provider></authentication-manager></beans:beans>