自定义拦截器(比如token校验的拦截器)

news/2024/11/26 4:41:30/

实现步骤:

一、自定义一个拦截器配置类,里面可以配置不同的拦截器,比如校验token的、校验权限的等,在里面可以设置拦截的路径和放行的路径等。
二、自定义注解(以校验token为例子,我自定义了@NotCheckToken这个注解,当控制层使用这个注解,表示放行,该接口不进行token的校验)
三、实现具体的拦截器,比如token校验的,你校验token的逻辑要写在这个类里面,具体的处理,preHandler方法表示进行拦截,然后判断是否使用@NotCheckToken注解, 没有使用这个注解则需要进行token校验。

具体实现

1、InterceptorConfig(拦截器配置类)

package com.lancoo.primaryedu.Interceptor;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @description: 自定义拦截器* @author: daiziru* @date: 2023/7/14 15:39* @param:* @return:**/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {/*** 配置拦截路径** @param registry 拦截器参考*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {// token 拦截所有请求,通过判断是否有 @NotCheckToken 注解 决定是否需要校验registry.addInterceptor(tokenInterceptor()) //添加需要的自定义拦截器.addPathPatterns("/**"); //对所有路径进行拦截}/*** token 拦截器注入** @return Token 拦截器*/@Beanpublic TokenInterceptor tokenInterceptor() {return new TokenInterceptor();}}

2、自定义注解NotCheckToken

package com.lancoo.primaryedu.Interceptor;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 自定义 Token 校验注解* @author pky*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotCheckToken {boolean required() default true;
}

3、token具体的拦截器

package com.lancoo.primaryedu.Interceptor;import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.util.StringUtil;
import com.lancoo.common.exception.MyException;
import com.lancoo.common.respone.StatusCode;
import com.lancoo.common.utils.JsonUtil;
import com.lancoo.primaryedu.entity.net.BasePlatOutBean;
import com.lancoo.primaryedu.entity.net.NetUtil;
import com.lancoo.primaryedu.entity.net.OutCome;
import com.lancoo.primaryedu.entity.net.RequestResponse;
import com.lancoo.primaryedu.util.CommonUtil;
import com.lancoo.primaryedu.util.TokenUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpStatus;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;/*** Token 拦截器* @author pky*/
@Slf4j
public class TokenInterceptor implements HandlerInterceptor {@Autowiredprivate TokenUtil tokenUtil;@Autowiredprivate Environment environment;/*** @description: 通过检查是否有@NotCheckToken注解,决定是否进行token校验* @author: daiziru* @date: 2023/7/14 15:31* @param: [request, response, object]* @return: boolean**/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {// 从 http 请求头中取出 tokenString token = CommonUtil.handleHeader(request).getToken();if(null == token || "".equals(token)) {throw new MyException(StatusCode.REMIND, "请求头中不存在token或token不正确!");}// 如果不是映射到方法直接通过if (!(object instanceof HandlerMethod)) {return true;}HandlerMethod handlerMethod = (HandlerMethod) object;Method method = handlerMethod.getMethod();
//         检查用户权限的注解if (method.isAnnotationPresent(NotCheckToken.class)) {NotCheckToken notCheckToken = method.getAnnotation(NotCheckToken.class);if (notCheckToken.required()) {return true;}}return checkToken(request, token);}/*** 校验 token** @param request 请求* @param token   令牌* @return 校验结果,true/通过;false/不通过* @throws Exception 可能出现的异常*/private boolean checkToken(HttpServletRequest request, String token) throws Exception {if (null == token) {token = "";}String ADDR = "/UserMgr/Login/Api/Login.ashx";String yunAddr = environment.getProperty("base.addr");String SysID = environment.getProperty("sys.id");Map<String, String> form = new HashMap<>();form.put("method", "TokenCheck");form.put("token", token);form.put("params", SysID + "|");String result = "";RequestResponse response = NetUtil.postForm(checkBaseUr(yunAddr) + ADDR, form);OutCome<BasePlatOutBean<BasePlatOutBean.BasePlatLoginOutDataBean>> outCome = new OutCome<>();if (response.isSuccessful) {if (!StringUtil.isEmpty(response.Data)) {result = response.Data;}}if (!result.equals("")) {//解析下json字符串Map<String, String> keyValue = new JsonUtil().getKeyValue(result);String re = keyValue.get("result");if (re == null) {return false;}if (re.equals("true")) {return true;}}return false;}public String checkBaseUr(String url) {if (url.endsWith("/")) {return url;}return url + "/";}}

http://www.ppmy.cn/news/877633.html

相关文章

程序员如何制作PPT?

有道无术&#xff0c;术尚可求也&#xff1b;有术无道&#xff0c;止于术。大家好&#xff0c;我是程序员雪球&#xff0c;今天让我们一起探讨如何从零开始制作高质量的 PPT。 上周&#xff0c;领导要求我撰写一份关于 4到6月持续集成运营分析的报告&#xff0c;并通过 PPT 的形…

android 模拟器 itools,itools安卓模拟器

itools安卓模拟器是itool官方开发的一款安卓模拟器,itools安卓模拟器功能强性能好,完美兼容低配电脑流畅运行;支持多开帐号,鼠键结合,手游玩家能够在电脑上感受极致的游戏体验。 相关软件软件大小版本说明下载地址 itools安卓模拟器是itool官方开发的一款安卓模拟器,itoo…

法新社:谷歌Android成为CES展会明星 微软Windows遭冷落

谷歌在星期日闭幕的CES展会上也许没有展出任何设备&#xff0c;但是&#xff0c;谷歌同样感受到了它的存在。在一个平板电脑为王的展会上&#xff0c;谷歌的Android操作系统是王储。摩托罗拉移动的Xoom平板电脑成为这次CES展会的最佳产品。Xoom就采用了谷歌专门为触控屏设计的代…

[Pro.android.3][读书笔记]Android 01 Android简介 连载

转自http://blog.163.com/wangli_601/blog/static/122950173201162411490673/ 计算机一直在变的更易用、更人性化。手持设备也已经朝着智能设备发生了巨大的变化。移动电话不在只是通讯工具&#xff0c;它们已经有能力传输数据和视频。但是现在例如手机&#xff0c;平板设备或…

显示屏驱动相关的基础知识

做Android显示屏驱动,你必须对显示屏的一些基本知识有一定的了解,才能更容易编写其驱动代码! LCD的接口类型大致有:SPI/I2C/MCU/CPU/RGB/MDDI/MIPI,SPI/I2C用于低速黑白屏,MCU/CPU/RGB为并口,在智能机之前的功能机上用的多,手机进入到大屏时代后,并口的传输速度跟不上…

It’s Android Time——Google Android创赢路线与产品开发实战

本文节选于电子工业出版社推出的《It’s Android Time——Google Android创赢路线与产品开发实战》一书。 第15章 你真的准备好了吗 15.1 Android 战场上的人们 15.1.1 中国Android事业的发展 1. 中国大陆的Android事业发展 中国大陆的Android事业发展未能赶上世界的步伐…

如何在笔记本电脑上搭建双系统(windows与linux)

搭建windows与linux并行的双系统(不需要U盘与光驱) 快要月底了&#xff0c;来上一篇博客吧~。Android端进展不高&#xff0c;写写如何搭建双系统吧&#xff01;电脑的的配置是&#xff1a;华硕A455L笔记本&#xff0c;8G内存&#xff0c;一个128G的固态&#xff0c;500G机械硬…

我是如何走上Android开发的道路的

2012年经历了所谓人生中的一件大事——高考&#xff0c;然后进入了一间2A学校&#xff0c;并阴差阳错的被调剂到了隶属于计算机学院的网络工程专业。上了大学拥有了人生中第一部手机——小米1&#xff0c;拥有了人生中的第一部笔记本——华硕。作为一个来自农村的孩子&#xff…