目录
显示用户信息
如果是此时登录的列表页,此处显示的是登录用户的信息。
如果此时登录的是详情页,此处显示的是该文章的作者信息。
1.约定前后端交互接口
列表页
详情页
2.修改前端代码
列表页
//获取当前登录的用户信息,显示在左侧
function getUserInfo(){
$.ajax({
type:'get',
url:'userInfo',
success:function(user){
//把拿到的响应数据,取出其中的username,设置到页面的h3标签中
let h3=document.querySelector('.card h3');
h3.innerHTML=user.username;
}
})
}
//调用函数
getUserInfo();
详情页
function getAuthorInfo() {
$.ajax({
type: 'get',
url: 'getAuthorInfo' + location.search,
//location 对象代表了当前窗口的URL ,search获取或设置URL的查询字符串部分
success: function(user) {
// 把拿到的 user 对象, 取出其中的 username, 设置到页面上.
let h3 = document.querySelector('.card h3');
h3.innerHTML = user.username;
}
});
}
getAuthorInfo();
3.实现后端代码
列表页
@WebServlet("/userInfo")
public class UserInfoServlet extends HttpServlet {
private ObjectMapper objectMapper=new ObjectMapper();
//从会话中拿到用户信息返回即可
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session=req.getSession(false);
if(session==null){
resp.setContentType("text/html;charset=utf8");
resp.getWriter().write("当前用户未登录");
return;
}
User user= (User) session.getAttribute("user");
if(user==null){
resp.setContentType("text/html;charset=utf8");
resp.getWriter().write("当前用户未登录");
return;
}
//此时把user对象转成json,并返回给浏览器
resp.setContentType("application/json;charset=utf8");
//user中的密码属性不应该被返回
user.setPassword("");
String respJson=objectMapper.writeValueAsString(user);
resp.getWriter().write(respJson);
}
}
详情页
//在博客详情左边显示该博客的作者信息
@WebServlet("/getAuthorInfo")
public class AuthorInfoServlet extends HttpServlet {
private ObjectMapper objectMapper=new ObjectMapper();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.先拿到请求中的blogId
String blogId=req.getParameter("blogId");
if(blogId==null){
resp.setContentType("text/html;charset=utf8");
resp.getWriter().write("请求中缺少blogId");
return;
}
//2.在blog表中查询到Blog对象
BlogDao blogDao = new BlogDao();
Blog blog = blogDao.getBlog(Integer.parseInt(blogId));
if (blog == null) {
resp.setContentType("text/html; charset=utf8");
resp.getWriter().write("blogId 没有找到!");
return;
}
if(blog==null){
resp.setContentType("text/html;charset=utf8");
resp.getWriter().write("blogId没有找到a");
return;
}
//3.根据Blog对象中的userId,从user表中查到对应作者
UserDao userDao=new UserDao();
User user= null;
user = userDao.getUserById(blog.getUserId());
if(user==null){
resp.setContentType("text/html;charset=utf8");
resp.getWriter().write("userId没有找到");
return;
}
//4.把这个user对象返回到浏览器这边
user.setPassword("");
String respJson=objectMapper.writeValueAsString(user);
resp.setContentType("application/json;charset=utf8");
resp.getWriter().write(respJson);
}
}
注销
要想实现注销功能。需要判定当前的 登录状态;这里一共有两种方式:
①看看是否能查到 http session 对象
②看看 session 对象里有没有 user。
鉴于以上两种方式都可以实现注销功能,因此要么把 HttpSession 删掉;要么把 User 删掉,
满足以上一种情况即可。
getSession 有创建/获取会话的方法,但是没有删除会话的方法,因此想要删除会话会比较麻烦。
更好的办法就是 删除 user 对象,直接使用 removeAttribute 即可删除。
1.确定前后端交互接口
2.实现后端代码
新建一个 LogoutServlet 类。
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 先拿到会话对象
HttpSession session = req.getSession(false);
if (session == null) {
resp.setContentType("text/html; charset=utf8");
resp.getWriter().write("当前您尚未登录");
return;
}
// 再把会话中的 user 的属性给删除掉
session.removeAttribute("user");
// 跳转到博客登录页
resp.sendRedirect("login.html");
}
}
3.修改前端代码
在之前写好的前端代码中的 a 标签里加上一个 logout 路径。
<a href="logout">注销</a>