Sping AOP用AspectJ注解的方式拦截不到SpringMVC的controller方法?

来源:互联网 发布:网站美工培训多少钱 编辑:程序博客网 时间:2024/06/05 04:00

Sping AOP用AspectJ注解的方式拦截不到SpringMVC的controller方法怎么办?

下面是本人做的一个拦截小栗子:

环境:jdk1.7 ,spring 4.1.5

Eclipse项目代码结构:

配置

1.首先pom.xml配置文件

<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 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zone</groupId><artifactId>SpringMVCAOP</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>SpringMVCAOP Maven Webapp</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring.version>4.1.5.RELEASE</spring.version><servlet.version>1.2</servlet.version><servlet.api.version>3.0.1</servlet.api.version></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!-- servlet begin --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>${servlet.version}</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet.api.version}</version><scope>provided</scope></dependency><!-- servlet end --><!-- spring begin --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><!-- spring end --><!-- log4j begin --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!-- log4j end --></dependencies><build><finalName>SpringMVCAOP</finalName><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><configuration><port>8080</port><uriEncoding>UTF-8</uriEncoding><path>/SpringMVCAOP</path></configuration></plugin></plugins></build></project>

2.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:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"default-lazy-init="false"><description>Spring公共配置 </description><!-- 使用annotation 自动注册bean, 并保证@Required、@Autowired的属性被注入 --><context:component-scan base-package="com.zone"><context:exclude-filter type="annotation"expression="org.springframework.stereotype.Controller" /></context:component-scan></beans>


3.spring-mvc.xml 

特别说明:

<!-- 启动AspectJ支持 --><aop:aspectj-autoproxy proxy-target-class="true" />

配置(重要)请在 spring-mvc.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:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 必须加上 --><mvc:annotation-driven /><!-- 启动AspectJ支持 --><aop:aspectj-autoproxy proxy-target-class="true" /><!-- 自动扫描且只扫描@Controller --><context:component-scan base-package="com.zone"use-default-filters="false"><context:include-filter type="annotation"expression="org.springframework.stereotype.Controller" /></context:component-scan><!-- 视图 --><bean id="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass"value="org.springframework.web.servlet.view.JstlView" /><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean><!-- 容器默认的DefaultServletHandler处理 所有静态内容与无RequestMapping处理的URL --><mvc:default-servlet-handler /></beans>


4.log4j.xml用于控制台打印springmvc启动加载信息


<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="[%d{HH:mm:ss}] %p - %C{1}.%M(%L) | %m%n" /></layout></appender><appender name="DAILY" class="org.apache.log4j.DailyRollingFileAppender"><param name="File"value="/console.log" /><param name="DatePattern" value="'.'yyyy-MM-dd'.log'" /><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="[%d{HH:mm:ss}] %p - %C{1}.%M(%L) | %m%n" /></layout></appender><root><level value="info" /><appender-ref ref="CONSOLE" /><appender-ref ref="DAILY" /></root></log4j:configuration>

5.web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><display-name>Archetype Created Web Application</display-name><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:/applicationContext.xml,</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- filter --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- spring servlet --><servlet><servlet-name>springServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>


代码

1.登录的controller:LoginController.java


package com.zone.controller;import javax.servlet.http.HttpServletRequest;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import com.zone.annotation.RequestLimit;/** *  * * @author zgzi * @version [版本号, 2015年12月4日] * @see [相关类/方法] * @since [产品/模块版本] */@Controller@RequestMapping("/account")public class LoginController{    /**     * 加入注解@RequestLimit 被拦截     *      * @param username     * @param request     * @return     * @see [类、类#方法、类#成员]     */    @RequestMapping(value = "/login", method = RequestMethod.POST)    @RequestLimit    public String login(@RequestParam(value = "username") String username, HttpServletRequest request)    {        request.setAttribute("username", username);        return "loginSuccess";    }}

2.自定义注解:RequestLimit.java

//自定义注解package com.zone.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)@Documentedpublic @interface RequestLimit{    /**     *      * 允许访问的次数,默认值MAX_VALUE     */    int count() default Integer.MAX_VALUE;}


3.测试拦截:AOPInterceptTest.java


package com.zone.aop;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Component;import com.zone.annotation.RequestLimit;@Aspect@Componentpublic class AOPInterceptTest{    /**     * 拦截登录     *      * @param joinPoint     * @param limit     * @return     * @throws Throwable     * @see [类、类#方法、类#成员]     */    @Around("within(@org.springframework.stereotype.Controller *) && @annotation(limit)")    public Object requestLimit(final ProceedingJoinPoint joinPoint, RequestLimit limit)        throws Throwable    {        Object[] args = joinPoint.getArgs();        if(args[0].equals("zone"))        {            return "loginFailed";        }        return joinPoint.proceed();    }}

最后简单页面:

1.index.jsp:

<html><body><h2>Hello World!</h2><h2>Dear friends ,use "zone" to login must be Intercepted.</h2><form action="account/login" method="post"><input type="text" name="username" /> <input type="submit"value="submit"></form><div id="errorDiv"></div></body></html>
下面页面都放置于
/SpringMVCAOP/src/main/webapp/WEB-INF/jsp/ 下

2.登录被拦截页面:loginFailed.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Login Success</title></head><body><p style="color:red;font-size: 16px;">Zone was  Intercepted.</body></html>

3.登录成功页面:loginSuccess.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Login Success</title></head><body>Hello<span style="color: red;">${username}</span> ,Welcome to spring mvcaop, I know you are not zone.</body></html>


总结这样一个小小的Spring mvc aop拦截测试就ok了?项目代码下载请参考这里,不过全部代码都已在上面贴出来了。
有人会说spring mvc 已经提供了拦截器何必要自己配置aop去拦截哪?哈哈,闹着玩呗》》


0 0
原创粉丝点击