Skip to main content

京东科技

David LiuAbout 16 min

京东科技

  • 一轮技术面,60min
  • 一轮 HR 面,15min

一面

自我介绍

到岗时间

实习时间,不打算考研,已经在申请?

学校讲 java 吗?

简历两个都是 java ?

项目

讲雁过留痕功能、架构、难题

lbs

Redis 缓存,set, 热点信息,封装解决穿透雪崩

aop 权限的校验,一个注解

log 日志的处理

现实世界和物理世界,距离,做推荐的时候,怎么映射?

arkit 记录场景的经纬度

场景大致的位置的经纬度,arkit 结合周围物体识别

推荐的时候,找附近的人?

异步社交,

留言板是固定的位置

计算位置是自己做的,还是组件做的?

提供 api 存储层怎么记录的位置信息?

位置信息是一个二进制文件, ARWrouldMap

文件解析的过程

aop 权限管理,用的什么模型,表设计?

普通用户、管理员

在AOP权限管理中,常用的模型是RBAC(Role-Based Access Control,基于角色的访问控制)。RBAC模型将权限控制分为角色授权和用户授权两个层次,通过将用户分配到不同的角色中,从而实现对用户权限的控制。

在RBAC模型中,通常包括以下几个角色:

  1. 超级管理员:拥有系统的最高权限,可以对系统进行任意操作。

  2. 管理员:拥有系统管理权限,可以对用户、角色、权限等进行管理。

  3. 普通用户:拥有系统的基本权限,可以进行一些基本操作,例如查看、修改、删除等。

在RBAC模型中,通常包括以下几个表:

  1. 用户表:用于存储系统中的用户信息,例如用户名、密码、邮箱等。

  2. 角色表:用于存储系统中的角色信息,例如角色名称、角色描述等。

  3. 权限表:用于存储系统中的权限信息,例如权限名称、权限描述等。

  4. 用户角色关联表:用于存储用户和角色之间的关联关系。

  5. 角色权限关联表:用于存储角色和权限之间的关联关系。

在AOP权限管理中,可以通过编写AOP切面来实现对用户权限的控制。例如,可以编写一个AOP切面,在切面中对需要进行权限控制的方法进行拦截,并判断当前用户是否具有执行该方法的权限。如果当前用户没有权限,则可以抛出异常或进行其他操作。

需要注意的是,在设计AOP权限管理系统时,需要考虑系统的安全性和可扩展性。例如,可以使用加密算法对用户密码进行加密,使用缓存技术提高系统的性能,使用日志记录技术记录系统的操作日志等。

登录态校验,通过拦截器、aop 实现的区别?

拦截器是一种基于 Java 反射机制的技术,它可以在方法执行前或执行后拦截请求并进行处理。在 Spring 框架中,拦截器是通过实现 HandlerInterceptor 接口来实现的。拦截器可以拦截所有的请求,包括静态资源请求,因此需要在拦截器中进行判断,以避免对静态资源的拦截。

AOP 是一种基于动态代理的技术,它可以在方法执行前、执行后或抛出异常时进行处理。在 Spring 框架中,AOP 是通过实现 Aspect 接口来实现的。AOP 可以通过切面来选择性地拦截某些请求,因此可以更加灵活地进行登录态校验。

总的来说,拦截器和 AOP 都可以用于登录态校验,但拦截器更加通用,可以拦截所有请求,而 AOP 更加灵活,可以选择性地拦截某些请求。

登录态校验是Web应用中常见的一种安全机制,用于保护用户的敏感信息和操作。在Java Web应用中,可以通过拦截器和AOP来实现登录态校验。

拦截器是一种基于Java Servlet规范的技术,它可以在请求到达Servlet之前或之后对请求进行拦截和处理。在实现登录态校验时,可以通过编写一个拦截器来拦截所有需要登录的请求,并在拦截器中进行登录态校验。拦截器可以对请求进行预处理、后处理和异常处理等操作,具有较高的灵活性和可扩展性。

AOP(Aspect-Oriented Programming)是一种编程范式,它可以在不修改原有代码的情况下,对程序进行横向切面的扩展。在实现登录态校验时,可以通过编写一个AOP切面来对所有需要登录的方法进行拦截和处理。AOP可以对方法进行前置、后置、异常和环绕等通知,具有较高的灵活性和可重用性。

相比之下,拦截器和AOP的实现方式有以下几点区别:

  1. 拦截器是基于Servlet规范的技术,而AOP是一种编程范式,可以用于任何Java应用程序。

  2. 拦截器可以对请求进行预处理、后处理和异常处理等操作,而AOP只能对方法进行通知。

  3. 拦截器可以对请求进行细粒度的控制,例如可以对某些请求进行放行或重定向,而AOP只能对方法进行通知。

  4. 拦截器可以通过配置文件或注解来进行配置,而AOP通常需要使用切面表达式来进行配置。

需要根据实际情况选择合适的实现方式,以实现登录态校验等安全机制。

aop 底层实现原理

Spring AOP是基于动态代理实现的,它使用了JDK动态代理和CGLIB动态代理两种方式来实现对目标对象的代理。

  1. JDK动态代理

JDK动态代理是基于接口的代理,它要求目标对象必须实现一个或多个接口。在运行时,JDK动态代理会动态地生成一个实现了目标接口的代理类,并在代理类中调用目标对象的方法。JDK动态代理使用了Java自带的java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现代理。

  1. CGLIB动态代理

CGLIB动态代理是基于类的代理,它可以代理没有实现接口的目标对象。在运行时,CGLIB动态代理会动态地生成一个目标对象的子类,并在子类中调用目标对象的方法。CGLIB动态代理使用了第三方库cglib来实现代理。

Spring AOP默认使用JDK动态代理来实现对目标对象的代理,但是当目标对象没有实现接口时,Spring AOP会自动切换到使用CGLIB动态代理来实现代理。在使用Spring AOP时,可以通过配置文件或注解来定义切点和通知,从而实现对目标对象的拦截和通知。

需要注意的是,Spring AOP只能对方法进行拦截和通知,不能对属性进行拦截和通知。如果需要对属性进行拦截和通知,可以使用AspectJ等其他AOP框架。

CGLIB 底层?

CGLIB(Code Generation Library)是一个基于ASM(Java字节码操作框架)的字节码生成库,它可以在运行时动态地生成目标类的子类,并在子类中重写目标方法,从而实现对目标对象的代理。

CGLIB动态代理的底层原理主要涉及以下几个步骤:

  1. 创建Enhancer对象:Enhancer是CGLIB中的一个类,它用于创建代理对象。在创建Enhancer对象时,需要指定目标类和回调对象。

  2. 设置回调对象:回调对象是一个实现了MethodInterceptor接口的类,它用于拦截目标方法并执行通知。在设置回调对象时,需要将回调对象传递给Enhancer对象。

  3. 创建代理对象:通过调用Enhancer对象的create方法,可以动态地生成目标类的子类,并在子类中重写目标方法。生成的子类即为代理对象。

  4. 调用代理对象:通过调用代理对象的方法,可以触发回调对象的拦截方法,并执行通知。

需要注意的是,CGLIB动态代理只能代理非final类和非final方法,因为final类和final方法不能被继承和重写。此外,CGLIB动态代理在生成代理类时,会将目标类的所有非final方法都重写一遍,因此在代理大量方法时,可能会导致性能下降。

在使用CGLIB动态代理时,需要注意避免出现死循环和栈溢出等问题。此外,CGLIB动态代理也可以用于实现其他功能,例如实现对象的深度克隆、实现对象的序列化和反序列化等。

redis 分布式 session 干嘛的?

密码的管理?

隐私处理:加盐 MD5

和 MD5 摘要值一样

为什么加盐,随机生成一个 20 位字符串,防止非法用户用字典的方式暴力枚举

常见的摘要算法有哪些?

sh256

非对称

常见的摘要算法包括:

  1. MD5(Message-Digest Algorithm 5):输出 128 位的摘要信息,常用于数据完整性校验和密码加密等场景。但是由于其安全性较低,已经被广泛取代。

  2. SHA-1(Secure Hash Algorithm 1):输出 160 位的摘要信息,常用于数字签名等场景。但是由于其安全性较低,已经被广泛取代。

  3. SHA-2(Secure Hash Algorithm 2):包括 SHA-224、SHA-256、SHA-384、SHA-512 等多种算法,输出不同长度的摘要信息,常用于数字签名、数据完整性校验等场景。

  4. SHA-3(Secure Hash Algorithm 3):输出不同长度的摘要信息,是最新的摘要算法之一,相对于 SHA-2 更加安全。

  5. RIPEMD(RACE Integrity Primitives Evaluation Message Digest):包括 RIPEMD-128、RIPEMD-160、RIPEMD-256、RIPEMD-320 等多种算法,输出不同长度的摘要信息,常用于数字签名、数据完整性校验等场景。

  6. HMAC(Hash-based Message Authentication Code):基于哈希函数和密钥生成的消息认证码,常用于身份验证、数据完整性校验等场景。

加密算法有哪些?

对称

常见的加密算法包括:

  1. 对称加密算法:加密和解密使用相同的密钥,包括 DES、3DES、AES 等。

  2. 非对称加密算法:加密和解密使用不同的密钥,包括 RSA、DSA、ECC 等。

  3. 哈希加密算法:将任意长度的消息压缩成固定长度的摘要信息,包括 MD5、SHA-1、SHA-2、SHA-3 等。

  4. 混合加密算法:将对称加密算法和非对称加密算法结合起来使用,既保证了安全性,又提高了效率,包括 SSL/TLS 等。

以上是常见的加密算法,不同的算法适用于不同的场景,需要根据具体的需求进行选择。

非对称算法除了摘要算法,还有哪些?

RSA

非对称加密算法除了摘要算法,还包括:

  1. RSA(Rivest-Shamir-Adleman):是一种基于大数因子分解的加密算法,常用于数字签名、密钥交换等场景。

  2. DSA(Digital Signature Algorithm):是一种基于离散对数问题的加密算法,常用于数字签名等场景。

  3. ECC(Elliptic Curve Cryptography):是一种基于椭圆曲线离散对数问题的加密算法,相对于 RSA 和 DSA,ECC 在相同的安全性下,使用的密钥更短,计算速度更快,因此在移动设备等资源受限的场景中得到广泛应用。

以上是常见的非对称加密算法,不同的算法适用于不同的场景,需要根据具体的需求进行选择。

私钥只能解密吗?

私钥不仅可以用于解密,还可以用于数字签名。在非对称加密算法中,私钥用于解密和数字签名,公钥用于加密和验证数字签名。

私钥可以用于解密,是因为在非对称加密算法中,私钥和公钥是一对密钥,私钥可以用于解密公钥加密的数据。私钥也可以用于数字签名,是因为私钥可以用于生成数字签名,数字签名可以用于验证数据的完整性和真实性。

因此,私钥不仅可以用于解密,还可以用于数字签名。公钥不仅可以用于加密,还可以用于验证数字签名。

其他的场景?

数字信封,https,用到 RSA 或者类似的思想

除了解密和数字签名,私钥还可以用于以下场景:

  1. 密钥交换:在非对称加密算法中,私钥和公钥是一对密钥,私钥用于解密和数字签名,公钥用于加密和验证数字签名。因此,私钥可以用于生成共享密钥,用于对称加密算法的加密和解密。

  2. 身份验证:私钥可以用于生成数字签名,数字签名可以用于验证数据的完整性和真实性。因此,私钥可以用于身份验证,例如在网站登录、电子邮件验证等场景中。

  3. 数字证书:私钥可以用于生成数字证书,数字证书可以用于验证网站的真实性和安全性。因此,私钥可以用于数字证书的生成和管理。

总的来说,私钥在非对称加密算法中扮演着重要的角色,除了解密和数字签名,还可以用于密钥交换、身份验证、数字证书等场景。

怎么解决身份认证问题

加密的反向操作,数字签名,私钥加密、公钥解密

八股

java 多线程有用过吗,线程池几种类型?

默认的线程池,更推荐自己创建。属性需要自己设置

是的,Java 多线程是 Java 语言的一个重要特性,可以提高程序的并发性和性能。Java 多线程可以通过 Thread 类和 Runnable 接口来实现,也可以通过线程池来管理线程。

线程池是一种管理和复用线程的机制,可以避免频繁地创建和销毁线程,从而提高程序的性能和稳定性。Java 中的线程池主要有以下几种类型:

  1. FixedThreadPool:固定大小的线程池,线程数量固定,不会自动调整。

  2. CachedThreadPool:缓存线程池,线程数量不固定,根据需要自动创建和销毁线程。

  3. ScheduledThreadPool:定时任务线程池,用于执行定时任务和周期性任务。

  4. SingleThreadExecutor:单线程线程池,只有一个线程,用于保证任务的顺序执行。

  5. WorkStealingPool:工作窃取线程池,用于处理大量独立的任务,可以自动调整线程数量。

在实际应用中,应根据具体的场景选择合适的线程池类型。例如,如果需要执行大量独立的任务,可以选择 WorkStealingPool;如果需要执行定时任务和周期性任务,可以选择 ScheduledThreadPool;如果需要保证任务的顺序执行,可以选择 SingleThreadExecutor 等。

有哪些拒绝策略

AbortPolicy,拒绝

消息队列

线程池设置阻塞队列,队列长度一万,任务多、队列满,线程池一直在工作,如果做应用升级,有什么后果,重启的话有什么后果,如何解决

最好有第三方存储

对线程不安全的理解?

可见性、有序性、原子性

数据库主要是 MySQL 数据库?join 有几种?

默认是 innerjoin

fulljoin 全连接

join 和 union 区别?

Join 将表根据列连接,临时表

union 对结果集

数据库的索引分类?

唯一索引什么时候用?

查询更快

唯一索引是一种用于保证表中某一列或多列的取值唯一性的索引。当需要保证表中某一列或多列的取值唯一性时,可以使用唯一索引。

以下是一些常见的使用唯一索引的场景:

  1. 主键索引:主键索引是一种特殊的唯一索引,用于保证表中某一列或多列的取值唯一性,并且该列或多列还被用作表的主键。主键索引可以提高表的查询效率,并且可以避免表中出现重复的数据。

  2. 外键索引:外键索引是一种用于保证表中某一列或多列的取值唯一性,并且该列或多列还被用作其他表的外键。外键索引可以提高表的查询效率,并且可以避免表中出现不一致的数据。

  3. 唯一约束:唯一约束是一种用于保证表中某一列或多列的取值唯一性的约束。唯一约束可以避免表中出现重复的数据,并且可以提高表的查询效率。

  4. 防止重复插入数据:当需要向表中插入数据时,可以使用唯一索引来判断该数据是否已经存在,从而避免插入重复的数据。

总之,唯一索引可以保证表中某一列或多列的取值唯一性,避免表中出现重复的数据,并且可以提高表的查询效率。因此,在需要保证表中某一列或多列的取值唯一性时,可以使用唯一索引。

唯一索引从使用的角度有什么用?

非技术问题

兴趣爱好?

除了日常学习,总结、吉他、羽毛球

项目、比赛里面,leader

倾向于组织者,

进度管理

个人兴趣、性格,乐于做组织者?还是没有更好地

从团队发展的角度而言

主动性

申请国外的学校,就业和读研之间的看法?

反问

  1. 流程?

    实习生的面试简单,二面就是 hr

  2. 实习生做的工作?

    工作内容

  3. 5.8 之前能否定下来?

    51 之后,如果快的话 2 - 3 天后

HR 面