自动登录
主要通过 cookie 和 session 的使用,实现自动登录
转载请标明出处:
https://www.zousiliang.com/articles/2019/04/02/1554207522314.html
本文出自塞伯克
第一次登录执行流程
用户第一次登录的时候,只要勾选自动登录功能,我们就生成一个 cookie,并将用户名和密码保存到 cookie 中存放到用户的浏览器中
生成 cookie 的代码:
// 判断用户是不是想自动登录
String auto = request.getParameter("auto");
if ("ok".equalsIgnoreCase(auto)) {
// 说明用户想自动登录
Cookie cookie = new Cookie("autoLogin", userFind.getUsername() + "&" + userFind.getPassword());
// 设置cookie的存活时间和绑定路径
cookie.setMaxAge(360000);
cookie.setPath(request.getContextPath());
// 在响应中添加cookie,并返回给浏览器
response.addCookie(cookie);
}
第二次登录执行流程
有了用户的 cookie 后,我们就可以到 cookie 中读取用户的账号和密码,进行自动登录,然后登录成功后将用户名和密码放到 session 中,否则每次用户点击我们的页面中的链接时,我们都需要到数据库查询判断,影响效率
AutoLoginFilter 代码
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AuthorityInterceptor implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 处理过滤信息方法
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
Object object = req.getSession().getAttribute("user");
// 如果从session中获取user为空,我们才需要获取cookie进行登陆以及存放到session中,否则直接放行
if (object == null) {
// 获取请求携带的cookies
Cookie[] cookies = req.getCookies();
Cookie cookie = null;
// 先要判断获取的cookies是否存在,不然遍历的时候会报空指针异常
if (cookies != null && cookies.length > 0) {
// 遍历cookies
for (Cookie c : cookies) {
String name = c.getName();
if ("autoLogin".equals(name)) {
// 说明cookie中存在自动登录信息
cookie = c;
break;
}
}
}
try {
// 说明存在自动登陆的cookie
if (cookie != null) {
// 我们需要把cookie的值读取出来存放到session中
String[] split = cookie.getValue().split("&");
User user = new User();
user.setUsername(split[0]);
user.setPassword(split[1]);
// 调用service层登陆
UserService service = new UserServiceImpl();
User userBack = service.login(user);
if (userBack != null) {// 说明登陆成功
req.getSession().setAttribute("user", userBack);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 如果不存在直接 放行
chain.doFilter(req, resp);
// 过滤响应
}
@Override
public void destroy() {
}
}
退出登录
退出的主要思路就是把 session 中和 cookie 中用户信息干掉
public void loginOut(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 干掉cookie和session
HttpSession session = request.getSession();
session.removeAttribute("user");
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie c : cookies) {
if ("autoLogin".equals(c.getName())) {
//设置cookie存活时间为0
c.setMaxAge(0);
//将cookie响应到前台
response.addCookie(c);
break;
}
}
}
// 重定向到首页
response.sendRedirect(request.getContextPath() + "/login.jsp");
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于