精华内容
下载资源
问答
  • 2022-04-02 10:35:17
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface SendAuthorize {
    
    }
    
    
    @Configuration
    public class SendAuthorizeConfig  implements WebMvcConfigurer {
        @Autowired
        private SendAuthorizeInterceptor sendAuthorizeInterceptor ;
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(sendAuthorizeInterceptor).addPathPatterns("/**");
        }
    }
    
    
    
    import cn.hutool.core.util.ObjectUtil;
    import com.alibaba.fastjson.JSONObject;
    import com.baomidou.mybatisplus.core.toolkit.Wrappers;
    import com.joolun.common.core.domain.AjaxResult;
    import com.joolun.common.utils.SecurityUtils;
    import com.joolun.common.utils.ServletUtils;
    import com.joolun.weixin.entity.WxUser;
    import com.joolun.weixin.service.WxUserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * @author yhh
     * @Description: 
     * @date 2022-04-01 9:25
     */
    @Component
    public class SendAuthorizeInterceptor extends HandlerInterceptorAdapter {
    
        @Autowired
        private WxUserService wxUserService ;
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            /**
             * handler保存了本次请求的controller也就是接口方法的一些信息,如类,方法,参数等
             * 如果是一次静态资源的请求则该handler不应该是HandlerMethod的实现类
             * 判断是否是一个正常的接口,如果是则进行鉴权操作,不是则直接放行
             */
            if (handler instanceof HandlerMethod) {//如果一直false,请看导出的包是否正确
                HandlerMethod handlerMethod = (HandlerMethod) handler;
                SendAuthorize sendAuthorize = handlerMethod.getMethod().getAnnotation(SendAuthorize.class);
                if (null != sendAuthorize) {
                    // 对用户进行鉴权
                    if (hasPermission()){
                        AjaxResult ajaxResult = AjaxResult.error("当前转赠功能已被锁定!");
                        ServletUtils.renderString(response, JSONObject.toJSONString(ajaxResult));
                        return false;
                    }
                    return true;
                }
            }
            return true;
        }
    
        // 用户鉴权具体方法
        private boolean hasPermission() {
            Long userID = SecurityUtils.getLoginUser().getUser().getUserId();
            WxUser one = wxUserService.getOne(Wrappers.<WxUser>lambdaQuery()
                    .eq(WxUser::getDelFlag, CommonConstants.NO)
                    .eq(WxUser::getSendLock, "1")
                    .eq(WxUser::getId, userID)
            );
            if(ObjectUtil.isNotEmpty(one)){
                return true ;
            }
            return false;
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
    
        }
    }
    

    详细解释在这里
    java三大器之拦截器(Interceptor)的实现原理及代码示例

    更多相关内容
  • Java-注解拦截器

    2020-05-08 16:37:08
    总结: 创建注解类 自定义拦截器实现 HandlerInterceptor类,重写preHandle方法,在其实现判断逻辑 注入自定义的拦截器,实现WebMvcConfigurer ,重写addInterceptors方法,配置拦截所有路径 如有转载请请务必保留...

    一:环境

    1. 创建个spring boot 2.1.2版本
    2. 有个能正常调用的接口

    二:pom配置

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.2.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>demo</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.41</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    

    三:创建个注解类

    package com.example.demo.config;
    
    import java.lang.annotation.*;
    
    /**
     * @author huang(jy)
     * @version 1.0
     * @date 2020/5/8 14:39
     */
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    //是否需要登录拦截
    public @interface NeedLogin {
    	//是否需要登录拦截,默认不需要
        boolean needLoginValue() default false;
    
    }
    
    

    四:创建自定义拦截器类

    package com.example.demo.config;
    
    import com.alibaba.fastjson.JSONObject;
    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;
    
    
    /**
     * @author huang(jy)
     * @version 1.0
     * @date 2020/5/8 14:48
     */
    public class NeedLoginInterceptors implements HandlerInterceptor {
    
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            //判断是否有注解
            boolean isNeed = handler.getClass().isAssignableFrom(HandlerMethod.class);
            if (isNeed) {
                //获取到这个注解信息
                NeedLogin needLogin = ((HandlerMethod) handler).getMethodAnnotation(NeedLogin.class);
                if (needLogin != null && needLogin.needLoginValue()) {
                    return true;
                }
            }
            //重置response
            response.reset();
            //设置编码格式
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json;charset=UTF-8");
            PrintWriter pw = response.getWriter();
            pw.write(JSONObject.toJSONString("无权限"));
            return false;
        }
    
    }
    
    

    五:拦截器注入WebMvcConfigurerAdapter

    package com.example.demo.config;
    
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    /**
     * @author huang(jy)
     * @version 1.0
     * @date 2020/5/8 15:05
     */
    @Component
    public class WebMvcConfigurerAdapter implements WebMvcConfigurer {
    
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            //注册NeedLoginInterceptors拦截器
            InterceptorRegistration registration = registry.addInterceptor(new NeedLoginInterceptors());
            registration.addPathPatterns("/**");//拦截所有路径
        }
    }
    
    

    六:测试是否生效
    1.注解为:true,结果如下图
    在这里插入图片描述
    2.注解不填,默认为false,结果如下图(返回为拦截器里的提示信息)
    在这里插入图片描述
    3.不写注解,结果如下(返回为拦截器里的提示信息);
    在这里插入图片描述

    总结:

    创建注解类
    自定义拦截器实现 HandlerInterceptor类,重写preHandle方法,在其实现判断逻辑
    注入自定义的拦截器,实现WebMvcConfigurer ,重写addInterceptors方法,配置拦截所有路径
    

    如有转载请请务必保留此出处:https://blog.csdn.net/hometing218/article/details/105998169

    展开全文
  • 轻松实现java拦截器+自定义注解

    千次阅读 2021-03-16 16:47:51
    本文将用简洁的代码构建一个springboot的拦截器拦截器的使用很简单,定义一个自己的拦截器,向配置中添加一下就...项目结构:TokenInterceptor.java 自定义拦截器InterceptorConfig.java 添加拦截器进入项目NoN...

    本文将用简洁的代码构建一个springboot的拦截器。拦截器的使用很简单,定义一个自己的拦截器,向配置中添加一下就可以使用。为了方便,之后又引入了注解。

    目录和概述

    概述

    假设需求:访问项目的controller是都要进行"token验证",除了某些像登录之类的方法。

    项目结构:

    TokenInterceptor.java 自定义拦截器

    InterceptorConfig.java 添加拦截器进入项目

    NoNeedToken.java 自定义注解

    TestController.java 测试接口

    312118c9abad15c657fb660fea2b29d1.png

    目录

    1、自定义拦截器

    在 TokenInterceptor.java 中输入以下代码,以下的代码将生成一个在请求到达controller前进行拦截的拦截器

    import com.alibaba.fastjson.JSONObject;

    import org.springframework.lang.Nullable;

    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.io.PrintWriter;

    import java.util.Arrays;

    import java.util.List;

    @Component

    public class TokenInterceptor implements HandlerInterceptor {

    // 假设现在的token有如下数据

    List tokenList = Arrays.asList("111", "222", "333");

    // 这个方法是在访问接口之前执行的,我们只需要在这里写验证登陆状态的业务逻辑,就可以在用户调用指定接口之前验证登陆状态了

    @Override

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

    // 设置返回为json格式,使用UTF-8

    response.setCharacterEncoding("UTF-8");

    response.setContentType("application/json; charset=utf-8");

    String token = request.getHeader("token");

    PrintWriter out;

    // 之后写你的判断逻辑:return true是通过拦截器,可以继续访问controller,return false是不通过

    if (token == null || !tokenList.contains(token)) {

    // 如果失败了返回{state:"false", msg:"token is null or wrong"}

    JSONObject res = new JSONObject();

    res.put("state","false");

    res.put("msg","token is null or wrong");

    out = response.getWriter();

    out.append(res.toString());

    return false;

    }

    // 否则返回true 进入controller

    return true;

    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {

    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {

    }

    }

    2、载入拦截器

    将以下代码写在InterceptorConfig.java中 ,使用addInterceptors方法将我们定义的拦截器添加进入项目中

    import org.springframework.context.annotation.Configuration;

    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

    import javax.annotation.Resource;

    @Configuration

    public class InterceptorConfig implements WebMvcConfigurer {

    @Resource

    TokenInterceptor tokenInterceptor;

    @Override

    public void addInterceptors(InterceptorRegistry registry) {

    // 设置所有的路径都要进行拦截,除了/test/login

    registry.addInterceptor(tokenInterceptor).addPathPatterns("/**")

    .excludePathPatterns("/test/login");

    }

    }

    3、测试成功

    将如下代码到TestController中,用于测试拦截器效果

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RestController;

    import java.util.HashMap;

    import java.util.Map;

    @RestController

    // canload用于检测拦截器是否正常工作

    @RequestMapping("/test")

    public class TestController {

    @RequestMapping(value = "/canload")

    public Map canLoad(){

    Map res = new HashMap<>();

    res.put("state", "ok");

    res.put("msg", "you can load");

    return res;

    }

    // login模拟登录时token返回

    @RequestMapping(value = "/login")

    public String login(){

    return "111";

    }

    }

    可以看到如下结果

    ①直接登录成功

    c8311f4b08bef979ade1557a2a4d3947.png

    ②直接访问canload失败

    377e439e9cec1661b2f79bf85290b245.png

    ③使用postman,带上token进行访问成功

    393b4dcd87aecb81e0212337dfb3af05.png

    4、使用注解(Annotation)进行选择

    你也可以使用注解来代替第三步配置中的excludePathPatterns(), 来实现对于指定方法和controller的免token访问,新建一个NoNeedToken.java注解,在拦截器里判断注解存在时,直接return true放行

    NoNeedToken.java

    import java.lang.annotation.ElementType;

    import java.lang.annotation.Retention;

    import java.lang.annotation.RetentionPolicy;

    import java.lang.annotation.Target;

    @Target({ElementType.METHOD, ElementType.TYPE}) //注解的范围是类、接口、枚举的方法上

    @Retention(RetentionPolicy.RUNTIME)//被虚拟机保存,可用反射机制读取

    public @interface NoNeedToken {

    }

    响应的更改自定义拦截器的 preHandle方法,和拦截器配置

    ① 自定义拦截器

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

    response.setCharacterEncoding("UTF-8");

    response.setContentType("application/json; charset=utf-8");

    String token = request.getHeader("token");

    PrintWriter out;

    // 对于注解的判断---------------------------------------------------

    HandlerMethod handlerMethod = (HandlerMethod) handler;

    if(handlerMethod.getMethodAnnotation(NoNeedToken.class)!=null || handlerMethod.getBeanType().isAnnotationPresent(NoNeedToken.class)){

    // 如果自己拥有NoNeedToken标注或者所属的class拥有NoNeedToken 就直接放行

    return true;

    }

    //------------------------------------------------------------------

    if (token == null || !tokenList.contains(token)) {

    JSONObject res = new JSONObject();

    res.put("state","false");

    res.put("msg","token is null or wrong");

    out = response.getWriter();

    out.append(res.toString());

    return false;

    }

    return true;

    }

    ② 去除拦截器配置中的去除项

    public void addInterceptors(InterceptorRegistry registry) {

    registry.addInterceptor(tokenInterceptor).addPathPatterns("/**");

    // .excludePathPatterns("/test/login");

    }

    ③ 在测试的login方法上添加注释

    @RequestMapping(value = "/login")

    @NoNeedToken

    public String login(){

    return "111";

    }

    修改完成之后效果和上面相同

    5、常见问题

    1.这个自定义注解的那些@Target,@Retention,@Documented是什么意思

    https://blog.csdn.net/zt15732625878/article/details/100061528,这篇文章写的很详细了

    2.为什么我的注解加了,还是被拦截了

    一般出现这种情况是类与方法的获取注解方式不同,在本文中作者使用了下面的一句话来表述

    handlerMethod.getMethodAnnotation(NoNeedToken.class)!=null || handlerMethod.getBeanType().isAnnotationPresent(NoNeedToken.class)

    其中handlerMethod.getMethodAnnotation(NoNeedToken.class)!=null是对于方法的

    而handlerMethod.getBeanType().isAnnotationPresent(NoNeedToken.class)是对于类的

    结语:希望对大家有帮助

    展开全文
  • Java注解拦截器

    2016-06-23 09:56:28
    Annotation(注解),也叫元数据。一种代码级别的说明,是JDK5.0引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。 Annotion是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象...

    简介

    Annotation(注解),也叫元数据。一种代码级别的说明,是JDK5.0引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。 Annotion是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据。

    注解基础

    Annotation能被用来为某个程序元素(类、方法、成员变量等)关联任何的信息。Annotation不影响程序代码的执行,无论增加、删除 Annotation,代码都始终如一的执行,但可以通过Java反射工具对Annotation进行访问和处理。

    根据注解使用方法和用途,可以将Annotation分为三类:

    JDK内置系统注解

    注解的语法比较简单,除了@符号的使用外,他基本与Java固有的语法一致,JavaSE中内置三个标准注解,定义在java.lang中:

    • @Override:用于修饰此方法覆盖了父类的方法;
    • @Deprecated:用于修饰已经过时的方法,可能在未来版本废弃;
    • @SuppressWarnnings:用于通知java编译器禁止特定的编译警告。

    元注解

    元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。

    • @Documented
    • @Target
    • @Retention
    • @Inherited

    这些类型和它们所支持的类在java.lang.annotation包中可以找到。

    Documented

    @Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public@interfaceDocumented{}

    @Documented可以用于javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

    Target注解

    @Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public@interfaceTarget{ElementType[] value();}

    @Target说明了Annotation所修饰的对象范围,它所支持的范围在ElementType枚举中描述。

    publicenumElementType{
        TYPE,/** Class, interface (including annotation type), or enum declaration */
        FIELD,/** Field declaration (includes enum constants) */
        METHOD,/** Method declaration */
        PARAMETER,/** Parameter declaration */
        CONSTRUCTOR,/** Constructor declaration */
        LOCAL_VARIABLE,/** Local variable declaration */
        ANNOTATION_TYPE,/** Annotation type declaration */
        PACKAGE /** Package declaration */}

    Retention注解

    @Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public@interfaceRetention{RetentionPolicy value();}

    @Retention定义了该Annotation被保留的时间长短。

    publicenumRetentionPolicy{
        SOURCE,
        CLASS,
        RUNTIME
    }
    • SOURCE:被编译器丢弃,仅源文件保留
    • CLASS:编译器记录注解在class文件里面,运行时被虚拟机丢弃,默认。
    • RUNTIME:编译器记录注解在class文件里面,运行时虚拟机会保留,可通过反射读取。

    Inherited注解

    @Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public@interfaceInherited{}

    @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

    自定义注解

    使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口。

    定义注解格式:

    public@interfaceAnnotationName{body...}

    注解的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称。 注解参数的可支持数据类型:基本数据类型,String,CLass,enum,Annotation及前面类型的数组。 可以通过default来声明参数的默认值。

    仅仅定义注解还不够,重要的是要通过注解处理器来处理自定义的注解,Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器。

    Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口。除此之外,Java在java.lang.reflect 包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素。

    publicinterfaceAnnotatedElement{/** 判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.   */boolean isAnnotationPresent(Class<?extendsAnnotation> annotationClass);/** 返回存在的指定类型的注解,否则返回null  */<T extendsAnnotation> T getAnnotation(Class<T> annotationClass);/** 返回所有注解   */Annotation[] getAnnotations();/** 返回直接存在于此元素上的所有注释。  */Annotation[] getDeclaredAnnotations();}

    定义注解

    定义Before注解,用于在类或者方法时,可在运行时读取。可配置继承Interceptor接口的Class数组。

    import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Inherited@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE,ElementType.METHOD})public@interfaceBefore{Class<?extendsInterceptor>[] value();}

    定义拦截器

    拦截器接口,为了方便模拟,方法的参数为Object对象

    publicinterfaceInterceptor{void intercept(Object obj);}

    定义了三个实现Interceptor接口的类,分别为CommonInterceptor,AuthorityInterceptor和CacheInterceptor。

    publicclassCommonInterceptorimplementsInterceptor{@Overridepublicvoid intercept(Object obj){System.out.println("Common Interceptor invoke ... ");}}publicclassAuthorityInterceptorimplementsInterceptor{@Overridepublicvoid intercept(Object obj){System.out.println("Authority Interceptor invoke ... ");}}publicclassCacheInterceptorimplementsInterceptor{@Overridepublicvoid intercept(Object obj){System.out.println("Cache Interceptor invoke ... ");}}

    定义Action控制类

    对Action类添加了注解和方法上添加了0到多个拦截器。

    @Before(CommonInterceptor.class)publicclassAction{@Before(AuthorityInterceptor.class)publicvoid save(){System.out.println("foo");}@Before({CacheInterceptor.class,AuthorityInterceptor.class})publicvoid view(){System.out.println("view");}publicvoid list(){System.out.println("list");}}

    定义注解处理器

    方法上面的拦截器集合有方法上自定义的拦截器和类上定义的拦截器所组成。 步骤:(1) 取得Class上的Before注解,获得此Class上配置的拦截器;(2) 对Class的每个方法获得Method对象,并获得在此Method上配置的拦截器;(3) 将上面两步获得的拦截器合并,对应方法上所配置的拦截器集合。(4) 配置路由和拦截器的关联关系,路由简单的由类名和方法名组成。

    import java.util.HashMap;import java.util.Map;import java.lang.reflect.Method;publicclassInterceptorParse{privatestaticfinalInterceptor[] NULL_INTERCEPTOR_ARRAY =newInterceptor[0];publicMap<String,Interceptor[]> parse(Class klass){Map<String,Interceptor[]> result =newHashMap<String,Interceptor[]>();String className = klass.getName();Before classBefore =(Before)klass.getAnnotation(Before.class);Interceptor[] classInterceptors = getInterceptors(classBefore);//Method[] methods = klass.getMethods();Method[] methods = klass.getDeclaredMethods();for(Method method : methods){String methodName = method.getName();Before methodBefore =(Before)method.getAnnotation(Before.class);Interceptor[] methodInterceptors = getInterceptors(methodBefore);Interceptor[] availableInterceptors = combineInterceptors(classInterceptors, methodInterceptors);
    
                result.put(className+"/"+methodName, availableInterceptors);}return result;}privateInterceptor[] getInterceptors(Before beforeAnnotation){if(beforeAnnotation ==null)return NULL_INTERCEPTOR_ARRAY;Interceptor[] result =null;Class<Interceptor>[] interceptorClasses =(Class<Interceptor>[]) beforeAnnotation.value();if(interceptorClasses !=null&& interceptorClasses.length >0){
                result =newInterceptor[interceptorClasses.length];for(int i=0; i<result.length; i++){try{
                        result[i]=(Interceptor)interceptorClasses[i].newInstance();}catch(Exception e){thrownewRuntimeException(e);}}}return(result !=null)?result:NULL_INTERCEPTOR_ARRAY;}privateInterceptor[] combineInterceptors(Interceptor[] first,Interceptor[] second){if(first.length ==0)return second;if(second.length ==0)return first;Interceptor[] result =newInterceptor[first.length + second.length];int idx =0;for(Interceptor interceptor: first){
                result[idx++]= interceptor;}for(Interceptor interceptor: second){
                result[idx++]= interceptor;}return result;}publicstaticvoid main(String[] args){InterceptorParse interceptorParse =newInterceptorParse();Map<String,Interceptor[]> map = interceptorParse.parse(Action.class);for(Map.Entry<String,Interceptor[]> entry : map.entrySet()){System.out.println("path: "+ entry.getKey());Interceptor[] interceptors = entry.getValue();for(Interceptor interceptor: interceptors){System.out.println("Interceptor:"+ interceptor.getClass().getName());
                    interceptor.intercept(null);}System.out.println();}}}

    运行结果

    path:Action/list
    Interceptor:CommonInterceptorCommonInterceptor invoke ...
    
    path:Action/view
    Interceptor:CommonInterceptorCommonInterceptor invoke ...Interceptor:CacheInterceptorCacheInterceptor invoke ...Interceptor:AuthorityInterceptorAuthorityInterceptor invoke ...
    
    path:Action/save
    Interceptor:CommonInterceptorCommonInterceptor invoke ...Interceptor:AuthorityInterceptorAuthorityInterceptor invoke ...

     

    展开全文
  • 此文章可对自定义注解拦截器进行综合学习,讲解简洁明了 步骤一:创建自定义注解 @TestDefinition (自定义注解我个人一般用来做标记使用,为了体现它的“属性作用”,此处仅加一个属性“value”) import ...
  • java注解+拦截器实现自定义注解 @CmwAutoWired:自定义依赖注入 注意:注入的接口和实现类需要在同一包名下,注解的是类则无限制 @FieldAnnotation:自定义属性注解 @MethodAnnotation:自定义方法注解 @...
  • 前几天在学习一个网站项目的时候看到了Java注解这个东西的实现感觉挺有意思的,想结合项目进行一个简单的讲解,希望能够帮助自己复习巩固一遍,同时也能够帮助更多学习过的人 如图,上面是一个注解的实现,其实...
  • 内容:拦截器的使用很简单,定义一个自己的拦截器,向配置中添加一下就可以使用。...oTokenInterceptor.java 自定义拦截器 oInterceptorConfig.java 添加拦截器进入项目 oNoNeedToken.java 自定义注解
  • java拦截器和过滤器详解

    千次阅读 2022-01-06 17:14:14
    拦截器是基于java的反射机制的,而过滤器是基于函数回调。 拦截器不依赖与servlet容是依赖于spring容器,过滤器依赖与servlet容器。 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用,可以...
  • 拦截基于数据库实体类数据库中加密数据新建注解类:根据执行的sql包含update和query拦截到有注解的字段:数据库的user实体类代码如下:总结:数据库加上对应注解,update和query的语句进入实体找到注解拦截器过滤...
  • java ee拦截器历史 我认为重要的是要看一下Java EE中Interceptor的发展,因为它是从EJB特定的项目开始的,后来又演变... 拦截器没有专门的规范,但是它们的版本为1.0,并通过简单的注释向托管Bean(POJO)购买了与AO...
  • Java拦截器与过滤器

    千次阅读 2022-04-22 23:42:23
    Java拦截器与过滤器
  • 拦截器注解可以实现登录权限验证等操作,我的应用场景也是为了验证这个,下面是简单的实现步骤一、什么是拦截器拦截器是对action的一种拦截,可以在请求前后进行一些处理可拦截controller和view内容二、Spring中...
  • Java过滤器与拦截器的区别1. 过滤器与拦截器概述1.1 过滤器 Filter1.2 拦截器 interceptor2. 过滤器与拦截器区别3. 过滤器与拦截器实现3.1 过滤器(Filter)3.2 拦截器 (Interceptor)3.3 拦截器WebMvc配置3.4 切片...
  • SpringBoot拦截器配置【使用Java注解
  • 类似用户权限的需求,有些操作需要登录...这里可以采用一种比较简单灵活的方式,是采用spring 的 methodInterceptor拦截器完成的,并且是基于注解的。大概是用法是这样的:@LoginRequired@RequestMapping(value = "/...
  • 在我们的项目中,有很多情景需要我们自己去实现拦截器,比如判断用户是否登录,限制用户请求的次数等等,在我们的Spring boot中我们可以通过注解+拦截器来实现我们的判断是否登录的注解拦截器是来自MVC的拦截器,...
  • 使用handlerinterceptor拦截器,可以拦截请求,实现通用的日志管理操作一、添加拦截器类在"src/main/java"代码文件夹的"org.xs.demo1"的包下新建"loginterceptor.java"类:package org.xs.demo1;import java.text....
  • 类似用户权限的需求,有些操作需要登录...这里可以采用一种比较简单灵活的方式,是采用spring 的 methodinterceptor拦截器完成的,并且是基于注解的。大概是用法是这样的:@loginrequired@requestmapping(value = "/...
  • Java拦截器

    千次阅读 2021-03-01 08:03:52
    下面是演示使用拦截器拦截未登录的用户访问需要登录的模块情景,使用配置方式实现和注解方式实现代码:配置方式:1、web.xml中配置监听器,对于所有的/admin开头的请求,都走com.blog.interceptor.LoginInterceptor...
  • 1、maven 依赖版本注意:本次示例的 spring-boot-starters 的版本是 2.1.132、实现步骤① 实现配置类implements WebMvcConfigurer② 实现拦截器LoginInterceptor extends HandlerInterceptorAdapter③ 把拦截器添加...
  • Java 登录拦截器

    千次阅读 2019-10-31 14:51:30
    对于Java拦截器我也是一知半解,但是可以实现,大家可以借鉴 首先 需要添加一个文件与启动器同级 package com.example.demo.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet....
  • Java通过拦截器返回跨域问题的解决 通常在controller中加入@CrossOrigin注解即可实现跨域请求,但是有些时候在使用interceptor拦截器后,重新返回Response则又会重新出现跨域问题。 解决方法:在重新返回的Response...
  • java拦截器配置

    2021-05-07 09:52:12
    文章目录简介一、拦截器介绍1.拦截器属性2.拦截器特点二、引入拦截器1.拦截器实现方法2.读入数据三、测试拦截器效果1.新增一个控制器2.运行项目 简介 拦截器通常用于拦截客户端请求,判断访问条件是否符合预期并...
  • java开发中,拦截器使用是很普遍的,最常用的就是登陆拦截了,然后并不是所有的请求我们都需要拦截,比如index页面的请求我们是不拦截的.通常情况下我们有两种方式:先贴出来springboot使用拦截器的case:1.自定义拦截器...
  • Java自定义拦截器详细教程

    万次阅读 2018-10-31 10:59:29
    Java编程中经常会有一些需要我们进行登录拦截的操作,或者实现,那么怎么用java代码实现一个拦截器呢?一般情况下实现拦截器需要两步,今天就给大家演示一个拦截器,废话不多说,代码+注释直接奉上! 第一步:自定义拦截器 ...
  • 美团一面: 中间省略掉大概几个问题,因为我不记得了,下面记得的... 最后 再免费分享一波我的JAVA架构专题面试真题+解析+JAVA学习书籍:戳这里免费领取 /java-p7)** [外链图片转存中…(img-pxSK4NxC-1626948460175)]

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,091
精华内容 42,836
关键字:

java 注解拦截器

java 订阅