后台如何取response中的值

yanxin9210 2015-11-27 04:28:06
在使用spring aop的自定义注解开发系统日志功能,需求是要监控操作时间、操作人、模块、动作、请求ip、请求浏览器、操作结果。

前几个值都可以从request和session中获取,而操作结果就必须要从response中获取。


现在的问题是:我已经在过滤器中取到了response,并且传给切点类了,但是不知道如何去取response里面的success值。

后台是spring+spring mvc+hibernate,前台是Extjs5

后台controller代码
@Override
@RequestMapping(value = "/saveDepartment", method = {RequestMethod.POST, RequestMethod.GET})
@SystemLogAfter //自定义注解
public void doSave(Department entity, HttpServletRequest request, HttpServletResponse response) throws IOException {
ExtJSBaseParameter parameter = ((ExtJSBaseParameter) entity);
// 查找所有父节点id相同(即同级节点)结果集
List<Department> departmentList = departmentService.queryByProerties("parentId", entity.getParentId());
System.out.println("entity:" + entity.getDepId());
System.out.println("entity:" + entity.getName());
boolean isExist = false;
// 遍历结果集
if (departmentList.size() > 0) {
for (Department department : departmentList) {
// 查找新增项或修改项的组织机构名是否与其他同级机构同名
System.out.println(department.getDepId());
System.out.println(department.getName());
System.out.println(department.getName().equals(entity.getName()));
System.out.println(department.getDepId().equals(entity.getDepId()));
if (department.getName().equals(entity.getName()) && !department.getDepId().equals(entity.getDepId())) {
isExist = true;
break;
//return;
}
}
}

if (!isExist) {
if (CMD_EDIT.equals(parameter.getCmd())) {
departmentService.update(entity);
} else if (CMD_NEW.equals(parameter.getCmd())) {
departmentService.persist(entity);
}
parameter.setCmd(CMD_EDIT);
parameter.setSuccess(true); //操作成功
}
else{
parameter.setSuccess(false); //操作失败
}
writeJSON(response, parameter); //生成json数据是用的jackson框架
}


前台js可以获取到response中的success值
Ext.Ajax.request({
url : appBaseUri + '/sys/department/saveDepartment',
params : {
cmd : vals['cmd'],
depId : vals['depId'],
name : vals['name'],
parentId : vals['parentId'],
manager : vals['manager'],
tel : vals['tel'],
sortId : vals['sortId'],
memo : vals['memo']
},
method : "POST",
success : function(response) {
if (response.responseText != '') {
var res = Ext.JSON.decode(response.responseText); //获取response中的json数据
if (res.success) {
globalObject.msgTip('操作成功!');
Ext.getCmp('departmentmanagementgrid').getStore().reload();
Ext.getCmp('departmentTree').getStore().reload();
} else {
globalObject.errTip('当前部门名称已存在!');
}
}
},
failure : function(response) {
globalObject.errTip('操作失败!');
}
});


切点类
@Aspect  
@Component
public class SystemLogAfterAspect {

@Resource
private SysLogService sysLogService;

@Resource
private AuthorityService authorityService;

// Controller层切点
@Pointcut("@annotation(com.djbh.aop.SystemLogAfter)")
public void controllerAspect() {
}

/**
* 后置通知 用于拦截Controller层记录用户的操作
*
* @param joinPoint 切点
*/
@After("controllerAspect()")
public void doAfter(JoinPoint joinPoint) {

//使用SystemContextUtils工具类获取request response session
HttpServletRequest request = HttpContextUtils.getRequest();
HttpServletResponse response = HttpContextUtils.getResponse();
HttpSession session = HttpContextUtils.getSession();

// 读取session中的用户
SysUser sysUser = (SysUser)session.getAttribute(Constant.SESSION_SYS_USER);

// 读取cmd值,cmd = new 或 edit,用来判断是新增保存还是修改保存
String cmd = request.getParameter("cmd");
String url = request.getRequestURI();
String contextPath = request.getContextPath() + "/";
// 请求的模块
String model = null;
// 请求的动作
String action = null;
System.out.println(url);
if (StringUtils.isNotBlank(url)) {
url = url.replace(contextPath, "");
// 正则表达式
Pattern p = Pattern.compile("[/]+");
// 将url字符串按/分割成字符串数组
String[] urls = p.split(url);
for (int i = 0; i < urls.length; i++) {
System.out.println(i+":" + urls[i]);
}
// 组合需要格式的字符串
StringBuffer sbUrl = new StringBuffer(urls[0]).append(".").append(urls[1]);
System.out.println(sbUrl);
Authority authority = authorityService.getByProerties("url", sbUrl.toString());

model = authority == null ? "其他" : authority.getMenuName();

if (urls[2].startsWith("get")) {
action = "查询(获取)";
}
else if (urls[2].startsWith("save") && "new".equals(cmd)) {
action = "新增";
}
else if (urls[2].startsWith("save") && "edit".equals(cmd)) {
action = "修改";
}
else if (urls[2].startsWith("delete")) {
action = "删除";
}
else if (urls[2].startsWith("login")) {
action = "登录";
}
else if (urls[2].startsWith("logout")) {
action = "注销";
}
else {
action = "其他";
}
}

// 请求的IP
String ip = request.getRemoteAddr();

// 请求的浏览器
String webBrower = request.getHeader("User-Agent");

try {
// *========控制台输出=========*//
System.out.println("=====后置通知开始=====");
System.out.println("用户名:" + sysUser.getUserName());
System.out.println("姓名:" + sysUser.getRealName());
System.out.println("请求IP:" + ip);
System.out.println("浏览器:" + webBrower);
System.out.println("请求方法:"
+ (joinPoint.getTarget().getClass().getName() + "."
+ joinPoint.getSignature().getName() + "()"));
System.out.println("url:" + url);
System.out.println("模块:" + model);
System.out.println("动作:" + action);
System.out.println("cmd:" + cmd);

// *========数据库日志=========*//
SysLog sysLog = new SysLog();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sysLog.setLogTime(sdf.format(new Date()));
sysLog.setUserName(sysUser.getUserName());
sysLog.setRealName(sysUser.getRealName());
sysLog.setIp(ip);
sysLog.setWebBrower(webBrower);
sysLog.setModel(model);
sysLog.setAction(action);

// 保存数据库
sysLogService.persist(sysLog);
System.out.println("=====后置通知结束=====");
} catch (Exception e) {
// 记录本地异常日志
// logger.error("==前置通知异常==");
// logger.error("异常信息:{}", e.getMessage());
}
}
}


我在切点类中获得了response对象,怎么去取controller中的parameter的success值呢?请高人指点啊!
...全文
5222 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
liumanjiangjiahe 2017-10-27
  • 打赏
  • 举报
回复
@AfterReturning(pointcut="execution(* com.abc.service.*.many*(..))", returning="returnValue") public void log(JoinPoint point, Object returnValue) { System.out.println("@AfterReturning:模拟日志记录功能..."); System.out.println("@AfterReturning:目标方法为:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName()); System.out.println("@AfterReturning:参数为:" + Arrays.toString(point.getArgs())); System.out.println("@AfterReturning:返回值为:" + returnValue); System.out.println("@AfterReturning:被织入的目标对象为:" + point.getTarget()); }
时光_ 2017-02-17
  • 打赏
  • 举报
回复
HttpContextUtils是怎么写得
yanxin9210 2015-12-06
  • 打赏
  • 举报
回复
已经通过将操作结果放到request中实现了系统日志操作结果的监控

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧