在当前进程下取得当前登陆用户
生活随笔
收集整理的這篇文章主要介紹了
在当前进程下取得当前登陆用户
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這個也是一個工具類
場景:比如說我們需要在controller或者service或者dao層用到當前登陸人的信息。我們之前的做法,肯定是從session中取出來。然后哪里需要傳哪里。這樣很麻煩。這時候我們需要造一個工具類。目的是在任何地方都能獲取到當前登陸人的信息。
?
在這里我們要用到一個對象??ThreadLocal? 這個對象 這個類相當于一個map,但是這個類的key是當前的進程。所以說,一個這樣類只能放一個對象。這里要注意一下。
為什么要用這樣的一個類呢?因為這個類的特性,每個進程的是完全隔離的,避免高并發情況下發生一些錯誤(我也不知道啥錯誤,反正就是防止高并發,這個坑回來再填!!!ToDo~~)
?
1.RequestHolder.javapackage com.mmall.common;import com.mmall.model.SysUser;import javax.servlet.http.HttpServletRequest;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();} } View Code
說明:這里new了兩個這樣的類,一個放當前對象,一個放當前request,然后自定義add方法,還有一個remove方法,因為在每次請求完之后,要把ThreadLocal 里面的數據移除掉
?
?2. 然后寫一個filter過濾器。攔截所有的請求。沒有登錄直接返回登錄頁面,登錄了就從session中獲取當前對象,然后add進去
LoginFilter.javapackage com.mmall.filter;import com.mmall.common.RequestHolder; import com.mmall.model.SysUser; import lombok.extern.slf4j.Slf4j;import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;/*** Created by 敲代碼的卡卡羅特* on 2018/3/28 23:49.*/ @Slf4j public class LoginFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic 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;}@Overridepublic void destroy() {} } View Code
?
3.每次請求結束清除當前數據? ?如何知道每次當前請求結束 請看我這一篇博客
HttpInterceptor.java package com.mmall.common;import com.mmall.util.JsonMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Map;@Slf4j public class HttpInterceptor extends HandlerInterceptorAdapter {private static final String START_TIME = "requestStartTime";@Overridepublic 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;}@Overridepublic 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);}@Overridepublic 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();;}} View Code?
4.在web.xml中配置過濾器
<filter><filter-name>loginFilter</filter-name><filter-class>com.mmall.filter.LoginFilter</filter-class> </filter> <filter-mapping><filter-name>loginFilter</filter-name><url-pattern>/sys/*</url-pattern><url-pattern>/admin/*</url-pattern> </filter-mapping>?
??
轉載于:https://www.cnblogs.com/coder-lzh/p/8667394.html
總結
以上是生活随笔為你收集整理的在当前进程下取得当前登陆用户的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二周第三次课(3月28日)
- 下一篇: layui d多文件上传