场景
当我们的退出的登陆状态的时候,我们需要清除当前用户的所有相关信息。
正文
我们这里采用Listener
监听器来处理相关的业务。
UserSessionListener
package com.listener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import java.util.Enumeration;
public class UserSessionListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent sbe) {
}
@Override
public void attributeRemoved(HttpSessionBindingEvent sbe) {
/* This method is called when an attribute
is removed from a session.
*/
String name = sbe.getName();
if ("user".equals(name)){ // 如果移除了session中的user,说明用户可能更换,所以需要同时移除订单,购物车相关的东西
HttpSession session = sbe.getSession();
session.removeAttribute("orderList");
session.removeAttribute("orderItems");
session.removeAttribute("orderId");
session.removeAttribute("cart");
// Enumeration<String> attributeNames = session.getAttributeNames();
// while (attributeNames.hasMoreElements()){
// session.removeAttribute(attributeNames.nextElement().toString());
// }
}
}
@Override
public void attributeReplaced(HttpSessionBindingEvent sbe) {
}
}
HttpSessionAttributeListener
监听器是用来监听session域
中属性的变化情况。attributeRemoved()
方法会在属性被移除的时候触发。
而这里我的逻辑就是监听session
域中的user
属性的变化情况,在我们user
属性被移除的时候清除有关信息。
而user
属性的移除是在点击退出登录
按钮的时候,触发相关方法移除的。
相关代码:
<li>
<a class="dropdown-item" href="/MyProject/userProcessServlet?method=logout" id="logout">退出登录</a>
</li>
// 用户注销
protected void logout(HttpServletRequest request,HttpServletResponse response){
HttpSession session = request.getSession();
session.removeAttribute("user");
try {
response.sendRedirect("/MyProject/index.jsp");
} catch (IOException e) {
e.printStackTrace();
}
}