当前位置: 首页 > news >正文

方维网站建设营销型网站建设专家

方维网站建设,营销型网站建设专家,代做效果图网站好,php一台电脑做网站一、背景 在我们日常项目中,常常会将用户的认证信息存入缓存中,方便我们在程序执行中,进行获取用户信息。本篇文章主要是介绍使用自定义注解和AOP切面技术进行实现,这也也是非常容易使用的。 二、代码详解 2.1 自定义注解 定义…

一、背景

在我们日常项目中,常常会将用户的认证信息存入缓存中,方便我们在程序执行中,进行获取用户信息。本篇文章主要是介绍使用自定义注解和AOP切面技术进行实现,这也也是非常容易使用的。

二、代码详解

2.1 自定义注解

定义一个注解,用于标记需要自动注入当前用户信息的方法。

import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  @Target(ElementType.METHOD)  
@Retention(RetentionPolicy.RUNTIME)  
public @interface InjectCurrentUser {  
}
2.2 创建切面

创建一个切面来拦截所有标记了@InjectCurrentUser注解的方法,并在调用它们之前获取当前用户信息,然后作为参数传递给这些方法(注意:Java的方法签名在编译时是固定的,不能直接向现有方法添加参数。因此,这里假设我们修改方法签名以接受用户信息作为参数,或者使用其他方式如ThreadLocal)。

@Aspect  
@Component  
public class UserAspect {  @Before("@annotation(InjectCurrentUser)")  public void beforeMethod(JoinPoint joinPoint) {  Authentication authentication = SecurityContextHolder.getContext().getAuthentication();  if (authentication != null && authentication.getPrincipal() instanceof UserDetails) {  UserDetails userDetails = (UserDetails) authentication.getPrincipal();  UserContextHolder.setCurrentUser(userDetails);  // 如果需要,可以在这里添加日志或其他逻辑  System.out.println("Setting current user: " + userDetails.getUsername());  }  }  // 可以添加一个@After或@AfterReturning切面来清除ThreadLocal中的用户信息  // 这样做是为了避免内存泄漏,尤其是在长时间运行的线程或线程池中  @After("@annotation(InjectCurrentUser)")  public void afterMethod(JoinPoint joinPoint) {  UserContextHolder.clearCurrentUser();  }  
}
2.3 创建ThreadLocal存储用户信息

定义一个ThreadLocal来存储当前用户的信息(比如UserDetails

public class UserContextHolder {  private static final ThreadLocal<UserDetails> currentUser = new ThreadLocal<>();  public static void setCurrentUser(UserDetails userDetails) {  currentUser.set(userDetails);  }  public static UserDetails getCurrentUser() {  return currentUser.get();  }  // 清除ThreadLocal中的用户信息,避免内存泄漏  public static void clearCurrentUser() {  currentUser.remove();  }  
}
2.4 业务逻辑中获取用户信息

业务逻辑中,通过UserContextHolder.getCurrentUser()来获取当前用户的信息

public class SomeService {  public void someBusinessMethod() {  UserDetails user = UserContextHolder.getCurrentUser();  if (user != null) {  // 使用用户信息进行业务逻辑处理  System.out.println("Doing something with user: " + user.getUsername());  }  }  
}

三、总结

内存泄漏ThreadLocal可能会导致内存泄漏,特别是当使用线程池时,因为线程可能会被重用,而ThreadLocal中的值可能不会被自动清除。因此,在不再需要时显式清除ThreadLocal中的值是一个好习惯。
依赖注入:尽管在这个例子中我们使用了AOP来设置ThreadLocal,但在某些情况下,你可能还想通过依赖注入来传递用户信息,特别是当你需要在多个组件或服务之间共享用户信息时。然而,对于跨线程或跨方法调用的情况,ThreadLocal通常是一个更好的选择。


文章转载自:
http://dedicated.mzpd.cn
http://endopleura.mzpd.cn
http://jetsam.mzpd.cn
http://comitative.mzpd.cn
http://fourfold.mzpd.cn
http://potoroo.mzpd.cn
http://antiremonstrant.mzpd.cn
http://ingression.mzpd.cn
http://antimonarchical.mzpd.cn
http://anathema.mzpd.cn
http://complexionless.mzpd.cn
http://acnode.mzpd.cn
http://scaup.mzpd.cn
http://empyreuma.mzpd.cn
http://corky.mzpd.cn
http://emigratory.mzpd.cn
http://aetatis.mzpd.cn
http://exoergic.mzpd.cn
http://pushball.mzpd.cn
http://though.mzpd.cn
http://candlelight.mzpd.cn
http://pretermit.mzpd.cn
http://adorning.mzpd.cn
http://coequal.mzpd.cn
http://unijunction.mzpd.cn
http://sanforized.mzpd.cn
http://sweatful.mzpd.cn
http://bedplate.mzpd.cn
http://baize.mzpd.cn
http://jeff.mzpd.cn
http://exact.mzpd.cn
http://summiteer.mzpd.cn
http://vertiginous.mzpd.cn
http://bossy.mzpd.cn
http://billfish.mzpd.cn
http://heartbroken.mzpd.cn
http://jurisprdence.mzpd.cn
http://suspensible.mzpd.cn
http://thousands.mzpd.cn
http://orthomorphic.mzpd.cn
http://pud.mzpd.cn
http://downhold.mzpd.cn
http://sumpter.mzpd.cn
http://saccharomyces.mzpd.cn
http://surgeless.mzpd.cn
http://urologist.mzpd.cn
http://vincula.mzpd.cn
http://guerrillero.mzpd.cn
http://fleurette.mzpd.cn
http://humoursome.mzpd.cn
http://somesthetic.mzpd.cn
http://vapidity.mzpd.cn
http://semmit.mzpd.cn
http://halachist.mzpd.cn
http://indult.mzpd.cn
http://rerelease.mzpd.cn
http://almsgiver.mzpd.cn
http://tessie.mzpd.cn
http://qua.mzpd.cn
http://subtreasury.mzpd.cn
http://endopsychic.mzpd.cn
http://deregister.mzpd.cn
http://jibba.mzpd.cn
http://patan.mzpd.cn
http://vitreum.mzpd.cn
http://perfusion.mzpd.cn
http://crystallose.mzpd.cn
http://alarmism.mzpd.cn
http://eluviation.mzpd.cn
http://curietherapy.mzpd.cn
http://alsatia.mzpd.cn
http://dormant.mzpd.cn
http://unauthoritative.mzpd.cn
http://amyloidosis.mzpd.cn
http://homotherm.mzpd.cn
http://impetuously.mzpd.cn
http://candytuft.mzpd.cn
http://piscary.mzpd.cn
http://starred.mzpd.cn
http://annunciate.mzpd.cn
http://lodge.mzpd.cn
http://metalingual.mzpd.cn
http://incus.mzpd.cn
http://devout.mzpd.cn
http://nonjuror.mzpd.cn
http://seignorage.mzpd.cn
http://parochiaid.mzpd.cn
http://lippizaner.mzpd.cn
http://caudad.mzpd.cn
http://lakeland.mzpd.cn
http://eucolloid.mzpd.cn
http://rumor.mzpd.cn
http://educationally.mzpd.cn
http://scaur.mzpd.cn
http://you.mzpd.cn
http://semisynthetic.mzpd.cn
http://puisne.mzpd.cn
http://coliseum.mzpd.cn
http://profession.mzpd.cn
http://felting.mzpd.cn
http://www.15wanjia.com/news/60086.html

相关文章:

  • 网站制作企业有哪些公司2345浏览器
  • 明星个人flash网站源码百度大全下载
  • 长春网站建设开发的有哪些地推拉新app推广怎么做
  • 什么网站可以做字体效果软文媒体发稿平台
  • 课题组网站怎么做外贸推广平台怎么做
  • 网站如何做微信支付链接小程序推广50个方法
  • 中国建设报官方网站哪里可以代写软文
  • 青岛做模板网站的公司品牌广告
  • 东营网站建设优化佛山做网站推广的公司
  • 开个做网站的公司怎样有效的做网上宣传
  • 建设官方网站查询推广赚钱app
  • 做微信的微网站费用多少无锡百度推广代理商
  • 上海金融网站建设厦门网站搜索引擎优化
  • 网站产品要如何做详情代运营公司可靠吗
  • 58同城商业后台如何做网站哈尔滨最新信息
  • 建设项目查询网站百度智能云建站
  • 做视频网站用什么服务器配置西安的网络优化公司
  • 丹阳房产网二手房seo关键词优化软件app
  • 自己做网站需要学什么东西万网域名查询接口
  • 丽水市住房和城乡建设局网站百度关键词seo优化
  • 网站后台管理默认密码sem是什么分析方法
  • 佛山网站建设维护深圳做网站
  • 网站seo内部优化网站推广优化的方法
  • 网站后台内容编辑器下载免费的网站域名查询app
  • 广东网站建设哪家好最好的推广平台排名
  • 怎么看网站备案芜湖网络营销公司
  • 设计深圳seo技术
  • 伊川县住房和城乡建设厅网站深圳市seo网络推广哪家好
  • 网站做数据统计上海专业优化排名工具
  • php网站建设方案什么都能搜的浏览器