package com.bee.inception.thanos.web.intercepter;
import com.bee.inception.thanos.common.bean.Pager;
import com.bee.inception.thanos.common.constant.Constants;
import com.bee.inception.thanos.common.context.PageContext;
import com.bee.inception.thanos.service.common.HotConfigService;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;
import static com.bee.inception.thanos.common.context.PageContext.*;
/**
* @Date: Created in 16:24 2019/3/15
*/
public class PagerInterceptor extends HandlerInterceptorAdapter {
private static Logger logger= LoggerFactory.getLogger(PagerInterceptor.class);
@Resource
private HotConfigService hotConfigService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//如果有pageIndex则用pageIndex,否则用page!page是从1开始
int page = ServletRequestUtils.getIntParameter(request, "page", 1);
Integer pageIndex = ServletRequestUtils.getIntParameter(request, "pageIndex", page - 1);
Integer pageSize = hotConfigService.getIntValue(Constants.HOT_PAGESIZE, 10);
// 封装分页信息
if (pageIndex >= 0 && pageSize >= 0) {
Pager pager = new Pager(pageIndex, pageSize);
pager.setPage(page);
//学习地方,ThreadLocal的用法
setPager(pager);
}
monitorRequestUrl(request);
return super.preHandle(request, response, handler);
}
/**
*学习地方
*/
private void monitorRequestUrl(HttpServletRequest request){
try {
Enumeration<String> parameterNames = request.getParameterNames();
StringBuilder params = new StringBuilder();
while (parameterNames.hasMoreElements()) {
String name = parameterNames.nextElement();
if (StringUtils.isNotBlank(name)) {
String value = request.getParameter(name);
if (value != null && value.length() > 1000) {
value = "[参数太长省略]";
}
params.append(name).append("=").append(value).append("&");
}
}
logger.info("request uri:{} parameter:{}",request.getRequestURI(),params.toString());
}catch (Exception e){
logger.error("monitorRequestUrl error",e);
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
try {
if (ex == null) {
Pager pager = getPager();
request.setAttribute("pager", pager);
}
super.afterCompletion(request, response, handler, ex);
} finally {
//学习地方之一,ThreadLocal取消
PageContext.release();
}
}
}
工具类承接上文
public class PageContext {
//学习地方ThreadLocal的用法
private static ThreadLocal<Pager> context = new ThreadLocal<Pager>();
public static void setPager(Pager pager) {
context.set(pager);
}
public static Pager getPager() {
return context.get();
}
public static void release() {
context.remove();
}
}