自定义注解

简介: 本文介绍Java自定义注解的实现原理与应用,结合Spring AOP和过滤器完成日志、权限控制及登录验证。通过@Target、@Retention等元注解定义注解,并在控制器中通过拦截器解析,实现如无需登录访问等功能,提升代码可读性与复用性。(239字)

1.前言自定义注解目前在我使用过的项目中,主要用用作日志丰富,参数处理,其核心还是借助于Spring的AOP进行实现,本文将结合具体代码演示简单的自定义注解实现流程。2.实现2.1 定义User

2.2 定义UserDAO2.3 定义UserService2.4 定义Controller此时浏览器访问:http://{domain}/user/1即可出现对应效果2.5 定义自定义注解说明:@interface 不是interface,是注解类  定义注解Documented这个Annotation可以被写入javadoc  @Retention修饰注解,是注解的注解,称为元注解SOURCE,     // 编译器处理完Annotation后不存储在class中   CLASS,       // 编译器把Annotation存储在class中,这是默认值   RUNTIME  // 编译器把Annotation存储在class中,可以由虚拟机读取,反射需要 @Target注解的作用目标@Target(ElementType.TYPE)                                           //接口、类、枚举、注解@Target(ElementType.FIELD)                                         //字段、枚举的常量@Target(ElementType.METHOD)                                   //方法@Target(ElementType.PARAMETER)                              //方法参数@Target(ElementType.CONSTRUCTOR)                        //构造函数@Target(ElementType.LOCAL_VARIABLE)                     //局部变量@Target(ElementType.ANNOTATION_TYPE)                //注解@Target(ElementType.PACKAGE)                                 //包    可以定义多个方法,每个方法在使用时参照下面的Controller使用即可,实际就是类似于@PostMapping这样的注解中使用过的value,method,produces等,如下:2.6 AOP+Controller使用自定义注解3.总结自定义注解其核心是借助于:@Target 和 @Rentention,@Documented组合实现,其实现还是需要依赖于Spring的AOP进行具体体现,除了上面的用作日志拦截,还可以自定义:数据验证注解,权限注解,缓存注解等多种用途,但其实现基本都遵循上述步骤。4.自定义注解+过滤器实现登陆相关4.1 定义自定义注解@Login4.2 过滤器匹配

Java

运行代码复制代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

package com.zhicall.majordomo.core.security.interceptor;


import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.util.Map;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.web.method.HandlerMethod;

import org.springframework.web.multipart.MultipartHttpServletRequest;

import org.springframework.web.multipart.MultipartResolver;

import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;


import com.alibaba.fastjson.JSON;

import com.zhicall.care.realtime.util.ResultMessageBuilder;

import com.zhicall.care.realtime.util.ResultMessageBuilder.ResultMessage;

import com.zhicall.care.system.basic.BeanFactory;

import com.zhicall.majordomo.core.common.constant.GlobalCst;

import com.zhicall.majordomo.core.common.enums.YesOrNo;

import com.zhicall.majordomo.core.security.annotation.Login;

import com.zhicall.majordomo.core.security.constant.Cst;

import com.zhicall.majordomo.core.security.util.UserAuthHelper;


public class UserLoginInterceptor extends HandlerInterceptorAdapter {


@SuppressWarnings({ "unchecked", "rawtypes" })

protected RedisTemplate<String, String> redisTemplate = (RedisTemplate) BeanFactory.getInstance().getBean("redisTemplate");


@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

HandlerMethod handlerMethod = (HandlerMethod) handler;

Login login = handlerMethod.getMethodAnnotation(Login.class);

// 方法被 @Login(YesOrNo.No)标记 表示不需要登陆即可访问 否者都要登录

if (login != null && YesOrNo.NO.equals(login.value())) {

return true;

}

// 做鉴权

       ......

}

}

4.3 Controller中具体使用

Java

运行代码复制代码

1

2

3

4

5

6

7

@Login(YesOrNo.NO)

@RequestMapping(value = "/filter", method = RequestMethod.POST)

public @ResponseBody ResultMessageBuilder.ResultMessage filter(String companyId, String code) {

List<TabInfoVo> merchantsInfoDtos = new ArrayList<>();

merchantsInfoDtos = historyTradeService.filter(companyId, code);

return ok("查询成功", merchantsInfoDtos);

}

油炸小波

相关文章
|
2月前
|
安全 数据安全/隐私保护 微服务
什么是权限管理
权限管理包含认证与授权两大核心:认证确认用户身份(如登录),授权则根据角色分配访问权限,确保系统安全。常见模型有ACL、RBAC等,通过角色叠加实现菜单级控制,保障数据安全与操作合规,是系统安全的基石。
什么是权限管理
|
2月前
|
存储 安全 小程序
认识OAuth2.0
OAuth2.0是一种开放授权标准,允许第三方应用在用户授权下安全访问资源,无需获取用户账号密码。其核心是通过令牌(token)实现权限控制,广泛用于第三方登录、服务间资源调用等场景,支持授权码、简化、密码和客户端四种模式,保障系统安全与用户体验。
认识OAuth2.0
|
2月前
|
JSON Java API
Feign远程调用
本文介绍了如何使用Feign替代RestTemplate实现微服务间的HTTP调用,涵盖依赖引入、注解配置、自定义日志、连接池优化及代码抽取等实践。通过Feign可简化远程调用,提升开发效率,并结合最佳实践实现代码复用与解耦。
|
2月前
|
安全 Java Spring
过滤器链加载原理
本文深入解析Spring Security核心过滤器链原理,重点剖析DelegatingFilterProxy如何通过代理模式加载springSecurityFilterChain,结合FilterChainProxy与SecurityFilterChain源码,揭示十五个安全过滤器的初始化及执行流程,帮助理解框架底层机制。
过滤器链加载原理
|
2月前
|
负载均衡 Java 数据安全/隐私保护
Gateway服务网关
网关是微服务架构的统一入口,核心功能包括请求路由、权限控制、限流及负载均衡。通过Spring Cloud Gateway可实现高效路由转发与过滤器处理,支持跨域配置,提升系统安全与性能。
Gateway服务网关
|
2月前
|
前端开发 程序员
常见注解及使用说明
`@RequestMapping`用于定义控制器中处理请求的接口路径,实现前后端对接。通过指定URL路径,如`/staff/add`,使前端能准确访问对应接口。其派生注解如`@GetMapping`、`@PostMapping`等为简化常用HTTP方法而封装,本质仍基于`@RequestMapping`。
常见注解及使用说明
|
2月前
|
安全 Java 数据安全/隐私保护
认识SpringSecurity
SpringSecurity是Java领域主流的安全框架,核心功能包括认证、鉴权及防护常见攻击。支持表单、OAuth2、JWT等多种认证方式,基于过滤器链实现灵活权限控制,并提供CSRF、会话固定等安全防护机制。
|
2月前
|
负载均衡 Java 应用服务中间件
微服务网关与配置中心
本文介绍了微服务架构下的网关路由与鉴权机制,重点讲解使用Spring Cloud Gateway实现请求路由、负载均衡及JWT身份校验。通过Nacos实现服务发现,网关统一处理前端请求,解决多入口问题,并在全局过滤器中实现用户鉴权,保障系统安全。
|
2月前
|
存储 缓存 安全
常用过滤器介绍
Spring Security基于AOP思想,通过过滤器链实现安全控制。本文详解15个核心过滤器,如SecurityContextPersistenceFilter、CsrfFilter、UsernamePasswordAuthenticationFilter等,分别负责上下文管理、防跨站请求伪造、认证处理等功能,助你深入理解其工作原理。(238字)
|
2月前
|
安全 Java 开发工具
工程搭建与验证
本文介绍如何使用阿里云脚手架快速搭建Spring Boot工程,并整合Spring Security。内容涵盖工程创建、代码导入、Web依赖配置及安全验证流程,包含访问控制与默认登录机制,附完整代码仓库地址,助你快速上手安全开发。