springboot配置拦截器,实现用户未登录不能访问其他页面

news/2025/10/19 13:22:43/文章来源:https://www.cnblogs.com/smfx1314/p/19150757

技术说明:

springboot:2.1.4.RELEASE
jQuery
Ajax
mysql:8.0.32

业务背景:

当我们没有登录的时候,如果访问其他页面,那就会造成信息泄露。所以,当用户没有登录的时候,访问其他页面的时候,必须自动跳转到用户登录页面

登陆页面

我们先弄个前端,实现一个用户登录页面,代码如下:

             <form id="loginForm"><div class="form-group"><label for="username" class="block text-sm font-medium text-gray-700 mb-1">账号</label><input type="text" id="username" class="form-control" placeholder="请输入您的账号" required></div><div class="form-group"><label for="password" class="block text-sm font-medium text-gray-700 mb-1">密码</label><input type="password" id="password" class="form-control" placeholder="请输入您的密码" required><i class="fas fa-eye password-toggle" id="togglePassword"></i></div><button type="submit" id="signinSubmit" class="btn-login mt-4"><i class="fas fa-sign-in-alt mr-2"></i>用户登录</button></form>

给用户登录按钮做个单机时间,当用户点击的时候,获取输入框的值,传递给后端校验

        $('#signinSubmit').click(function(){if($('#username').val() === ''){alert('用户名不能为空');}else if($('#password').val() === ''){alert('密码不能为空');}$.ajax({type:"get",url:"http://47.115.220.14:8081/user/login",xhrFields: {withCredentials: true},async:false,data:{"username":$("#username").val(),"password":$("#password").val()},success:function (result) {if (0 === result.code){alert("登录成功");//跳转到后台主页window.location="main.html";}else {alert("登录失败,请核实用户名密码");}}})});

后端校验代码,接收/login登陆请求

    @RequestMapping("/login")@ResponseBodypublic CommonReturnType login(@RequestParam("username") String username,@RequestParam("password") String password,HttpSession session){//比对加密后的密码是否一致String md5Password = MyMD5Util.md5Password(password);UserAndPassword userAndPassword = userService.login(username);if (userAndPassword.getAccountSwitch() == 1){//如果状态为1,说明账号开启,然后执行密码匹配if (md5Password.equals(userAndPassword.getPassword())){session.setAttribute("username",userAndPassword.getUsername());session.setAttribute("state",userService.selectStateByUserName(username));return CommonReturnType.success();}}return CommonReturnType.fail("用户名或密码不正确");}

如上代码,我们加入session会话管理,当用户登录的时候,获取用户的名称username,把这个用户名username交给session管理,那后续的任何操作,我们只要判断session会话中有没有这个用户名username即可,如果username为空,那就说明用户没有登录,此时跳转到登陆页面。

同理,也可以设置一个state状态,如果没有这个状态,我们可以判断不是管理员,可以限制对应的权限,比如不能删除等

那我们默认把所有页面都拦截,除了登陆页面,和管理员登录页面除外。默认只能登录,因为只有登录了,才能创建session会话,把username交给session管理。后续才能获取session中的username。

实现拦截器,拦截所有页面(排除用户登录,管理员登录页面)

创建一个拦截器

public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 在控制器处理方法调用之前执行HttpSession session = request.getSession();// 例如,获取或设置会话属性String username = (String) session.getAttribute("username");//System.out.println(username);if (username == null) {// 如果用户未登录,重定向到登录页面response.sendRedirect("/");return false; // 阻止控制器方法执行}return true; // 允许控制器方法继续执行}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 在控制器方法执行之后,但渲染视图之前执行}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 在整个请求完成后执行,无论是否发生异常}
}

如上,创建了一个拦截器,实现拦截器接口,重载了拦截器三个方法,拦截前,拦截中,拦截后,可以在对应方法中处理某些事情。我们这里很简单,直接在拦截器前拦截所有请求,看看有没有session会话的username,如果没有就返回index.html登陆页面。如果有,就释放拦截。如果拦截前找不到会话,那就重定向到登陆页面

拦截器创建好之后,还不能用,我们要注册拦截器,加入到springboot管理中。

注册拦截器

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**","/**/*","/*.html")  // 指定拦截的路径模式.excludePathPatterns("/index.html","/login-manager.html","/","/user/login","/user/manager/login","/exitlogin","/**/*.js","/**/*.css","/**/*.jpeg","/**/*.jpg"); // 排除的路径模式}
}

如上,在注册拦截器类中,制定要拦截的请求,以及排除要拦截的文件类型,记住,把静态文件如js,jpg,css等排除掉,不然全部拦截了,就加载不出来页面了。另外排查登陆页面,不然怎么登陆啊

以上就可以了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025卫衣厂家口碑推荐:COVERNAT乐酷天品质卓越,时尚舒适首选!

2025卫衣厂家口碑推荐:COVERNAT乐酷天品质卓越,时尚舒适首选!随着时尚潮流的不断演变,棒球帽、卫衣和羽绒服等休闲服饰在市场上的需求日益增长。然而,这些产品在设计、材料和质量管控方面面临着诸多挑战。本文将深…

岐金兰AI元人文构想的系统化研究:理论创新与实践挑战

岐金兰AI元人文构想的系统化研究:理论创新与实践挑战 引言 随着人工智能技术的快速发展,AI伦理问题已成为学术界和产业界关注的焦点。传统"价值对齐"方法在应对复杂人类伦理体系时面临诸多挑战,技术决定论…

2025年兄弟机床维修厂家推荐排行榜,专业维修与高效服务口碑之选!

2025年兄弟机床维修厂家推荐排行榜,专业维修与高效服务口碑之选!随着制造业的快速发展,兄弟机床作为高精度、高性能的加工设备,在全球范围内得到了广泛应用。然而,机床在长期使用过程中难免会出现各种故障,选择一…

第二章博客

1.要找到第k小的数,只需要将所有的元素从小到大进行排序,找到排序后第k位置上的数即可。在排序算法中,假设采取归并排序的方式,就可以通过分治思想来达到排序的目的。首先先定义left和right两个指针,分别指向要排…

2025年工作服厂家推荐排行榜,防静电/劳保/国网/餐厅/工厂/电工/防酸碱/电力/车间/航空/员工/文化衫/T恤/POLO衫/冲锋衣工作服公司推荐!

2025年工作服厂家推荐排行榜:防静电/劳保/国网/餐厅/工厂/电工/防酸碱/电力/车间/航空/员工/文化衫/T恤/POLO衫/冲锋衣工作服公司推荐随着各行各业对工作服需求的不断增长,选择一家可靠的工作服生产厂家变得尤为重要…

2025年气泡膜机厂家推荐排行榜,气泡膜制袋机,高速气泡膜机,全自动气泡膜机,复合气泡膜机,小型气泡膜机公司精选!

2025年气泡膜机厂家推荐排行榜:气泡膜制袋机、高速气泡膜机、全自动气泡膜机等公司精选随着电子商务和物流行业的快速发展,气泡膜及其相关设备的需求日益增长。为了满足市场对高质量气泡膜及制袋机的需求,众多厂家纷…

深入解析:《Gdb 调试实战指南:不同风格于VS下的一种调试模式》

深入解析:《Gdb 调试实战指南:不同风格于VS下的一种调试模式》pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

10 个常见的Python 错误及如何避免它们

Python 是一种非常灵活且强大的编程语言,但即使是经验丰富的开发者也可能会犯一些常见的错误。了解这些错误及其解决方法可以帮助你更高效地编写代码,减少调试时间。今天,就让我们一起看看 10 个常见的 Python 错误…

2025年手持光谱仪/光谱分析仪/便携式光谱仪厂家推荐榜单:矿石/元素/合金/贵金属分析利器,赛普斯/IF光谱仪精选!

2025年手持光谱仪/光谱分析仪/便携式光谱仪厂家推荐榜单:矿石/元素/合金/贵金属分析利器,赛普斯/IF光谱仪精选!随着科技的不断进步和工业需求的日益增长,手持光谱仪/光谱分析仪/便携式光谱仪在矿石、元素、合金、贵…

平铺窗口合成器杂谈

玩linux 有4-5年了,今天来简单梳理一下linux上我用过的一些平铺窗口合成器,也顺便说一下最近先换的一个合成器--niri 和平铺窗口绑定最多的标签就是 -- “效率提升”,“增加屏幕利用率”,我最初可能就是应为这些标…

微信公众号文章插入附件详细教程-适合于招聘,报名表,公告公示等

在公众号推文插入文档附件链接,是一个很实用的技巧,如果各位童鞋还没有掌握,可以跟着下面步骤学习一下,非常简单。 可用于推文插入添加招聘信息、申请表、登记表、报名表、大赛通知、公示名单、抽签结果、招标公告…

题解:P10514 考试

Solution 对于第 \(i\) 道题,\(k\) 个随机选中的同学全部答对的概率为: \[P_i = \frac{\binom{n - a_i}{k}}{\binom{n}{k}} \]由于题目相互独立,总概率为: \[P = \prod_{i=1}^{m} P_i = \prod_{i=1}^{m} \frac{\bi…

华为昇腾笔记之Mindspeed-LLM 中 MoE 实现机制与重写逻辑总览

🧩 Mindspeed-LLM 的 MoE 实现机制与重写逻辑总览 Mindspeed-LLM 基于 Megatron-Core 的 MoE 框架,在运行前通过一系列 Monkey Patch / Wrapper 注册, 将 Megatron 的核心 MoE 模块(Experts 层、Router 路由层、通…

题解:P12037 [USTCPC 2025] 数学分析

Solution 1. 记号 记 \[I_i = \int^1_0\frac{x^i}{x^2 + 1}\,dx \]则易得 \[\begin{align*} I_0 &= \frac{\pi}{4} \\ I_1 &= \frac{\ln 2}{2} \end{align*} \]\(I_i\) 这个式子不好直接积分,我们想办法化成我…

实时时序上下文推荐系统获KDD最佳论文奖

某中心研究人员在KDD会议上荣获最佳论文奖,论文提出了一种实时时序上下文推荐技术,能自适应追踪用户偏好变化,有效解决冷启动问题,并支持百万级商品目录的高效推荐。实时时序上下文推荐系统获KDD最佳论文奖 在ACM知…

题解:CF1010A Fly

Solution 实数二分板题。 以下字母含义与题面中相同。 注意到答案具有单调性,所以可以二分,即对现在火箭燃料的重量 \(t\) 二分。那 check() 函数怎么写呢? 设 \(sum\) 表示现在火箭的载重,\(t\) 表示现在火箭燃料…

2025年精密磨床/CNC机械加工厂家推荐排行榜,覆盖铣床/车床/磨削/多轴/复合加工,专业非标定制服务首选!

2025年精密磨床/CNC机械加工厂家推荐排行榜,覆盖铣床/车床/磨削/多轴/复合加工,专业非标定制服务首选!随着制造业的快速发展和技术进步,精密磨床和CNC机械加工已成为现代工业不可或缺的重要组成部分。这些设备不仅…

题解:CF1914F Programming Competition

Description 给定一棵树,求不互为祖先的点对的最大个数。 Solution 考虑树形 DP。 设 \(dp_u\) 表示根节点为 \(u\) 的子树的答案。 分类讨论: 设根节点 \(u\) 的重儿子为 \(v\)。当 \(size_v \le \lfloor \frac{siz…

独立开发者找蓝海:新词引流实战

SEO 新词能赚钱(收入/下载) + 很痛(评论密集) + 新(窗口期) = 进入!### 方法论底座:别再“我想做 → 找人 → 没人要”应该是 **Audience → Problem → Product**- 先定人:谁在求助、在哪发声? - 再拆问题:…

使用云服务器搭建飞牛Frp 内网穿透服务

本文将详细指导您如何使用阿里云轻量应用服务器上的宝塔面板搭建 Frp 服务端 (frps),并通过 Feiniu OS 客户端搭建 Frp 客户端 (frpc),实现内网穿透。 一、准备一台有公网 IP 的服务器 (FRPS 服务端搭建) 为了确保穿…