个人主页的主要内容为当前被访问用户的资料卡,以及该用户的动态列表。资料卡关系到关注、评论、点赞功能,暂时把它放到一边,只实现动态列表。
动态列表单个用户的最新动态其实跟主页上所有用户的最新动态是相似的,只要在查询时增加筛选条件“user_id 字段的值为指定的 userId”即可。在前文第(3)篇“首页”中,QuestionService 里的 getQuestionList() 方法有参数 int userId,在实现主页的动态列表是传入的值为 0,而只要在 controller 层调用该方法时传入被访问用户的 id 就可以只查询单个用户发表的动态,从而实现个人主页的动态列表,非常简单。这里比较有趣的地方是在于 dao 的写法,mybatis 的 mapper 文件可以允许加入逻辑判断,这样只需要写一个 dao 就可以供 service 层的两种方法调用。
登录跳转question id, title, content, create_time, user_id, comment_count
有些页面或者请求是我们不希望让未登录用户访问的,而有些功能和页面本身就是为用户自己访问设计的,仅对登录的用户存在价值,例如“设置” “我的主页”等。也就是说,我们要让某个或者某些请求只有登录的用户才可以访问,未登录的用户请求访问时自动跳转到登录页,并且考虑到用户体验,在登录完成后需要让用户能够直接进入原先想要访问的页面。
要求登录 - 拦截器使用拦截器就可以完美地阻止未登录用户访问我们不想完全开放的请求,在注册拦截器时,调用addPathPatterns() 方法,参数为要拦截的请求路径的正则表达式。
registry.addInterceptor(loginRequiredInterceptor).addPathPatterns("/user/*");
在将请求重定向到登录页的同时,记录用户想要访问的请求地址,经过进一步处理后在登录成功后跳转到这个请求。
@Component
public class LoginRequiredInterceptor implements HandlerInterceptor {
@Resource
HostHolder hostHolder;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(hostHolder.getUser() == null){
response.sendRedirect("/reglogin?next="+request.getRequestURI());
}
return true;
}
}
跳转到原请求
在注册登录页面加一个隐藏的标签,保存登录跳转时传过来的请求地址,在请求注册或登录时传给后端。
@GetMapping("/reglogin")
public String login(HttpServletRequest request,
@RequestParam(value = "next", required = false) String next) {
request.setAttribute("next", next);
return "login";
}
处理登录请求时,一旦收到了原先的请求地址,就在登录验证成功后将请求重定向到该地址。



