- 浏览: 46794 次
最新评论
网页中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; }
发表评论
-
简单的压测模拟
2018-05-11 19:52 675import java.time.Duration; i ... -
Java的驼峰与下划线的属性对象互相转换
2018-05-11 19:50 8426import com.xxxx.util.consta ... -
Elastic Search搜索实例
2019-06-16 18:30 646要从现在的公司离职了。记录一下自己针对我们的自己需求所做的搜索 ... -
针对基于Redis Cluster的接口数据缓存删除实现
2018-03-26 10:35 1250首先定义个工具interface,基于Java 8的实现. 主 ... -
简单ELK配合logback搭建日志监控中心
2018-03-20 17:30 1348今天得闲就自己搭了个ELK示例,过程挺简单的。 Elas ... -
spring的基于java的项目配置示例2
2018-03-20 17:32 853import com.xxx.support.config ... -
HttpClient实例
2018-03-16 08:15 665import java.io.IOException; ... -
spring的基于java的项目配置示例1
2018-03-16 08:26 941spring的基于java的项目配置示例。 impor ... -
基于spring data的Elastic Search的配置示例
2018-03-15 17:41 916基于spring data的Elastic Search的配置 ... -
方便jedis cluster操作的工具类
2018-03-15 17:37 3031由于redis的集群 redis cluster不支持keys ... -
爬虫基础类
2018-03-15 17:28 811自己封装的爬虫基础类。 public interfac ... -
Java Timestamp从MySQL数据库取出的字符串转换为LocalDateTime
2016-01-26 16:08 9931最新在工作中使用了Java 8的LocalDate ... -
reviewC指针
2014-03-02 22:05 372由于要考试,有C的考核内容。所以今天把C拉出来又看了下,其实基 ... -
Python2.X内置函数学习
2013-12-19 21:52 11721.apply()函数 学过Python的都知道P ... -
学习Python中遇到的问题
2013-09-04 23:26 721最近学习Python中。 先上代码: # -*- codi ...
相关推荐
基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于...
基于AOP的系统实现研究基于AOP的系统实现研究
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
【基于AOP的系统容错应用研究】 在信息技术领域,系统容错是保障软件系统稳定性和可靠性的重要手段。本文主要探讨了面向切面编程(Aspect-Oriented Programming, AOP)在系统容错中的应用,旨在提高软件系统的可用...
本文将深入探讨如何基于AOP(面向切面编程)来实现Spring的事务管理,特别是通过TransactionProxyFactoryBean。让我们一起探索这个主题。 首先,了解什么是AOP。AOP是Spring框架的核心特性,它允许我们在不修改业务...
而面向方面编程(AOP)的主要目标就是分离横切关注点,因此,单元测试非常适合用AOP来解决。该文提出了在对面向对象程序进行单元测试时遇到的问题,并用AOP方法加以解决,同时比较了传统方法和AOP方法进行单元测试的优...
为了研究代码混淆技术的安全性,利用AOP提供的连接点模型和字节码操作机制,提出了一种新的针对混淆代码的攻击方法,其操作均在字节码级别上完成。实验证明,该方法不需要获取目标程序的源代码,从而使代码混淆失去意义;...
本文首先将传统基于OOP策略模式的局限性进行分析说明,提出基本的策略模式以及“链式”策略模式基于AOP的具体实现,解决传统策略模式可能出现的代码分散、代码混乱问题;接着进行复杂度方面的实验对比分析;最后分析...
"基于AOP的Java异常处理框架和工具的分析与设计" 本文主要探讨了基于AOP(Aspect-Oriented Programming,面向方面编程)的Java异常处理框架和工具的分析与设计。 异常处理机制是当前软件系统的重要组成部分,被大...
无论是基于XML的AOP配置还是基于注解的AOP配置,其核心都是将横切关注点从业务逻辑中分离出来,从而实现更好的代码组织和管理。选择哪种配置方式取决于项目的具体需求和个人偏好。对于简单的项目或小型团队,基于...
该项目为基于AOP和Annotation技术的AutoLoadCache缓存管理解决方案源码,总计220个文件,涵盖137个Java源文件、33个XML配置文件、25个Markdown文档、6个PNG图片、5个JavaScript文件、3个YAML配置文件、2个Git忽略...
【基于AOP的大赛信息管理系统权限设计】 在大型信息系统中,权限管理是不可或缺的一部分,尤其在大赛信息管理系统中,权限的动态分配、可重用性和可移植性显得尤为重要。传统的权限管理模式往往与其他模块紧密耦合...
本项目是一款基于AOP技术的Java敏感信息处理源码,包含40个文件,涵盖13个Java源文件、4个CSS样式文件、4个映射文件、3个JavaScript脚本文件、3个YAML配置文件、2个XML文件、2个SQL文件、2个PNG图片文件、2个HTML...
【标题】:基于AOP的Java混淆代码攻击研究 【摘要】:本文主要探讨了一种新的针对基于面向方面编程(AOP)的Java混淆代码的攻击方法。通过对AOP提供的连接点模型和字节码操作机制的利用,作者提出了一种无需目标...
### 基于AOP的智能Web缓存框架 #### 概述 随着互联网技术的飞速发展,Web应用程序的需求量急剧增加,这对服务器的处理能力提出了更高的要求。为了提高Web应用系统的性能,缓存技术成为了优化用户体验的重要手段之...
《基于AOP和IOC技术的MIS系统深度解析》 MIS(Management Information System,管理信息系统)是企业信息化的重要组成部分,旨在通过收集、处理、分析数据,为管理者提供决策支持。在当前信息技术日新月异的时代,...
然而,随着Spring的发展,基于注解的AOP配置逐渐成为主流,因为它的简洁性和可读性更强。但这并不意味着XML配置方式失去了价值,尤其是在需要更细粒度控制或者与旧项目集成时,XML配置依然有着其独特的优势。 总的...
基于AOP编织技术的缓存框架研究和实现.caj 做毕业论文参考