【Java Web】用拦截器的方式获取用户信息

流程:从cookie中获取凭证,根据凭证查询用户,并在本次请求中持有用户,在视图模板上显示登录用户的信息。

1. 定义拦截器

package com.nowcoder.community.controller.Interceptor;import com.nowcoder.community.entity.LoginTicket;
import com.nowcoder.community.entity.User;
import com.nowcoder.community.service.UserService;
import com.nowcoder.community.util.CookieUtil;
import com.nowcoder.community.util.HostHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;@Componentpublic class LoginTicketInterceptor implements HandlerInterceptor {@Autowiredprivate UserService userService;@Autowiredprivate HostHolder hostHolder;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 从cookie中获取凭证String ticket = CookieUtil.getValue(request, "ticket");if(ticket != null){  // 已经登陆LoginTicket loginTicket = userService.findLoginTicket(ticket);// 检查ticket是否有效if(loginTicket != null && loginTicket.getExpired().after(new Date()) &&loginTicket.getStatus()==0){// 根据凭证查询用户User user = userService.findUserById(loginTicket.getUserId());// 在本次请求中持有用户hostHolder.setUsers(user);}}return true;}// 在模板引擎之前使用user,将user放到model里@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {User user = hostHolder.getUser();if(user != null && modelAndView != null){modelAndView.addObject("loginUser",user);}}// 在模板引擎启动后清掉threadlocal,防止内存泄露@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {hostHolder.clear();}
}

2. 配置拦截器

package com.nowcoder.community.config;import com.nowcoder.community.controller.Interceptor.AlphaInterceptor;
import com.nowcoder.community.controller.Interceptor.LoginTicketInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configurationpublic class WebMvcConfig implements WebMvcConfigurer {@Autowiredprivate AlphaInterceptor alphaInterceptor;@Autowiredprivate LoginTicketInterceptor loginTicketInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 通过重写addInterceptors()方法,可以配置拦截器,对请求进行预处理或后处理。registry.addInterceptor(alphaInterceptor).excludePathPatterns("/**/*.css", "/**/*.js", "/**/*.png", "/**/*.jpg", "/**/*.jpeg").addPathPatterns("/register","/login");registry.addInterceptor(loginTicketInterceptor).excludePathPatterns("/**/*.css", "/**/*.js", "/**/*.png", "/**/*.jpg", "/**/*.jpeg");}
}

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

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

相关文章

MyBatis-Plus的公共字段自动填充

文章目录 1. 在实体类的相应属性上添加TableField注解2. 自定义元数据对象处理器3. 为了解决对象处理器MyMetaObjecthandler 获取不到外界数据的情况 1. 在实体类的相应属性上添加TableField注解 package com.itheima.reggie.entity;import com.baomidou.mybatisplus.annotati…

docker 搭建私有仓库和制作镜像

目录 1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 1.1 启动mysql镜像 1.2 启动owncloud镜像 1.3 浏览器访问 1.4 总结 2、安装搭建私有仓库 Harbor 2.1 下载docker-compose并赋予执行权限 2.2 磁盘挂载,保存harbor 2.3 修改配置文件…

4G WiFi LoRa无线外夹式超声波管道流量计MQTT/http协议 json数据说明

ip:114.128.112.131 port:1883 uname:scwl_flowmeter pwd:b123 topic:iot/data/scwlflowmeter { “deviceId”:“设备序列号”, “flow”:“瞬时流量(浮点数)”, “heatFlow”:“瞬时热流量&am…

Docker技术--Docker容器管理

1.Docker容器相关的指令(单个容器操) 我们之前在Docker中部署了一个实际应用的案例wordpress,其中使用到了一些相关于容器的指令,那么下面我们一起来总结使用。 Docker指令的语法规则如下所示: Docker + 命令关键字 [+参数选项] -1类:关闭、开启、重启、开启自启 systemct…

mysql问题处理大全

mysql问题处理大全 一:mysql中文乱码问题: 解决一次问题 show variables like “%chara%” character_set_client 为客户端编码方式; character_set_connection为建立连接使用的编码方式; character_set_database为数据库的编码…

Web 自动化神器 TestCafe—页面高级操作篇

♥ 前 言 在【Web 自动化神器 TestCafe — 页面基本操作篇】这篇文章中我们介绍了TestCafe页面交互的一些基本使用 Web 自动化神器 TestCafe — 页面基本操作篇 这篇文章接着上一篇来给大家介绍一下 TestCafe 页面交互的一些高级操作。 一、鼠标拖拽 鼠标拖拽鼠标拖拽 …

枚举分片容错性动态扩展

枚举分片之前的《mycat字符串枚举分片示例》中已经介绍过。 使用这种分片策略之后碰到了一个问题: 场景: 使用连锁店的店铺编号枚举分片(第1至第100分布店分在第一个分片,第101至第250分店),全国的连锁店会…

JavaScript常见的运算符

一、运算符和运算元 1.认识运算符 在小学的时候我们就学习了各种运算符,比如加号 、乘号 *、减号 - 、除号/ 几乎所有的编程语言都有各种各样的运算符(也被称之为操作符,operators) 初次接触这些运算符, 你会感觉种类繁多, 难以记忆.但是并不需要特别…

Kotlin判断null比较let布尔值Boolean

Kotlin判断null比较let布尔值Boolean class MyData {val count: Int? 2023val number: Int? null }fun main(args: Array<String>) {val data MyData()val year 2022if (data.count ! null) {if (data.count > year) {println("data.count ! null")}}…

CSS 盒子模型

前言 盒子模型-组成 CSS盒子模型是一种用来描述元素在页面布局中占据空间的模型。它将每个元素看作由内容区域、内边距、边框和外边距组成的一个矩形框。 盒子模型的组成部分包括&#xff1a; 内容区域&#xff08;Content&#xff09;&#xff1a;显示元素的实际内容&#xf…

无涯教程-Android - Frame Layout函数

Frame Layout 旨在遮挡屏幕上的某个区域以显示单个项目&#xff0c;通常&#xff0c;应使用FrameLayout来保存单个子视图&#xff0c;因为在子视图彼此不重叠的情况下&#xff0c;难以以可扩展到不同屏幕尺寸的方式组织子视图。 不过&#xff0c;您可以使用android:layout_grav…

Axure RP 8.1.0.3400(原型设计工具)

Axure RP 8是一款原型设计工具&#xff0c;它提供了丰富的功能和工具&#xff0c;帮助用户创建高质量的网页、移动应用和桌面软件原型。以下是Axure RP 8的一些特色介绍&#xff1a; 强大的交互设计&#xff1a;Axure RP 8支持创建复杂的动画和过渡效果&#xff0c;让你的原型更…

2023 js逆向爬虫 有道翻译 代码

前置条件&#xff1a;nodejs环境、安装 crypto 和 python3环境 js.js文件&#xff1a; const crypto require("crypto")function decode(resp_data) {g_o ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHlg_n ydsecre…

微信短链跳转到小程序指定页面调试

首先说下背景&#xff1a;后端给了短链地址&#xff0c;但是无法跳转到指定页面。总是在小程序首页。指定的页面我们是h5页面。排查步骤如下&#xff1a; 1、通过快速URL Scheme 编译。上部普通编译 下拉找到此选项。 、 2、按照小程序的要求的URL Scheme输入。另外后端给的…

Redis7之介绍(一)

1. 是什么 Redis:REmote Dictionary Server(远程字典服务器&#xff09; Remote Dictionary Server( 远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的Key-Value数据库提供了丰富的数据结构&#xff0c;例如String、Hash、List、…

PlantUML文本绘制类图

记录下文本绘制类图的语法 参考 https://juejin.cn/post/6844903731293585421 类的UML表示 使用UML表示一个类&#xff0c;主要由三部分组成。类名、属性、方法。其中属性和方法的访问修饰符用 - 、# 、 表示 private、protected、public。 如图所示&#xff0c;表示A类有一个…

Unity3D 2021 使用 SharpZipLib 遇到的安卓打包 I18N 相关问题

在 Unity3D 中&#xff0c;使用 ICSharpCode.SharpZipLib.dll 来做压缩和解压缩&#xff0c;但打包安卓后遇到问题&#xff0c;原因是字符编码程序集被裁减掉了导致。 根据网上搜索&#xff0c;将 UnityEditor 对应目录下的 I18N开头的&#xff0c;比如 I18N.CJK.dll 等系列文…

筑牢数据隐私安全底线,ADSCOPE通过ISO隐私信息管理体系认证!

数字时代&#xff0c;信息安全尤其是数据隐私信息保护已经成为社会共识。近日&#xff0c;ADSCOPE&#xff08;上海倍孜网络技术有限公司&#xff09;已通过相关组织机构评审&#xff0c;符合ISO/IEC 27701&#xff1a;2019标准&#xff0c;获得隐私信息管理体系认证证书&#…

在Linux系统上使用Nginx作为图片服务器

在Linux系统上使用Nginx作为图片服务器的步骤如下&#xff1a; 1. 关闭防火墙和Selinux&#xff1a; # 临时关闭防火墙 sudo systemctl stop firewalld.service# 永久关闭防火墙 sudo systemctl disable firewalld.service# 临时关闭SELinux setenforce 0# 永久关闭SELinux sud…

Django基础5——ORM中间程序

文章目录 一、基本了解二、ORM基本操作2.1 连接数据库2.1.1 使用sqlite数据库2.1.2 使用MySQL数据库 2.2 对数据库操作2.2.1 增&#xff08;前端数据——>数据库&#xff09;2.2.2 查&#xff08;数据库——>前端展示&#xff09;2.2.3 改&#xff08;修改数据&#xff0…