如何实现用户未登录不可访问系统

        在开发web系统时,如果用户不登录,发现用户也可以直接正常访问系统,这种设计本身并不合理,那么我们希望看到的效果是,只有用户登录成功之后才可以正常访问系统,如果没有登录则拒绝访问。那么我们可以使用过滤器或者拦截器进行实现,当前使用的方式是在spring boot框架中使用过滤器实现。

  1. 首先在SpringBoot启动类上加上注解@ServletComponentScan
  2. 创建自定义的过滤器LoginFilter,其中需要给登录接口放行。因为登录的用户信息存在session中,所以可以根据session的信息进行判断用户是否已经登录过系统
    1. package com.app.studypro.filter;
      
      import com.alibaba.fastjson.JSON;
      import com.app.studypro.common.ResultBean;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.util.AntPathMatcher;
      
      import javax.servlet.*;
      import javax.servlet.annotation.WebFilter;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      /**
       * 检查用户是否已经完成登录
       *
       * @author Administrator
       */
      @WebFilter(filterName = "loginFilter", urlPatterns = "/*")
      @Slf4j
      public class LoginFilter implements Filter {
          /**
           * 路径匹配器,支持通配符
           * ? 匹配一个字符。不能匹配目录:这个字符不能是代表路径分隔符的/.
           * * 匹配0到多个字符.
           * ** 匹配多级目录.
           */
          public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              // 定义不需要处理的请求路径,将登录请求路径排除在外
              String[] urls = new String[]{
                      "/users/login"
              };
              HttpServletRequest request = (HttpServletRequest) servletRequest;
              HttpServletResponse response = (HttpServletResponse) servletResponse;
              //1、获取本次请求的URI
              String requestURI = request.getRequestURI();
              log.info("拦截到请求:{}", requestURI);
      
              //2、判断本次请求是否需要处理
              boolean check = check(urls, requestURI);
      
              //3、如果不需要处理,则直接放行
              if (check) {
                  log.info("本次请求{}不需要处理", requestURI);
                  filterChain.doFilter(request, response);
                  return;
              }
      
              //4、判断登录状态,如果已登录,则直接放行
              Long userId = (Long) request.getSession().getAttribute("user");
              if (userId != null) {
                  log.info("用户已登录,用户id为:{}", userId);
                  filterChain.doFilter(request, response);
                  return;
              }
      
              log.info("用户未登录");
              //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
              // 解决响应中文乱码问题
              response.setCharacterEncoding("utf-8");
              response.getWriter().write(JSON.toJSONString(ResultBean.error("用户未登录")));
          }
      
          /**
           * 路径匹配,检查本次请求是否需要放行
           *
           * @param urls
           * @param requestURI
           * @return
           */
          public boolean check(String[] urls, String requestURI) {
              for (String url : urls) {
                  boolean match = PATH_MATCHER.match(url, requestURI);
                  if (match) {
                      return true;
                  }
              }
              return false;
          }
      
      }
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/161912.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

迪杰斯特拉算法(C++)

目录 介绍: 代码: 结果: 介绍: 迪杰斯特拉算法(Dijkstras algorithm)是一种用于计算加权图的单点最短路径的算法。它是由荷兰计算机科学家Edsger W. Dijkstra在1956年发明的。 该算法的思路是&#xf…

算法通关村——不简单的字符串转换问题

字符串转化整数(atoi) 1、题目描述 LeetCode8. 请你来实现一个myAtoi(String s)函数,使其能将字符串转换成一个32位有符号整数(类似C/C 中的atoi函数)。 函数myAtoi(String s) 的算法如下: 读入字符串并丢弃无用的前导空格。检…

Vue3 toRef函数和toRefs函数

当我们在setup 中的以读取对象属性单独交出去时,我们会发现这样会丢失响应式: setup() {let person reactive({name: "张三",age: 18,job: {type: "前端",salary:10}})return {name: person.name,age: person.age,type: person.jo…

OpenAI发布会中不起眼的重大更新

上周,OpenAI的历史首届开发者大会上,OpenAI的首席执行官山姆奥特曼展示了一系列产品更新,包含了众多重磅功能,就算单独拿出来都能让科技圈震一震,一下能发布这么多也真是家底厚。 果不其然,接下来的一周&am…

轻量服务器和云服务器的区别,轻量应用服务器和云服务器区别对比

在云计算时代,服务器作为互联网应用的基础设施,扮演着重要的角色。对于个人用户、个人开发者、学生用户和个人站长来说,选择一款适合自己的服务器是一个关键的决策。本文将介绍轻量服务器和标准云服务器的优点和应用场景,帮助读者…

内存模型以及如何判定对象已死问题

1.展示堆内存溢出 设置堆的内存大小为10M,最大的堆内存为10M,这两个参数最好一致,即便最大内存设置为1G,很有可能也分配不到1G。 -Xmx10M -Xms10M 一直往list放东西 public class T1 {public static void main(String[] args) …

基于 gin + websocket 即时通讯项目 (一、项目初始化)

基于 gin websocket 即时通讯项目 1、安装环境与初始化 搜索各种包官网 https://pkg.go.dev/ 1.1 安装 grom go get -u gorm.io/grom 1.2 安装 MySQL 驱动 go get -u gorm.io/driver/sqlite go get -u gorm.io/driver/mysql 1.3 安装 gin go get -u github.com/gin-gonic/gi…

Matlab绘制双坐标轴图示例函数yyaxis

一、前言 出于一些需求,我们需要将两个不同属性的参量绘制在同一张图上,但是两个参量属性不同,即单位不同,纵坐标值分布范围不同,此刻,我们只需要将一个参量的值在y轴左侧展示,另一个参量的值在…

buildadmin+tp8表格操作(1)----表头上方添加按钮和自定义按钮

buildAdmin 的表头上添加一些按钮&#xff0c;并实现功能 添加按钮 <template><!-- buttons 属性定义了 TableHeader 本身支持的顶部按钮&#xff0c;仅需传递按钮名即可 --><!-- 这里的框架自带的 顶部按钮 分别有 刷新 &#xff0c; 添加&#xff0c; 编辑&…

一文搞懂设计模式之代理模式

大家好&#xff0c;我是晴天&#xff0c;本周我们又见面了。本周有点发烧感冒&#xff0c;更文有点慢了&#xff0c;请大家见谅。言归正传&#xff0c;本周我们继续一起学习一文搞懂设计模式系列文章之代理模式。 什么是代理模式 我们先来看看 GoF 对代理模式的定义&#xff1…

异步任务线程池——最优雅的方式创建异步任务

对于刚刚从校园出来的菜鸡选手很容易写出自以为没问题的屎山代码&#xff0c;可是当上线后就会立即暴露出问题&#xff0c;这说到底还是基础不够扎实&#xff01;只会背八股文&#xff0c;却不理解&#xff0c;面试头头是道&#xff0c;一旦落地就啥也不是。此处&#xff0c;抛…

搭建mysql主从错误集合

1 mysqld --verbose --help --log-bin-index/tmp/tmp.Frnt2oibYI mysqld: Cant read dir of /etc/mysql/conf.d/ my.cnf是在/etc/mysql/conf.d/文件夹下&#xff0c;所以挂载的时候不要写/etc/mysql 2 COLLATION utf8_unicode_ci is not valid for CHARACTER SET latin1 配…

Linux系统编程学习 NO.9——git、gdb

前言 本篇文章简单介绍了Linux操作系统中两个实用的开发工具git版本控制器和gdb调试器。 git 什么是git&#xff1f; git是一款开源的分布式版本控制软件。它不仅具有网络功能&#xff0c;还是服务端与客户端一体的软件。它可以高效的处理程序项目中的版本管理。它是Linux内…

Flink(七)【输出算子(Sink)】

前言 今天是我写博客的第 200 篇&#xff0c;恍惚间两年过去了&#xff0c;现在已经是大三的学长了。仍然记得两年前第一次写博客的时候&#xff0c;当时学的应该是 Java 语言&#xff0c;菜的一批&#xff0c;写了就删&#xff0c;怕被人看到丢脸。当时就想着自己一年之后&…

WeTab--颜值与实力并存的浏览器插件

一.前言 现在的浏览器花花绿绿&#xff0c;有大量的广告与信息&#xff0c;令人目不暇接。有没有一款好用的浏览器插件可以解决这个问题呢&#xff1f;我愿称WeTab为版本答案。 WeTab的界面&#xff1a; 干净又整洁。最最关键的是还有智能AI供你服务。 这个WeTabAI就像chatgp…

Sam Altman 被罢免细节曝光,投资 100+ 公司或成「话柄」?

2022 年 11 月&#xff0c;ChatGPT 发布掀起 AI 狂潮。时隔 1 年&#xff0c;2023 年 11 月&#xff0c;ChatGPT 之父、Sam Altman 的一项人事巨变&#xff0c;再次掀起了一场 AI 界的风暴&#xff0c;只是这次并不是技术革命&#xff0c;而是 OpenAI 巨头换帅——Sam Altman 被…

高斯积分-Gaussian Quadrature

https://mathworld.wolfram.com/GaussianQuadrature.html

目标检测—YOLO系列(二 ) 全面解读复现YOLOv1 PyTorch

精读论文 前言 从这篇开始&#xff0c;我们将进入YOLO的学习。YOLO是目前比较流行的目标检测算法&#xff0c;速度快且结构简单&#xff0c;其他的目标检测算法如RCNN系列&#xff0c;以后有时间的话再介绍。 本文主要介绍的是YOLOV1&#xff0c;这是由以Joseph Redmon为首的…

Postman接收列表、数组参数@RequestParam List<String> ids

示例如下: 接口定义如下: GetMapping(value "/queryNewMoviePath")public List<Map<String, Object>> queryNewMoviePath(RequestParam List<String> ids ) {return service.queryNewMoviePath(ids);}postman中测试如下&#xff1a; http://loc…

linux、windows 查看java等进程占用资源情况

linux查看进程占用资源情况&#xff1a; top -o %MEM -b -n 1 | grep java | awk {print "PID: "$1" \t 虚拟内存: "$5" \t 物理内存: "$6" \t 共享内存: "$7" \t CPU使用率: "$9"% \t 内存使用率: "$10"%&…