日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在当前进程下取得当前登陆用户

發布時間:2025/6/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在当前进程下取得当前登陆用户 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這個也是一個工具類

場景:比如說我們需要在controller或者service或者dao層用到當前登陸人的信息。我們之前的做法,肯定是從session中取出來。然后哪里需要傳哪里。這樣很麻煩。這時候我們需要造一個工具類。目的是在任何地方都能獲取到當前登陸人的信息。

?

在這里我們要用到一個對象??ThreadLocal? 這個對象 這個類相當于一個map,但是這個類的key是當前的進程。所以說,一個這樣類只能放一個對象。這里要注意一下。

為什么要用這樣的一個類呢?因為這個類的特性,每個進程的是完全隔離的,避免高并發情況下發生一些錯誤(我也不知道啥錯誤,反正就是防止高并發,這個坑回來再填!!!ToDo~~)

?

1.RequestHolder.java
package 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.java

package 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

總結

以上是生活随笔為你收集整理的在当前进程下取得当前登陆用户的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。