package io.loli.sc.server.filter;
import io.loli.sc.server.entity.LoginStatus;
import io.loli.sc.server.entity.User;
import io.loli.sc.server.service.LoginStatusService;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import javax.inject.Inject;
import javax.inject.Named;
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;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
@Named(value = "loginStatus")
public class LoginStatusFilter implements Filter {
@Inject
private LoginStatusService loginStatusService;
private Logger logger = Logger.getLogger(LoginStatusFilter.class);
public LoginStatusFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
if (req.getServletPath().contains("api")) {
chain.doFilter(request, response);
return;
}
try {
HttpSession session = req.getSession();
Object obj = session.getAttribute("user");
// 如果已经登录, 则无视
if (obj != null) {
User user = (User) obj;
Cookie[] cookies = req.getCookies();
if (cookies != null) {
long count = Arrays.stream(req.getCookies()).filter(c -> c.getName().equals("token")).count();
if (count == 0) {
LoginStatus ls = loginStatusService.findByUId(user.getId());
if (ls == null) {
ls = loginStatusService.getLoginStatusByUId(user.getId());
ls.setLastLogin(new Date());
loginStatusService.update(ls);
}
Cookie cookie = new Cookie("token", ls.getToken());
cookie.setMaxAge(3600 * 24 * 365);
cookie.setPath("/");
res.addCookie(cookie);
}
}
} else {
// 如果没有登录, 寻找此token是否对应某个用户,如果是,则将此用户添加到session中
Cookie[] cookies = req.getCookies();
if (cookies != null) {
Arrays.stream(req.getCookies()).filter(c -> c.getName().equals("token")).forEach(c -> {
User user = loginStatusService.findByToken(c.getValue());
if (user != null) {
session.setAttribute("user", user);
// 将该用户的登录时间保存进数据库中去
loginStatusService.updateDate(user);
}
} );
}
}
} catch (Exception e) {
e.printStackTrace();
logger.error("登录状态过滤器发生异常:" + e);
}
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}