一個登陸頁面可能會被很多賬戶同時登陸或者注冊,那么我們就好處理這些並發,否則降低程序的使用率,甚至程序奔潰,下面一段代碼處理程序的高並發效果不錯。
/**
*@author xiaoxie
*@date create 2019/9/17
*@return
* 處理高並發
*/
public class RequestHolder {
// 線程處理
private static final ThreadLocal<SysUser> userHolder = new ThreadLocal<SysUser>();
// 登錄
private static final ThreadLocal<HttpServletRequest> requestHolder = new ThreadLocal<HttpServletRequest>();
// 設置登陸用戶
public static void add(SysUser sysUser){
userHolder.set(sysUser);
}
public static void add(HttpServletRequest request) {
requestHolder.set(request);
}
// 處理當前用戶
public static SysUser getCurrentUser() {
return userHolder.get();
}
// 處理當前登錄
public static HttpServletRequest getCurrentRequest() {
return requestHolder.get();
}
// 消亡
public static void remove(){
userHolder.remove();
requestHolder.remove();
}
}
注意:SysUser是自己定義的model,根據自己的需要設置。
在登陸或者注冊完成之后就要消亡,否則會產生數據的溢出。
/**
*@author xiaoxie
*@date CREATE 2019/9/6 UPDATE 2019/9/12
*@return 請求前后監聽
*/
@Slf4j
public class HttpInterceptor extends HandlerInterceptorAdapter {
private static final String START_TIME = "requestStartTime";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURI().toString();
Map parameterMap = request.getParameterMap();
log.info("request start. url:{}, params:{}", url, JsonMapper.obj2String(parameterMap));
long start = System.currentTimeMillis();
request.setAttribute(START_TIME, start);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// String url = request.getRequestURI().toString();
// long start = (Long) request.getAttribute(START_TIME);
// long end = System.currentTimeMillis();
// log.info("request finished. url:{}, cost:{}", url, end - start);
removeThreadLocalInfo();
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String url = request.getRequestURI().toString();
long start = (Long) request.getAttribute(START_TIME);
long end = System.currentTimeMillis();
log.info("request completed. url:{}, cost:{}", url, end - start);
removeThreadLocalInfo();
}
public void removeThreadLocalInfo() {
RequestHolder.remove();
}
通過過濾器進行實現
/**
*@author xiaoxie
*@date create 2019/9/17
*@return
*
* 登陸過濾
*/
@Slf4j
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
SysUser sysUser = (SysUser) req.getSession().getAttribute("user");
if (sysUser == null){
String path = "/signin.jsp";
resp.sendRedirect(path);
return;
}
// 處理高並發
RequestHolder.add(sysUser);
RequestHolder.add(req);
filterChain.doFilter(servletRequest,servletResponse);
return;
}
@Override
public void destroy() {
}
}
簡單的高並發就處理好了。