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

最近遇到个问题,一个简单的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 

		}

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

时间: 2024-10-27 06:04:31

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

XMLHttpRequest HTTP请求的返回码为0 http status = 0

由于用户在http返回前关闭/取消,或者防火墙等原因,会造成http请求没有status信息.w3c有相应的说明:http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute 4.7.1 The status attribute client . status Returns the HTTP status code. The status attribute must return the result of running these s

2,HTTP请求应答返回码

200 OK 请求成功,一般用于Get和Post请求 300 多种选择.请求的资源可包括多个位置,响应的返回一个资源特征与地址的列表用于浏览器(client)选择 Multiple Choices 301 永久移动.请求的资源被永久移到新的url,返回信息会包括新的url,浏览器自动定向新url moved permanently302 临时移动.客户端继续使用原有url Found 304 未修改 Not Modified 400 客户端请求的语法错误,服务器无法理解 Bad request

常见的HTTP请求应答返回码列表

200      OK 请求成功.一般用于GET与POST请求 300 Multiple Choices 多种选择.请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 301 Moved Permanently 永久移动.请求的资源已被永久的移动到新的URI,返回信息会包括新的URI,浏览器会自动定向到新URI.今后任何新的请求都应使用新的URI代替 302 Found 临时移动.与301类似.但资源只是临时被移动.客户端应继续使用原有的URI 400

Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理

Spring Boot AOP之对请求的参数入参与返回结果进行拦截处理 本文链接:https://blog.csdn.net/puhaiyang/article/details/78146620 本文链接:https://blog.csdn.net/puhaiyang/article/details/78146620 spring Aop切面中的@Before @Around等执行顺序与请求参数统一解码 https://www.cnblogs.com/newAndHui/p/11771035.h

【移动前端开发实践】从无到有(统计、请求、MVC、模块化)H5开发须知

前言 不知不觉来百度已有半年之久,这半年是996的半年,是孤军奋战的半年,是跌跌撞撞的半年,一个字:真的是累死人啦! 我所进入的团队相当于公司内部创业团队,人员基本全部是新招的,最初开发时连数据库都没设计,当时评审需求的时候居然有一个产品经理拿了一份他设计的数据库,当时我作为一个前端就惊呆了...... 最初的前端只有我1人,这事实上与我想来学习学习的愿望是背道而驰的,但既然来都来了也只能独挑大梁,马上投入开发,当时涉及的项目有: ① H5站点 ② PC站点 ③ Mis后台管理系统 ④ 各种百度

Spring MVC 体系结构和处理请求控制器

①MVC小结: 1.MVC处理过程 对于MVC的三部分(模型Model.视图View.控制器Controller)功能职责分别进行了相应的阐述,并描述了各部分之间的调用关系. MVC整体的处理过程: (1)首先视图提供系统与用户交互的界面,并发送用户输入给控制器. (2)控制器接受用户的请求,并决定应该调用那个模型来进行处理. (3)模型根据用户请求进行相应的业务逻辑处理,并返回处理结果(数据). (4)控制器根据返回的处理结果,调用相应的视图格式化模型返回的数据,并通过视图呈现给用户结果. 2

Spring MVC学习之三:处理方法返回值的可选类型

转自:http://www.cnblogs.com/cuizhf/p/3810652.html ———————————————————————————————————————————————————————————— spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void.下面将对具体的一一进行说明: ModelAndView @RequestMapping("/show1") publ

ICE学习第四步-----客户端请求服务器返回数据

这次我们来做一个例子,流程很简单:客户端向服务器发送一条指令,服务端接收到这条指令之后,向客户端发送数据库中查询到的数据,最终显示在DataGridView上. 根据上一篇文章介绍的Slice语法,我们先来定义ICE文件.我定义两个ICE文件,一个用来描述测试数据库表中属性相关信息,另一个则是请求数据的方法. 结构如下:    定义结构体,和数据库中表的列对应,添加序列(相当于数组类型). 在获取表的方法中注意要记得#include带有结构的ice文件,并把接口函数的返回值类型写成之前定义的数组

关于多个Ajax请求执行返回先后的问题

注:转载请在显著地方标注来源 有时候在一个业务事件处理流程上,可能会遇到点击了一个按钮或者其他事件触发了一个动作 需要执行两个以上的Ajax请求,但是可能要顾虑到Ajax请求执行的先后顺序,有时候Ajax请求顺序出问题,会导致各种问题 例如现在有两个ajax事件,分别为ajax1 ,ajax2 一个叫做main的方法调用执行入口 1. function main(){ ajax1(data,callback); ajax2(data,callback); } 如果我们按照上面的方法去执行,表面上