文档章节

spring项目如何统计所有请求的返回码--项目安全防刷统计

明舞
 明舞
发布于 2015/11/04 14:42
字数 602
阅读 1677
收藏 83

        最近遇到个问题,一个简单的spring mvc的项目,但是经常被刷子刷,恶意暴力破解通信协议,不断尝试登陆系统,为了方便实时统计请求量和请求返回码的分布情况。最简单的逻辑:不断有人错误登陆,当次数多了,说明有问题了,有人在恶意刷我们的系统。

      那么这个问题的一个重要环节就是统计所有请求的返回码,方便离线大数据的同学分析,怎么记录返回码呢?总不能每次都定义一个log,在每个return里进行log.info吧。

returnMap.put("result", "500");
returnMap.put("msg", "数据库查询出错");
errorLogger.error("500,数据库查询出错", e);
return returnMap;

这种方式太恶心了,冗余代码一坨一坨的。

     目前本人想到的方式是通过自定义注解和aop来进行统计return的返回码。比如:一天有20%的请求成功,80%是失败,这样也方便我们分析。

    做法如下:

   自定义注解:在需要统计的方法上加这个统计注解

package com.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;

/**
 * @author
 */
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ControllerMetric {
	String description()  default ""; 
	AspectReturnTypeEnum type() default AspectReturnTypeEnum.String;
	String returnCode() default "result";
}

注解返回值的类型Enum:

package com.annotation;


/**
 * @author 
 * </br>
 * 用于在controller层拦截的时候定义的返回类型
 * 在ControllerAspect里会对不同的返回类型做不同 的处理。
 */
public enum AspectReturnTypeEnum {
	Map, 
	String, 
	JSON, 
	XML
}

定义的AOP切面:

package com.aop;


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.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.annotation.ControllerMetric;


/**
 * @author 
 */
@Aspect
@Component
public class ControllerAspect {
	private static final Logger logger = LoggerFactory.getLogger(ControllerAspect.class);

	@Pointcut("@annotation( com.annotation.ControllerMetric)")
	public void controllerAspect() {
	}

	@Around("controllerAspect()&&@annotation(log)")
	public Object doCountMetric(ProceedingJoinPoint pjp, ControllerMetric log) throws Throwable {
		logger.debug("enter doCountMetric ProceedingJoinPoint " + log.type() + "," + log.returnCode());
		Object[] args = pjp.getArgs();

		HttpServletRequest req = (HttpServletRequest) args[0];
		System.out.println("The request uri for this ProceedingJoinPoint is : " + req.getRequestURI());
		Object object = pjp.proceed();
		switch (log.type()) {
		case Map:
			Map ret = (java.util.Map) object;
			System.out.println(ret);
			break;
	     default:
		}
		logger.debug("leave doCountMetric ProceedingJoinPoint");
		return object;
	}
}

在Controller中用法

@Controller
@RequestMapping("/sdk/mobService/device")
/**
 * 可信设备相关的controller
 * @author liuxiaoming
 *
 */
public class EquipmentController {
	
	private static Logger mobLog = LoggerFactory.getLogger("mobLog");
	private static Logger errorLogger = LoggerFactory.getLogger(EquipmentController.class);
	@Autowired
	EquipmentServiceImpl equipmentServiceImpl;
	@Autowired
	MobUtil mobUtil;

	@RequestMapping("/bd")
	@ResponseBody
	@ControllerMetric
	public Map<String, String> bdDevice(HttpServletRequest request,
			HttpServletResponse response) {
		Map<String, String> returnMap = new HashMap<String, String>();
		return returnMap 
		
		}

    通过这种形式,所有的返回码都会被拦截,然后可以用一个日志去记录,我这里是直接输出了。

© 著作权归作者所有

明舞
粉丝 231
博文 424
码字总数 516555
作品 0
程序员
私信 提问
加载中

评论(13)

明舞
明舞 博主

引用来自“shking”的评论

nginx 也可看到返回状态吗

看nginx的log
yokebtc
yokebtc
nginx 也可看到返回状态吗
yq_xx
yq_xx
学习
啦啦啦拉拉
啦啦啦拉拉

引用来自“明舞”的评论

引用来自“canghailan”的评论

用Filter拦截所有请求处理应该更方便?

个人觉得filter的配置形式不够灵活,不如annotation+aop形式灵活。而且filter获取spring的上下文极为麻烦

有spring的拦截器,可以获取httphemodel and view
单行道
单行道
学习
wms1
wms1
这种应用侵入式监控是最差的做法。。。。
第一:你要监控的是http响应码,那么你就不应该在控制层监控
第二:tomcat本身可以提供类似的监控
第三:非侵入式监控,可以采用javaagent代理,进行jvm级字节码增强来达到监控。(目前我正在写的一个应用监控,就是采用这种模式)
德胜
德胜
Spring4.1新增了一个接口ResponseBodyAdvice接口, 可以实现拦截@ResponseBody注解的返回值, 你可以看看, 配合@ControllerAdvice注解.
魔仙剑痴
开tomcat http-log 使用logstash即可。
金贞花
金贞花
。。
明舞
明舞 博主

引用来自“canghailan”的评论

用Filter拦截所有请求处理应该更方便?

个人觉得filter的配置形式不够灵活,不如annotation+aop形式灵活。而且filter获取spring的上下文极为麻烦
luxda/redislimiter-spring-boot

redislimiter-spring-boot 一个优秀的分布式spring boot/Spring Cloud API限流框架,特别适合微服务架构. 快速开始 1. git clone https://github.com/tangaiyun/redislimiter-spring-boot.g......

luxda
2018/12/10
0
0
Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。

时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式。 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制,但其实...

ityouknow
2018/10/28
0
0
SpringBoot Actuator监控应用

微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现异常如何快速定位便成...

zw965
09/23
41
0
SpringCloud 微服务 (十二) 服务网关 Zuul 基础

壹 本节记录学习服务网关的基础内容 在没有网关的时候,如果有很多服务:order,product ... 那么客户端会和每个服务一一打交道,这明显不是一个好方式,需要一个服务来充当请求的统一的入口,就是...

___大侠
2018/07/07
256
0
Spring Boot 2.0(五):感受 Docker 魅力, 排解决多应用部署之疼

我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的便利,是的,我也是这样认为的,I know your felling 。 前期了解概念什么的确实比较无聊,请不...

纯洁微笑
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

idea修改新的git地址

我们在项目变动中通常会遇到更换git地址情况,这里介绍一个在idea项目中简单更换git地址操作: 1、点击VCS; 2、点击Git; 3、点击Remotes; 具体步骤如图 4、点击框中链接即可在右边看到一个...

west_coast
14分钟前
4
0
将规则集传递给mixin

允许包装在mixin中定义的css块。 分离的规则集是一组CSS属性、嵌套规则集、媒体声明或者是存储在变量中的任何其他内容,我们可以将它包含在规则集中或其他结构中,并且所有属性都将复制到那里...

凌兮洛
16分钟前
2
0
玩转阿里云 Terraform(一):Terraform 是什么

从本文起,我将陆续推出一系列有关 Terraform 的文章,从概念,特点,工作机制,用法以及最佳实践等多个方面由浅入深的向大家介绍如何在阿里云上玩转 Terraform。同时也希望借此机会,与感兴...

阿里云官方博客
16分钟前
3
0
科研大数据面临的挑战

近几十年硬件的发展非常迅猛,第一台Macintosh苹果电脑的内存是128KB(0.13MB),现在很多笔记本配的是8GB的内存,硬盘1TB(1024GB),2TB的很常见。大型的数据服务器上还会有更大的储容量,...

英论阁学术院
16分钟前
4
0
python学习10.09:Python列表和元组的底层实现

有关列表(list)和元组(tuple)的底层实现,本节分别从它们的源码来进行分析。 首先来分析 list 列表,它的具体结构如下所示: typedef struct { PyObject_VAR_HEAD /* Vector o...

太空堡垒185
17分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部