本章目的实现登录功能
写完之后,遇到一个类似于org.apache.catalina.loader.WebappClassLoader validateJarFile的错误,原因基本上就是项目里servlet-api.jar和tomcat下lib中的servlet-api.jar有冲突。以前在myeclipse中好像是可以删除程序里的jar,但是idea中去掉pom.xml中servlet相关的包时,程序会出错,不能导入HttpRequest之类的包。后来通过idea里编辑module的Artifacts,去掉相关包,这样就可以了。
一.表
登录人员表,简单的信息。
CREATE TABLE `t_blogger` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userName` varchar(50) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL,
`profile` text,
`nickName` varchar(50) DEFAULT NULL,
`sign` varchar(100) DEFAULT NULL,
`imageName` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
二.Model层
生成Blogger.java的model类。
三.DAO层
创建Interface,BloggerDao。提供getBlogger()方法查询blogger。
public interface BloggerDao {
/**
* 通过用户名查询用户
* @param userName
* @return
*/
public Blogger getByUserName(String userName);
}
DAO层实现,BloggerMapper.xml
<span style="white-space:pre"> </span><resultMap type="Blogger" id="BloggerResult">
<result property="id" column="id"/>
<result property="userName" column="userName"/>
<result property="password" column="password"/>
<result property="profile" column="profile"/>
<result property="nickName" column="nickName"/>
<result property="sign" column="sign"/>
<result property="imageName" column="imageName"/>
</resultMap>
<select id="getByUserName" parameterType="String" resultMap="BloggerResult">
select * from t_blogger where userName=#{userName}
</select>
四.Service层
创建interface,BloggerService.
创建class,BloggerServiceImpl 调用DAO层方法
@Service("bloggerService")
public class BloggerServiceImpl implements BloggerService{
@Resource
private BloggerDao bloggerDao;
public Blogger getByUserName(String userName) {
return bloggerDao.getByUserName(userName);
}
}
五.Controller层
创建class,BloggerController。这里使用shiro作为权限认证。暂且写死登录人。这里暂且用的shiro验证,暂且不明白的,直接copy代码。以前应该是dao层直接根据user对象验证。这里也有个md5加密认证的过程,表里数据密码也是加密过后的。
@Controller
@RequestMapping("/blogger")
public class BloggerController {
@Resource
private BloggerService bloggerService;
@RequestMapping("/login")
public String login(Blogger blogger,HttpServletRequest request){
Subject subject=SecurityUtils.getSubject();
UsernamePasswordToken token=new UsernamePasswordToken(blogger.getUserName(), CryptographyUtil.md5(blogger.getPassword(), "admin"));
try{
subject.login(token); // 登录验证
return "redirect:/admin/main.jsp";
}catch(Exception e){
e.printStackTrace();
request.setAttribute("blogger", blogger);
request.setAttribute("errorInfo", "用户名或者密码错误!");
return "login";
}
}
}
六.Realm
这一节目前是不明白的,直接copy代码。
public class MyRealm extends AuthorizingRealm{
@Resource
private BloggerService bloggerService;
/**
* 为当前的登录的用户角色和权限
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
return null;
}
/**
* 验证当前登录的用户
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String userName=(String) token.getPrincipal();
Blogger blogger=bloggerService.getByUserName(userName);
if(blogger!=null){
SecurityUtils.getSubject().getSession().setAttribute("currentUser", blogger); // 把当前用户信息存到session中
AuthenticationInfo authcInfo=new SimpleAuthenticationInfo(blogger.getUserName(), blogger.getPassword(), "xxx");
return authcInfo;
}else{
return null;
}
}
}
七.View
login.jsp
main.jsp 显示登录人信息
八.小结
代码半抄半写,能够实现本节需求,登录成功。细节还需斟酌,主要是shiro验证。