spring中有没有注解拦截器,只拦截注解

hiyou 发布于 2015/12/22 11:40
阅读 3K+
收藏 0
spring中有没有注解拦截器,只拦截注解
加载中
1
分流砥柱
分流砥柱
没有明白你的需求?
hiyou
hiyou
我编写一个注解如:@User ,我需要对所有在方法和类上面有@User进行拦截处理 ,我原来用过HandlerInterceptorAdapter ,这个是对所有请求拦截,我只想对注解拦截
0
小小志
小小志

spring aop 可以满足你的需求

0
Java_Coder
Java_Coder
@Pointcut("execution(@org.springframework.web.bind.annotation.RequestMapping * *(..))")
    public void controllerPointcut() {}


 @Around("controllerPointcut()")
    public Object controllerAround(ProceedingJoinPoint joinPoint)
            throws Throwable {

//方法实现。。。

}

Spring都配置好文件后,启动。上面代码会自动读取含有RequestMapping标签[任意返回值,任意方法,任意参数]的方法,执行你的“方法实现”



Java_Coder
Java_Coder
对于自己写的注解我没有试过,如果成功的话,可否秀一下代码,我也学习一下
hiyou
hiyou
谢谢
0
Java_Coder
Java_Coder

趁现在老大还没有给我安排活干,再次补充回答一下。。。  实现了这个功能。

=========秀代码==========

自己定义的注解:


@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    String value();
}



配置文件加载(applicationContext.xml):


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/task
		http://www.springframework.org/schema/task/spring-task-3.1.xsd">

	<!-- 注解扫描 -->
	<context:annotation-config />
    <context:component-scan base-package="com.controller" />
	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
					
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8" p:maxUploadSize="2097152" >
		  <property name="resolveLazily" value="true"/>  
	</bean>
	
	<!-- aop注解 -->
	<aop:aspectj-autoproxy />
	<context:component-scan base-package="com.aspect" />

</beans>



com.controller:



@Controller
public class TestController {
    
    @RequestMapping({ "/test.do" }) //方便测试,加了一个访问请求的入口
    @MyAnnotation(value = "hello") //这里便是自己添加的注解
    public void test(HttpServletRequest request,
            HttpServletResponse response) {
        
        System.out.println("test Aspect");
        
    }

}


com.aspect:


@Component
@Aspect
public class ControllerAspect {

    @Pointcut("execution(@com.annotation.MyAnnotation * *(..))")
    public void controllerPointcut() {}
    @Around("controllerPointcut()")
    public Object controllerAround(ProceedingJoinPoint joinPoint)
            throws Throwable {
        // 执行的类
        String exeType = null;
        // 执行的方法
        String exeMethod = null;
        long start = System.currentTimeMillis();
        try {
            // 获取接口的请求参数
            MethodSignature signature = (MethodSignature) joinPoint
                    .getSignature();
            exeType = signature.getDeclaringType().getCanonicalName();
            exeMethod = signature.getMethod().getName();

            System.out.println(exeType + " " + exeMethod);
            return joinPoint.proceed();

        } catch (Throwable ex) {

        } finally {
            LOG.info("[{}.{} end,cost {} ms]", new Object[] {
                exeType, exeMethod, (System.currentTimeMillis() - start)
            });
        }
        return joinPoint.proceed();
    }
}


运行:

http://localhost:8080/Java/test.do



结果:

com.controller.TestController test
test Aspect

希望对你有帮助。。。。

Java_Coder
Java_Coder
回复 @halo26812 : 类拦截不了
Java_Coder
Java_Coder
回复 @halo26812 : 这个功能可以实现对方法进行拦截,对类进行拦截的话,等下我试试。。。 你也可以对要拦截的类的每个方法都添加这个注解,虽然有点暴力
hiyou
hiyou
回复 @halo26812 : 怎么实现
hiyou
hiyou
aspect 能对类进行拦截吗?
0
徐舟
徐舟
实现HandlerMethodArgumentResolver
hiyou
hiyou
这个是拦截方法上的参数注解吧
返回顶部
顶部