package com.tale.interceptor;
import com.blade.ioc.annotation.Inject;
import com.blade.kit.IPKit;
import com.blade.kit.StringKit;
import com.blade.kit.UUID;
import com.blade.mvc.annotation.Intercept;
import com.blade.mvc.http.Request;
import com.blade.mvc.http.Response;
import com.blade.mvc.interceptor.Interceptor;
import com.tale.dto.Types;
import com.tale.init.TaleConst;
import com.tale.model.Users;
import com.tale.service.UsersService;
import com.tale.utils.MapCache;
import com.tale.utils.TaleUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Intercept
public class BaseInterceptor implements Interceptor {
private static final Logger LOGGE = LoggerFactory.getLogger(BaseInterceptor.class);
@Inject
private UsersService usersService;
private MapCache cache = MapCache.single();
@Override
public boolean before(Request request, Response response) {
String uri = request.uri();
String ip = IPKit.getIpAddrByRequest(request.raw());
// 禁止该ip访问
if(TaleConst.BLOCK_IPS.contains(ip)){
response.text("You have been banned, brother");
return false;
}
LOGGE.info("UserAgent: {}", request.userAgent());
LOGGE.info("用户访问地址: {}, 来路地址: {}", uri, ip);
if (!TaleConst.INSTALL && !uri.startsWith("/install")) {
response.go("/install");
return false;
}
if (TaleConst.INSTALL) {
Users user = TaleUtils.getLoginUser();
if (null == user) {
Integer uid = TaleUtils.getCookieUid(request);
if (null != uid) {
user = usersService.byId(Integer.valueOf(uid));
request.session().attribute(TaleConst.LOGIN_SESSION_KEY, user);
}
}
if(uri.startsWith("/admin") && !uri.startsWith("/admin/login")){
if(null == user){
response.go("/admin/login");
return false;
}
request.attribute("plugin_menus", TaleConst.plugin_menus);
}
}
String method = request.method();
if(method.equals("GET")){
String csrf_token = UUID.UU64();
// 默认存储20分钟
int timeout = TaleConst.BCONF.getInt("app.csrf-token-timeout", 20) * 60;
cache.hset(Types.CSRF_TOKEN, csrf_token, uri, timeout);
request.attribute("_csrf_token", csrf_token);
}
return true;
}
@Override
public boolean after(Request request, Response response) {
String _csrf_token = request.attribute("del_csrf_token");
if(StringKit.isNotBlank(_csrf_token)){
// 移除本次token
cache.hdel(Types.CSRF_TOKEN, _csrf_token);
}
return true;
}
}