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;
    }
}

总结

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

相关文章

  • 基于solr全文检索实现原理(详谈)

    基于solr全文检索实现原理(详谈)

    下面小编就为大家分享一篇基于solr全文检索实现原理详谈,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • Java 基于AQS实现一个同步器

    Java 基于AQS实现一个同步器

    这篇文章主要介绍了如何基于AQS实现一个同步器,帮助大家更好的理解和学习Java并发,感兴趣的朋友可以了解下
    2020-09-09
  • spring使用RedisTemplate操作Redis数据库

    spring使用RedisTemplate操作Redis数据库

    这篇文章主要介绍了spring使用RedisTemplate操作Redis数据库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • java组件fileupload文件上传demo

    java组件fileupload文件上传demo

    这篇文章主要为大家详细介绍了java组件fileupload文件上传demo ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • springboot项目部署到k8s上的方法步骤

    springboot项目部署到k8s上的方法步骤

    本文主要介绍了springboot项目部署到k8s上的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 自定义mybatis插件如何实现sql日志打印

    自定义mybatis插件如何实现sql日志打印

    这篇文章主要介绍了自定义mybatis插件如何实现sql日志打印问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Java中比较器Comparator和Comparable的区别

    Java中比较器Comparator和Comparable的区别

    这篇文章主要介绍了Java中比较器Comparator和Comparable的区别,我们在使用 Collections.sort()对链表进行排序时,常常需要根据不同情况自定义排序规则,今天我们来看看比较器之间的区别,需要的朋友可以参考下
    2023-08-08
  • Java反射框架Reflections示例详解

    Java反射框架Reflections示例详解

    这篇文章主要介绍了Java反射框架Reflections示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java设计模式之责任链模式

    Java设计模式之责任链模式

    今天小编就为大家分享一篇关于Java设计模式之责任链模式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 分享5个Java接口性能提升的通用技巧

    分享5个Java接口性能提升的通用技巧

    作为后端开发人员,我们总是在编写各种API。这些API在服务初期可能表现不错,但随着用户数量的增长,一开始响应很快的API越来越慢,这时候你就需要考虑如何优化你的API性能了。在这篇文章中,我总结了一些行之有效的API性能优化技巧,希望能给有需要的朋友一些帮助
    2023-01-01

最新评论