`

基于AOP的ajax的referrer判断

阅读更多
网页中ajax请求的referrer的值是当前域名。(其实这个工作nginx来做最好)
所以对于一些简单的安全验证可以通过这样的方式来做。
下面是我的实现。

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 用于ajax请求时,通过referrer对请求合法性做验证的注解
 * 注解的controller方法中必须包含HttpServletRequest和HttpServletResponse参数且参数被放置与参数列表最后request在前response在后
 *
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface AjaxReferrerAuthentication {

	String hostString() default "xxxxxx.com";
}


import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.xxx.h5.support.annotation.AjaxReferrerAuthentication;
import com.xxx.h5.vo.MessageEntity;

@Aspect
@Component
public class AjaxReferrerAspect {

	private final Logger logger = LoggerFactory.getLogger(getClass());

	@Around(value = "execution(public * com.xxx.h5.controller..*(..)) && args(..,request,response) && @annotation(ajaxReferrer)")
	public MessageEntity authenticationReferrer(ProceedingJoinPoint jp,
			HttpServletRequest request, HttpServletResponse response, AjaxReferrerAuthentication ajaxReferrer) {

		// 由于Http规范以前对referrer写错,所以对两种写法都兼容下
		String referrer = StringUtils.isNotEmpty(request.getHeader("referer")) ? request.getHeader("referer")
				: request.getHeader("referrer"),
				errMsg = "";
		URL referrerURL = null;
		MessageEntity me = null;
		try {

			referrerURL = new URL(referrer);
		} catch (MalformedURLException e) {

			logger.info("验证referrer时,解析referrer地址异常");
			logger.info(jp.getClass() + "=>方法=>" + jp.getSignature() + "参数=>"
					+ Stream.of(jp.getArgs())
					.map(String::valueOf)
					.collect(Collectors.joining(",")));
			logger.error(e.getMessage());
			return me;
		}

		// 使用AjaxReferrerAuthentication注解的controller方法只给ajax请求,所以如果是从我们自己的页面过来的ajax请求一定是带上referrer的
		if (StringUtils.isEmpty(referrer)) {

			errMsg = "非法请求";
		} else if (!referrerURL.getHost().endsWith(ajaxReferrer.hostString())) {

			errMsg = "非法请求";
		}
		if (StringUtils.isNotEmpty(errMsg)) {

			try {
				response.sendError(HttpServletResponse.SC_FORBIDDEN);
			} catch (IOException e) {

				logger.info("验证referrer时,返回Http状态时异常(IO异常)");
				logger.info(jp.getClass() + "=>方法=>" + jp.getSignature() + "参数=>"
						+ Stream.of(jp.getArgs())
						.map(String::valueOf)
						.collect(Collectors.joining(",")));
				logger.error(e.getMessage());
			}
			return me;
		}
		try {
			me = (MessageEntity) jp.proceed();
		} catch (Throwable e) {

			logger.info("验证referrer后,执行切点方法时异常");
			logger.info(jp.getClass() + "=>方法=>" + jp.getSignature() + "参数=>"
					+ Stream.of(jp.getArgs())
					.map(String::valueOf)
					.collect(Collectors.joining(",")));
			logger.error(e.getMessage());
		}
		return me;
	}
0
0
分享到:
评论

相关推荐

    基于springmvc实现文件上传下载 基于AOP的日志功能

    基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于...

    基于AOP的系统实现研究

    基于AOP的系统实现研究基于AOP的系统实现研究

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    基于AOP的系统容错研究论文

    【基于AOP的系统容错应用研究】 在信息技术领域,系统容错是保障软件系统稳定性和可靠性的重要手段。本文主要探讨了面向切面编程(Aspect-Oriented Programming, AOP)在系统容错中的应用,旨在提高软件系统的可用...

    spring基于AOP实现事务

    本文将深入探讨如何基于AOP(面向切面编程)来实现Spring的事务管理,特别是通过TransactionProxyFactoryBean。让我们一起探索这个主题。 首先,了解什么是AOP。AOP是Spring框架的核心特性,它允许我们在不修改业务...

    基于AOP的面向对象程序的单元测试

    而面向方面编程(AOP)的主要目标就是分离横切关注点,因此,单元测试非常适合用AOP来解决。该文提出了在对面向对象程序进行单元测试时遇到的问题,并用AOP方法加以解决,同时比较了传统方法和AOP方法进行单元测试的优...

    基于AOP的Java混淆代码攻击的研究

    为了研究代码混淆技术的安全性,利用AOP提供的连接点模型和字节码操作机制,提出了一种新的针对混淆代码的攻击方法,其操作均在字节码级别上完成。实验证明,该方法不需要获取目标程序的源代码,从而使代码混淆失去意义;...

    基于AOP策略模式的实现机制

    本文首先将传统基于OOP策略模式的局限性进行分析说明,提出基本的策略模式以及“链式”策略模式基于AOP的具体实现,解决传统策略模式可能出现的代码分散、代码混乱问题;接着进行复杂度方面的实验对比分析;最后分析...

    基于AOP的Java异常处理框架和工具的分析与设计.pdf

    "基于AOP的Java异常处理框架和工具的分析与设计" 本文主要探讨了基于AOP(Aspect-Oriented Programming,面向方面编程)的Java异常处理框架和工具的分析与设计。 异常处理机制是当前软件系统的重要组成部分,被大...

    AOP的相关概念,基于XML的AOP的配置,基于注解的AOP配置

    无论是基于XML的AOP配置还是基于注解的AOP配置,其核心都是将横切关注点从业务逻辑中分离出来,从而实现更好的代码组织和管理。选择哪种配置方式取决于项目的具体需求和个人偏好。对于简单的项目或小型团队,基于...

    基于AOP+Annotation的AutoLoadCache设计源码

    该项目为基于AOP和Annotation技术的AutoLoadCache缓存管理解决方案源码,总计220个文件,涵盖137个Java源文件、33个XML配置文件、25个Markdown文档、6个PNG图片、5个JavaScript文件、3个YAML配置文件、2个Git忽略...

    基于AOP的大赛信息管理系统权限设计

    【基于AOP的大赛信息管理系统权限设计】 在大型信息系统中,权限管理是不可或缺的一部分,尤其在大赛信息管理系统中,权限的动态分配、可重用性和可移植性显得尤为重要。传统的权限管理模式往往与其他模块紧密耦合...

    基于AOP的Java敏感信息模糊查询与动态脱敏设计源码

    本项目是一款基于AOP技术的Java敏感信息处理源码,包含40个文件,涵盖13个Java源文件、4个CSS样式文件、4个映射文件、3个JavaScript脚本文件、3个YAML配置文件、2个XML文件、2个SQL文件、2个PNG图片文件、2个HTML...

    基于AOP的Java混淆代码攻击的研究.pdf

    【标题】:基于AOP的Java混淆代码攻击研究 【摘要】:本文主要探讨了一种新的针对基于面向方面编程(AOP)的Java混淆代码的攻击方法。通过对AOP提供的连接点模型和字节码操作机制的利用,作者提出了一种无需目标...

    基于AOP的智能web缓存框架.pdf

    ### 基于AOP的智能Web缓存框架 #### 概述 随着互联网技术的飞速发展,Web应用程序的需求量急剧增加,这对服务器的处理能力提出了更高的要求。为了提高Web应用系统的性能,缓存技术成为了优化用户体验的重要手段之...

    基于AOP和IOC技术的MIS系统

    《基于AOP和IOC技术的MIS系统深度解析》 MIS(Management Information System,管理信息系统)是企业信息化的重要组成部分,旨在通过收集、处理、分析数据,为管理者提供决策支持。在当前信息技术日新月异的时代,...

    Spring 基于基于XML配置方式实现AOP

    然而,随着Spring的发展,基于注解的AOP配置逐渐成为主流,因为它的简洁性和可读性更强。但这并不意味着XML配置方式失去了价值,尤其是在需要更细粒度控制或者与旧项目集成时,XML配置依然有着其独特的优势。 总的...

    基于AOP编织技术的缓存框架研究和实现

    基于AOP编织技术的缓存框架研究和实现.caj 做毕业论文参考

Global site tag (gtag.js) - Google Analytics