SpringBoot中實現(xiàn)代理方式
SpringBoot實現(xiàn)代理
功能
定義一個功能,使指定的方法執(zhí)行前后輸出日志信息。
1. 定義一個注解,添加的方法上具有該功能,或者添加到類上,類下的所有方法都具有該功能
@Target( {ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface LogAround { }
2. 實現(xiàn)PointCut
接口,找出標注注解的方法或類
// 這里是直接繼承了一個便捷基類,實現(xiàn) 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. 實現(xiàn) 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. 測試結(jié)果
前后有打印日志,代理成功
SpringBoot實現(xiàn)反向代理
背景:在前后端分離的項目中,有一天后端項目因為某些原因不能暴露在公網(wǎng)地址,此時為了修改最少,利用反向代理技術(shù)進行實現(xiàn)。
這種不是解決方案,曲線救國。
1. 引入依賴
? <dependency> ?? ? <groupId>org.mitre.dsmiley.httpproxy</groupId> ? ?? ? <artifactId>smiley-http-proxy-servlet</artifactId> ? ??? ? <version>1.12</version> </dependency>
2. 配置文件
將本地項目的 /baidu/* 下的請求轉(zhuǎn)發(fā)至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; ? ? } }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
java面試常見問題---ConcurrentHashMap
ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。Segment的結(jié)構(gòu)和HashMap類似,是一種數(shù)組和鏈表結(jié)構(gòu),今天給大家普及java面試常見問題---ConcurrentHashMap知識,一起看看吧2021-06-06IDEA 2020.1 搜索不到Chinese (Simplified) Language
小編在安裝中文插件時遇到IDEA 2020.1 搜索不到Chinese ​(Simplified)​ Language Pack EAP,無法安裝的問題,本文給大家分享我的解決方法,感興趣的朋友一起看看吧2020-04-04java Socket實現(xiàn)簡單模擬HTTP服務器
這篇文章主要介紹了java Socket實現(xiàn)簡單模擬HTTP服務器,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05Java Spring開發(fā)環(huán)境搭建及簡單入門示例教程
這篇文章主要介紹了Java Spring開發(fā)環(huán)境搭建及簡單入門示例,結(jié)合實例形式分析了spring環(huán)境搭建、配置、使用方法及相關注意事項,需要的朋友可以參考下2017-11-11