SpringBoot中实现代理方式

 更新时间:2023年06月15日 17:05:44   作者:看山也看水  
这篇文章主要介绍了SpringBoot中实现代理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

SpringBoot实现代理

功能

定义一个功能,使指定的方法执行前后输出日志信息。

1. 定义一个注解,添加的方法上具有该功能,或者添加到类上,类下的所有方法都具有该功能

@Target( {ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAround {
}

2. 实现PointCut接口,找出标注注解的方法或类

// 这里是直接继承了一个便捷基类,实现 matches 方法
public class LogAroundPointcut extends StaticMethodMatcherPointcut {
	@Override
	public boolean matches(Method method, Class<?> targetClass) {
		return AnnotatedElementUtils.hasAnnotation(targetClass, LogAround.class) ||
				AnnotatedElementUtils.hasAnnotation(method, LogAround.class);
	}
}

3. 实现 Advice,定义增强行为

// 这里继承了 MethodInterceptor,方法拦截。前后打印日志
public class LogAroundInterceptor implements MethodInterceptor {
	@Nullable
	@Override
	public Object invoke(@Nonnull MethodInvocation invocation) throws Throwable {
		System.out.println("before method invoke log....");
		Method method = invocation.getMethod();
		Object[] args = invocation.getArguments();
		Object target = invocation.getThis();
		Object invoke = method.invoke(target, args);
		System.out.println("after method invoke log....");
		return invoke;
	}
}

4. 定义一个 Advisor ,把这两个组合起来,并添加到 Spring 中

@Component
public class LogAroundPointcutAdvisor extends AbstractPointcutAdvisor {
	@Override
	public Pointcut getPointcut() {
		return new LogAroundPointcut();
	}
	@Override
	public Advice getAdvice() {
		return new LogAroundInterceptor();
	}
	@Override
	public boolean isPerInstance() {
		return false;
	}
}

5. 测试bean

@Component
public class AopDemo {
	@LogAround
	public static int sum(int i1, int i2) {
		return i1 + i2;
	}
}

6. 测试结果

前后有打印日志,代理成功

SpringBoot实现反向代理

背景:在前后端分离的项目中,有一天后端项目因为某些原因不能暴露在公网地址,此时为了修改最少,利用反向代理技术进行实现。

这种不是解决方案,曲线救国。

1. 引入依赖

  <dependency>
     <groupId>org.mitre.dsmiley.httpproxy</groupId>
       <artifactId>smiley-http-proxy-servlet</artifactId>
        <version>1.12</version>
</dependency>

2. 配置文件

将本地项目的 /baidu/* 下的请求转发至https://baidu.com

/baidu/* 前面一定要加 /

proxy:
  baidu:
    url: /baidu/*
    target_url: https://baidu.com

3. 配置代理

package athena.gateway.app.banshi;
import org.mitre.dsmiley.httpproxy.ProxyServlet;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SolrProxyServletConfiguration {
    @Value("${proxy.baidu.url}")
    private String url;
    @Value("${proxy.baidu.target_url}")
    private String targetUrl;
    @Bean
    public ServletRegistrationBean servletRegistrationBean() {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ProxyServlet(), url);
        servletRegistrationBean.setName("百度");
        servletRegistrationBean.addInitParameter("targetUri", targetUrl);
        servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, String.valueOf(true));
        return servletRegistrationBean;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot基于自定义注解实现切面编程

    SpringBoot基于自定义注解实现切面编程

    这篇文章主要介绍了SpringBoot基于自定义注解实现切面编程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 详解Java使用super和this来重载构造方法

    详解Java使用super和this来重载构造方法

    这篇文章主要介绍了详解Java使用super和this来重载构造方法的相关资料,这里提供实例来帮助大家理解这部分内容,需要的朋友可以参考下
    2017-08-08
  • 详解Java如何利用数字描述更多的信息

    详解Java如何利用数字描述更多的信息

    在数据库里面 ,通常我们会用数字的递进来描述状态等信息 , 但是如果想进行更复杂的操作 , 就有必要对二进制有一定理解了。本文就来趣味性的探讨一下 , 如何通过更少的空间描述更多的信息
    2022-09-09
  • Java实现将Word和PDF转成一张垂直拼接长图的工具类

    Java实现将Word和PDF转成一张垂直拼接长图的工具类

    这篇文章主要为大家详细介绍了如何使用Java编写一个将Word和PDF转成一张垂直拼接长图的工具类,支持doc和docx,有需要的小伙伴可以了解下
    2025-10-10
  • Java8 Instant 时间戳实例讲解

    Java8 Instant 时间戳实例讲解

    Instant类是Java8 中补充的一个 时间戳类,nstant 可以使用静态方法 now()或者of()方法来创建一个实例对象,本文通过实例代码讲解Java8 Instant 时间戳,感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • Java之Spring简单的读取和存储对象

    Java之Spring简单的读取和存储对象

    这篇文章主要介绍了Spring的读取和存储对象,获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊,想进一步了解的同学可以参考本文
    2023-04-04
  • JAVA中Spring Security示例及常见问题

    JAVA中Spring Security示例及常见问题

    文章概述Spring Security OAuth2与JWT模块的版本兼容性及迁移建议,强调2.5.x支持JDK8但已弃用,推荐新项目使用SpringAuthorizationServer(Spring Boot3.x+),并指出依赖冲突、配置示例及密钥安全注意事项,感兴趣的朋友一起看看吧
    2025-07-07
  • SpringBoot+layui实现文件上传功能

    SpringBoot+layui实现文件上传功能

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。这篇文章主要介绍了SpringBoot+layui实现文件上传,需要的朋友可以参考下
    2018-09-09
  • javaweb中静态文件的常用处理方法汇总

    javaweb中静态文件的常用处理方法汇总

    这篇文章主要介绍了javaweb中静态文件的常用处理方法汇总,非常实用的技巧,需要的朋友可以参考下
    2014-08-08
  • 浅谈Java编程ToString()方法重写的意义

    浅谈Java编程ToString()方法重写的意义

    这篇文章主要介绍了浅谈Java编程ToString()方法重写的意义,还是挺不错的,这里分享给大家,供朋友们学习和参考。
    2017-10-10

最新评论