这个也是一个工具类

场景:比如说我们需要在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

在当前进程下取得当前登陆用户相关推荐

  1. linux下抓管理员hash,Linux下抓取登陆用户密码神器mimipenguin

    windows下有Mimikatz,现在linux下有了mimipenguin,国外安全研究员huntergregal发布了工具mimipenguin,一款Linux下的密码抓取神器,弥补了Linux ...

  2. Linux运行cat进程,linux下如何使用某个用户启动某个进程?

    安全里有个原则,叫最小权限原则python 根据这个原则,对于启动某个应用或者进程,应该赋予其最小权限,根据应用权限要求,建立一个相应权限的用户,赋予其应用相应的权限,而后使用这个用户启用这个应用li ...

  3. Oracle的基本练习:登陆、查看连接、管理登陆用户、修改进程数

    练习: 以数据库管理员身份登录Oracle数据库 sqlplus sys/Syl12345 as sysdba 查看有哪些用户连接到数据库 desc v$session; select sid,ser ...

  4. CentOS下查看已经登录用户并踢出的方法

    CentOS下查看已经登录用户并踢出的方法 Linux 是个多用户系统,一旦连接到网络中,它可以同时为多个登录用户提供服务. 系统管理员可以随时了解系统中有那些用户,用户都在进行什么操作. 查看用户的 ...

  5. linux 用户shell 无效,浅谈Linux环境下,为什么设置用户ID位对shell脚本无效

    前言: 博主在前不久的一个项目中,项目组的组员需要删除由daemon守护进程创建的缓存文件.但是删除这些缓存文件需要超级用户权限.博主用root用户创建了一个设置用户id的shell脚本来实现此功能. ...

  6. Linux的init进程(内核态到用户态的变化)

    init进程,也就是内核启动3个进程中的进程1: init进程完成了从内核态向用户态的转变: (1)init进程是比较特殊,一个进程两个状态,init刚开始运行时是内核态,他属于内核线程,然后他自己运 ...

  7. ubuntu root下的无密码登陆

    2019独角兽企业重金招聘Python工程师标准>>> 以前都是两台机器在普通用户之间无密码登陆,今天两台机器都是root下配置无密码登陆,方法很简单,写下过程: 注:以root下节 ...

  8. linux下 mysql 的root用户忘记密码解决方案

    一. MySQL密码的恢复方法之一 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 ...

  9. 从微信服务器获取用户信息,微信小程序Ⅴ [获取登陆用户信息,重点openID(详解)]...

    ♩ 背景 其实这篇文章几个月前就写完了,可是这段时间,微信小程序官方文档有了更新,同事在我本身的实际操做过程当中,发现以前写的过于繁杂,因此如今进行简化梳理,欢迎指摘. 语言框架:ThinkPHP3. ...

最新文章

  1. python 字符串按指定分隔符分割
  2. Linux下通过PXE服务器安装Linux系统
  3. 一个很棒的PHP缓存类,收藏下
  4. 判断数组有哪些方法,100%准确的方法
  5. 目标文件里面到底有什么(1)?
  6. 计算机安装调试的专业名称,【注意】计算机安装调试维修员国家职业标准
  7. PHP7+Swoole/Nginx/Golang性能对比
  8. jenkins 插件目录_三十二张图告诉你如何用Jenkins构建SpringBoot
  9. 交互规则_您必须永不中断的10条交互设计规则
  10. Leetoce--572. 另一个树的子树(java)
  11. servlet的url-pattern匹配规则详细描述
  12. 用mysql创建图书信息表_数据库创建图书管理系统
  13. PDF编辑器是怎么使用的
  14. js生成二维码并下载、批量生成二维码和压缩下载
  15. 分区助手合并移动硬盘分区后,无法访问的解决方法
  16. Asp.net 简单的站内搜索引擎
  17. 易语言MYSQL记账工具_易语言做记账软件
  18. onblur事件不支持冒泡的解决办法
  19. 题目:身份证录入系统 一、语言和环境 a)实现语言Java, 使用Android开发环境实现《身份证录入系统》APP。具体要求如下: 打开应用后,显示效果如图-1所示:
  20. 【已开源】mtcnn_pytorch完美复现

热门文章

  1. SpringMVC:学习笔记(4)——处理模型数据
  2. Apache下PHP的几种工作方式
  3. Java--23种设计模式之decorator模式
  4. 线性回归——lasso回归和岭回归(ridge regression)
  5. ASP.NET的票据工具类FormsAuthenticationTicket
  6. centos7下 vsftpd初使用
  7. 夺命雷公狗---linux NO:22 linux下的yum安装的高级配置
  8. JS获取鼠标位置,兼容IE FF
  9. js和 jquery对象
  10. xhtmlConformance mode=Legacy/ 致ajax失效