springmvc + AOP 获取Controller HttpServletRequest及HttpServletResponse

来源:互联网 发布:什么是软件危机 编辑:程序博客网 时间:2024/05/20 05:22

springmvc + AOP

需求描叙:

  • 在之前的系统新增用户属性采集功能
  • 记录用户是否注册成功
  • 不能修改原系统的代码
  • 原系统采用spring MVC架构
  • springmvc + AOP 获取Controller HttpServletRequest及HttpServletResponse

实现流程

  • 修改原项目web.xml
  • 修改 spring的配置文件applicationContext.xml
  • 引用实现aop功能的jar
  • 新建java工程实现aop功能并打包成jar
  • 在原系统依赖新功能jar
  • 测试新功能

原web工程修改原项目web.xml

在web.xml添加以下代码

<listener>        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>    </listener>

原web工程修改spring的配置文件修改spring的配置文件

这里写图片描述

xmlns:aop="http://www.springframework.org/schema/aop"http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd <aop:aspectj-autoproxy/>

新建工程引用实现aop功能的jar

这里写图片描述

    <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>4.1.3.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-aop</artifactId>            <version>1.4.1.RELEASE</version>        </dependency>

新建java工程实现aop功能

这里写图片描述

package com.foresee.xwzx.aop.xwcj_cjpt_aop_java;import java.io.IOException;import java.util.HashMap;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import com.foresee.dzswj.service.configuration.utils.ForeseePropertyUtil;import com.sensorsdata.analytics.javasdk.SensorsAnalytics;import com.sensorsdata.analytics.javasdk.exceptions.InvalidArgumentException;/** * <pre>注册egisteAccount.do函数的aop增强功能,记录用户是否注册成功</pre> * @author xieyuan * */@Aspect@Componentpublic class UserRegistAspect {    @Pointcut("execution(* (aop被环绕的class文件).egisteAccount(..))")    public void UserInfoController(){}    public UserRegistAspect(){    }    @Around("egisteAccount()")    public Object recourdRegis(ProceedingJoinPoint pjp){        logger.info("Come into RegistAspect !");        HttpServletRequest req = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();        String yhm = req.getParameter("yhm");        String sjh= req.getParameter("sjh");        //得到egisteAccount方法返回的map        Object result =pjp.proceed();         Map<String,Object> map =new HashMap<String,Object>();             try {                map = (Map<String, Object>) result;            } catch (Exception e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            map.put("message":"Controller返回值已被修改")        return result;    }}

原系统引用新建工程

这里写图片描述

原web工程pom.xml
这里写图片描述

测试

本地debug模式启动原来web工程之后,发现aop取到request的参数,浏览器取到的reponse数据是经过aop加工之后的数据!
阅读全文
0 0
原创粉丝点击