社区项目-注册、登录、跳转功能的实现
注册
从login页面传递username和password到LoginController,LoginController中调用userService的register方法,对传递过来的username和password进行用户名的合法性(为空、敏感词、特殊字符)检测、密码强度检测,通过检测则调用userDAO的addUser方法将user保存到数据库中。
这里新建了一个LoginTicket表,用来保存和检测登录状态的,每次登录或注册,都会新增或检查相应的Ticket,并进行判断,到这里我们就会想,既然登录或者注册了就要将这个登录的状态保存起来,并且让整个程序随时都能够访问到。
这里是新增了一个HostHolder组件,将其增加到Spring容器中,这样就可以通过依赖注入随时获取到相应属性的状态了。
DROP TABLE IF EXISTS `login_ticket`;
CREATE TABLE `login_ticket` (
`id` INT NOT NULL AUTO_INCREMENT,
`user_id` INT NOT NULL,
`ticket` VARCHAR(45) NOT NULL,
`expired` DATETIME NOT NULL,
`status` INT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE INDEX `ticket_UNIQUE` (`ticket` ASC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;@Component
public class HostHolder {
//为每一条线程分配一个对象
private static ThreadLocal<User> users = new ThreadLocal<>();
public User getUser() {
return users.get();
}
public void serUser(User user) {
users.set(user);
}
public void clear() {
users.remove();
}
}登录
和注册差不多
未登录跳转
利用了一个Interceptor,在页面发出请求的时候检测cookie里面是否携带了tiket,如果有,可以继续访问,如果没有就跳转到登录页面。
@Component
public class PassportInterceptor implements HandlerInterceptor {
@Autowired
private LoginTicketDAO loginTicketDAO;
@Autowired
private UserDAO userDAO;
@Autowired
HostHolder hostHolder;
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
String ticket = null;
Cookie[] cookies = httpServletRequest.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("ticket")) {
ticket = cookie.getValue();
break;
}
}
}
if (ticket != null) {
LoginTicket loginTicket = loginTicketDAO.selectByTicket(ticket);
if (loginTicket == null || loginTicket.getStatus() != 0 || loginTicket.getExpired().before(new Date())) {
return true;
}
User user = userDAO.selectById(loginTicket.getUserId());
hostHolder.serUser(user);
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
if (modelAndView != null) {
modelAndView.addObject("user", hostHolder.getUser());
}
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
hostHolder.clear();
}
}总的来说没用到什么新技术,很基础的东西。
