实现登录拦截功能

1.4、实现登录拦截功能

温馨小贴士:tomcat的运行原理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当用户发起请求时,会访问我们像tomcat注册的端口,任何程序想要运行,都需要有一个线程对当前端口号进行监听,tomcat也不例外,当监听线程知道用户想要和tomcat连接连接时,那会由监听线程创建socket连接,socket都是成对出现的,用户通过socket像互相传递数据,当tomcat端的socket接受到数据后,此时监听线程会从tomcat的线程池中取出一个线程执行用户请求,在我们的服务部署到tomcat后,线程会找到用户想要访问的工程,然后用这个线程转发到工程中的controller,service,dao中,并且访问对应的DB,在用户执行完请求后,再统一返回,再找到tomcat端的socket,再将数据写回到用户端的socket,完成请求和响应

通过以上讲解,我们可以得知 每个用户其实对应都是去找tomcat线程池中的一个线程来完成工作的, 使用完成后再进行回收,既然每个请求都是独立的,所以在每个用户去访问我们的工程时,我们可以使用threadlocal来做到线程隔离,每个线程操作自己的一份数据

温馨小贴士:关于threadlocal

如果小伙伴们看过threadLocal的源码,你会发现在threadLocal中,无论是他的put方法和他的get方法, 都是先从获得当前用户的线程,然后从线程中取出线程的成员变量map,只要线程不一样,map就不一样,所以可以通过这种方式来做到线程隔离

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

拦截器代码

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       //1.获取session
        HttpSession session = request.getSession();
        //2.获取session中的用户
        Object user = session.getAttribute("user");
        //3.判断用户是否存在
        if(user == null){
              //4.不存在,拦截,返回401状态码
              response.setStatus(401);
              return false;
        }
        //5.存在,保存用户信息到Threadlocal
        UserHolder.saveUser((User)user);
        //6.放行
        return true;
    }
}

让拦截器生效

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 登录拦截器
        registry.addInterceptor(new LoginInterceptor())
                .excludePathPatterns(
                        "/shop/**",
                        "/voucher/**",
                        "/shop-type/**",
                        "/upload/**",
                        "/blog/hot",
                        "/user/code",
                        "/user/login"
                ).order(1);
        // token刷新的拦截器
        registry.addInterceptor(new RefreshTokenInterceptor(stringRedisTemplate)).addPathPatterns("/**").order(0);
    }
}

1.5、隐藏用户敏感信息

我们通过浏览器观察到此时用户的全部信息都在,这样极为不靠谱,所以我们应当在返回用户信息之前,将用户的敏感信息进行隐藏,采用的核心思路就是书写一个UserDto对象,这个UserDto对象就没有敏感信息了,我们在返回前,将有用户敏感信息的User对象转化成没有敏感信息的UserDto对象,那么就能够避免这个尴尬的问题了

在登录方法处修改

//7.保存用户信息到session中
session.setAttribute("user", BeanUtils.copyProperties(user,UserDTO.class));

在拦截器处:

//5.存在,保存用户信息到Threadlocal
UserHolder.saveUser((UserDTO) user);

在UserHolder处:将user对象换成UserDTO

public class UserHolder {
    private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>();

    public static void saveUser(UserDTO user){
        tl.set(user);
    }

    public static UserDTO getUser(){
        return tl.get();
    }

    public static void removeUser(){
        tl.remove();
    }
}

相关推荐

  1. Django 实现登录功能

    2024-03-25 17:14:01       15 阅读
  2. React实现登录授权功能

    2024-03-25 17:14:01       37 阅读
  3. SpringBoot+vue实现登录功能

    2024-03-25 17:14:01       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-25 17:14:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-25 17:14:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-25 17:14:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-25 17:14:01       18 阅读

热门阅读

  1. 宝塔部署项目

    2024-03-25 17:14:01       21 阅读
  2. nicerefresh--自动刷新Spring中@Value的值

    2024-03-25 17:14:01       15 阅读
  3. MySQL索引

    2024-03-25 17:14:01       14 阅读
  4. 蓝桥杯竞赛规则及说明【C/C++】

    2024-03-25 17:14:01       28 阅读
  5. GOF23种设计模式

    2024-03-25 17:14:01       19 阅读
  6. 稀碎从零算法笔记Day24-LeetCode:存在重复元素

    2024-03-25 17:14:01       18 阅读
  7. 记一次Qt多线程槽函数无法触发异常排查

    2024-03-25 17:14:01       18 阅读
  8. 2024蓝桥杯每日一题(树状数组)

    2024-03-25 17:14:01       16 阅读
  9. 渗透测试-ssh私钥泄露知识记录

    2024-03-25 17:14:01       15 阅读
  10. 【C++从0到1-黑马程序员】引用

    2024-03-25 17:14:01       19 阅读
  11. 开源与闭源语言模型的较量:技术分析

    2024-03-25 17:14:01       16 阅读
  12. 大数据安全分析相关与安全分析的场景

    2024-03-25 17:14:01       14 阅读
  13. IOS面试题编程机制 46-50

    2024-03-25 17:14:01       14 阅读