招银提前批(笔试)

1. DoS攻击,即攻击者在目标主机上建立大量半开放或者完全开放的TCP连接,是连接泛洪

攻击流程:要理解dos攻击,首先要理解TCP连接的三次握手过程。

第一次握手:建立连接时,客户端发送SYN包((SYN=i)到服务器,并进入SYN SEND状态,等待服务器确认;

第二次握手:服务器收到SYN包,必须确认客户的SYN (ACK=i+1 ),同时自己也发送一个SYN包((SYN=j)}即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=j+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据。

一些重要的概念:

半连接:收到SYN包而还未收到ACK包时的连接状态称为半连接,即尚未完全完成三次握手的TCP连接。

半连接队列:在三次握手协议中,服务器维护一个半连接队列,该队列为每个客户端的SYN包(SYN=i )开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于SYN_ RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。

Backlog参数:表示半连接队列的最大容纳数目。

SYN-ACK重传次数:服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息、从半连接队列中删除。注意,每次重传等待的时间不一定相同。

半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时也称半连接存活时间为Timeout时间、SYN_RECV存活时间。[1] 上面三个参数对系统的TCP连接状况有很大影响。

**SYN洪水攻击属于DoS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。**SYN洪水攻击还可以通过发大量ACK包进行DoS攻击。

2. 传统的软件工程把软件声明周期定义为6个阶段,最先的阶段是

软件的生命周期各个阶段分别是:1、问题定义;2、可行性研究;3、需求分析;4、总体设计(概要设计);5、详细设计;6、编码与单元测试;7、综合测试;8、维护

3. 设计模式

4. 【排序】

快排:

选择排序:每次选择最小/大的数

堆排序:

希尔排序:

5. 内部类

静态内部类(Static inner class)
成员内部类(Member inner class)
本地内部类(Local inner class)
匿名内部类(Anonymous inner class)

https://www.cnblogs.com/niuyourou/p/12013905.html

6. 一个进程从执行状态转换到阻塞状态:发生了I/O请求或者等待某事件的发生

运行态:进程占用CPU,并在CPU上运行;
就绪态:进程已经具备运行条件,但是CPU还没有分配过来;

阻塞态:进程因等待某件事发生而暂时不能运行; 进程在一生中,都处于上述3中状态之一。

运行—》就绪: 时间片用完。
就绪—》运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
运行—》阻塞:发生了I/O请求或等待某件事的发生
阻塞—》就绪:进程所等待的事件发生,就进入就绪队列

P操作是阻塞作用

V操作是唤醒作用

进程:进程是程序运行的最小单位。

进程的几种状态**:就绪状态,运行状态,阻塞状态。**

运行态:进程占用CPU,并在CPU上运行;
就绪态:进程已经具备运行条件,但是CPU还没有分配过来;
阻塞态:进程因等待某件事发生而暂时不能运行;

当然理论上上述三种状态之间转换分为六种情况;
运行——>就绪:1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态。
就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求
阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列
以下两种状态是不可能发生的:
阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态。

缓存淘汰算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TZHgAMPu-1622119525780)(https://www.pianshen.com/images/62/4290e88388c8b4134f4f6966cfed0db6.png)]


import java.util.HashMap;
import java.util.LinkedList;/****/
public class LRUCache {private int capacity;private HashMap<Integer,Integer> map;private LinkedList<Integer> list;public LRUCache(int capacity){this.capacity = capacity;map = new HashMap<>();list = new LinkedList<>();}public int get(int key){if (map.containsKey(key)){list.remove(key);list.addLast(key);return map.get(key);}return -1;}public void put(int key,int value){//如果包含这个keyif(map.containsKey(key)){list.remove(key);list.addLast(key);map.put(key,value);return;}//不包含这个keyif (list.size() == capacity){//移除Integer integer = list.removeFirst();map.remove(integer);list.addLast(key);map.put(key,value);}else {list.addLast(key);map.put(key,value);}}
}

招银提前批(准备)

代码

  1. 数组去重
  2. 字符串反转
  3. 无序的链表,如何删除重复的?复杂度是多少?
  4. 删除升序链表中重复的元素

问题

  • TCP/IP 协议几层,OSI协议

  • TCP三次握手,为什么不能两次?

  • HTTP响应码:404 500 200 403 301 302 501 502

    2xx (成功)表示成功处理了请求的状态代码。

    200 服务器成功处理了请求,提供了请求的页面

    3xx (重定向) 表示要完成请求,需要进一步操作。

    301 永久移动,请求的页面已永久移动到新位置,服务器返回此响应时,会自动将请求者转到新位置。

    302 临时移动,服务器目前从不同位置的网页响应请求,但请求者应继续使用原来位置来进行以后的请求。

    4xx(请求错误) 这些状态代码表示请求可能出错,妨碍了服务器的处理。

    404 未找到, 服务器找不到请求的网页。

    5xx(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。

    500 服务器内部错误, 服务器遇到错误,无法完成请求。

    501 尚未实施,服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。

    502 错误网关,服务器作为网关或代理,从上游服务器收到无效响应。

  • 左连接和右连接

    inner join 获取的就是两个表中的交集部分

    左连接会读取左边数据表的全部数据,即使右边数据表没有对应数据。(如果两个表中数据有相同部分,只显示一个)

    右连接会读取右边数据表的全部数据,即使左边数据表没有对应数据。(如果两个表中数据有相同部分,只显示一个)

  • 接口和抽象类的区别,使用的场景

    一个类只能继承一个抽象类,但是可以实现多个接口(单继承,多实现)

    抽象类可以有静态代码块和静态方法,而接口中不能含有静态代码块以及静态方法;

    抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;

    抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

    抽象类:没有具体的实现,只有声明,必须用abstract关键字进行修饰。

    接口:接口中的变量会被隐式地指定为public static final变量,并且只能是public static final变量,接口中的方法被隐式的指定为public abstract方法且只能是public abstract方法,并且接口中的所有方法不能有具体实现,方法必须是具体的方法。

    使用场景:

    如果你有一些方法并且想让它们中的一些有默认方法,那么使用抽象类

    如果你想不断改变他的功能,就使用接口去实现该接口的类

  • Array和ArrayList区别,扩容是几倍?

Array可以包含基本类型和对象类型,ArrayList只能包含对象类型

Array的大小是固定的,ArrayList的大小是动态的

ArrayList可以算是Array的加强版 提供了新的功能 添加全部 addAll() 删除全部 removeAll() 返回迭代器 iteratorAll()

使用场景:如果我们需要保存一些在整个程序运行期间都会存在而且不变的数据,我们可以使用Array。但是我们如果只是单纯想要以数组的形式保存数据,而不是对数组进行增加等操作,只是方便我们查找的话,那么选择ArrayList

  • 深拷贝和浅拷贝的区别

**浅拷贝:**对基本数据类型进行值传递,对引用数据类型进行引用传递的拷贝

**深拷贝:**对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容。

招银一面(亲自面)

HashTable和HashMap的区别

面试表现:我把hashMap的一套介绍了一下,HashMap的底层实现,线程不安全的原因,只说了HashTable是全表锁

应该回答的区别是:

  1. 继承

    HashTable继承自Dirctionary,HashMap继承自AbstractMap,二者均实现了Map接口;

  2. 线程安全性

    HashTable的方法是同步的,即是线程安全的。HaspMap的方法不是同步的,不是线程安全的的。在多线程并发的情况下,我们可以直接使用HashTable,如果 要使用HashMap,就需要自行对HashMap的同步处理。

  3. 键值

    HashTable中不允许有null键和null值,HashMap中允许出现一个null键,可以存在一个或者多个键的值都为null。程序中,对于HashMap,如果使用get(参数为 键)方法时,返回结果为null,可能是该键不存在,也可能是该键对应的值为null,这就出现了结果的二义性。因此,在HashMap中,我们不能使用get()方法来查询键 对应的值,应该使用containskey()方法。

  4. 遍历

    这两个在遍历方式的实现不同。HashTable和HashMap两者都实现了Iterator。但是,由于历史原因,HashTable还使用了Enumeration。

  5. 哈希值

    HashTable是直接使用对象的hashCode。HashMap是重新计算hash值。

  6. 扩容

    HashTable和HashMap的底层实现的数组和初始大小和扩容方式。HashTable初始大小为11,并且每次扩容都为:2old+1。HashMap的默认大小为16,并且一 定是2的指数,每次扩容都为old2。

启动线程的几种方式

  1. 通过线程池使用线程
  2. 自定义类继承Thread类,覆写run方法
  3. 自定义类继承Runnable接口,覆写run方法
  4. 自定义类继承java.util.concurrent.Callable接口,实现覆写call方法

介绍一下你知道的几种Java锁

https://www.cnblogs.com/jyroy/p/11365935.html

死锁产生的条件,你在实际开发中是否遇到了死锁,怎么解决?

1、死锁的定义

所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进

2、死锁产生的必要条件

互斥条件:线程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个线程所占有。此时若有线程请求该资源,则请求线程只能等待。

不剥夺条件:线程所获得的资源在未使用完毕之前,不能被其他线程倾向夺走,即只能由获得该资源的线程自己来释放(只能是主动释放)。

请求和保持条件:线程已经保持了至少一个资源,但又提出了新的资源请求,而该线程已被其他线程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

循环等待条件:存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个线程所请求。即存在一个处于等待状态的线程集合{P1,P2,…,Pn},其中Pi等待的资源被P(i+1)占有(i=0,1,…,n-1),Pn等待的资源被P0占有,如下图。

在有些情况下死锁是可以避免的。两种用于避免死锁的技术

1)加锁顺序(线程按照一定的顺序加锁

2)加锁时限(线程获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)

发生OOM的原因,在哪里发生,怎么解决?

https://www.cnblogs.com/zhoading/p/11460320.html

四次挥手,四次挥手可以由服务器断开吗

能。

TCP是双向全双工通信,没有客户端和服务端之分。

ARP

在linux和window中,你知道哪些网络相关的命令?测试端口的命令,ping使用的什么网络协议?

linux和windows命令相同的我只知道几个,比如echo, cd , dir , ftp (使用ftp命令方式登陆ftp服务器之后,又会有很多条命令)。

测试端口的命令:telnet ip port

数据库连接池的原理?什么要用连接池?有什么好处?数据库连接池是线程级别的吗?

1.原理:一般来说,java应用程序访问数据库的过程是:

①装载数据库驱动程序;

②通过jdbc建立数据库连接;

③访问数据库,执行sql语句;

④断开数据库连接。

  1. 好处

    问题的根源就在于对数据库连接资源的低效管理。我们知道,对于共享资源,有一个很著名的设计模式:资源池(resource pool)。该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。

使用过数据库连接池的哪些参数?

数据库的隔离级别?

  • READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
  • READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
  • REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
  • SERIALIZABLE(可串行化): 最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读

千万级的用户进行数据库的存储,你怎么考虑?怎么设计数据库?

mysql实现海量数据的存储、访问的解决方案:
mysql数据库水平切分的实现原理可分为以下几个:分库,分表,主从,集群,负载均衡器等

mybatis的$ 和 # 的区别?

#{}是经过预编译的,是安全的${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。

在MyBatis 的映射配置文件中,动态传递参数有两种方式:

(1)#{} 占位符

(2)${} 拼接符

2、#{} 和 ${} 的区别

(1)

1)#{} 为参数占位符 ,即sql 预编译

2)${} 为字符串替换,即 sql 拼接

(2)

1)#{}:动态解析 -> 预编译 -> 执行

2)${}:动态解析 -> 编译 -> 执行

(3)

1)变量替换后,#{} 对应的变量自动加上单引号 ’

2)变量替换后,${} 对应的变量不会加上单引号 ’

(4)

1)#{} 能防止sql 注入

2)${} 不能防止sql 注入

#{} 和 ${} 在使用中的技巧和建议

(1)不论是单个参数,还是多个参数,一律都建议使用注解@Param("")

(2)能用 #{} 的地方就用 #{},不用或少用 ${}

(3)表名作参数时,必须用 ${}。如:select * from ${tableName}

(4)order by 时,必须用 ${}。如:select * from t_user order by ${columnName}

(5)使用 ${} 时,要注意何时加或不加单引号,即 和 ′ {} 和 ' 和′{}’

招银一面牛客面经

1.redis缓存雪崩、缓存击穿,缓存穿透

  • 缓存雪崩

    指的是同一时间内存在大面积的失效,后面的请求都会落在数据库上,造成数据库短时间内承受大量请求而崩掉

    解决方案:

    • 设置随机的过期时间,防止同一时间大量数据过期
    • 并发量不是特别多的时候,加锁排队
    • 给每一个缓存数据增加相应的缓存标记,记录缓存是否失效,如果缓存标记失效,则更新数据缓存
  • 缓存击穿

    指的是缓存中没有数据,但是数据库中有数据,这样并发用户来的时候,读缓存没有读到数据则去数据库取数据,就会引起数据库压力瞬间增大,造成过大压力(与雪崩不同的是,击穿是并发查同一条数据,而雪崩是同一时间多条数据同时过期)

    解决方案:

    • 设置热点数据永不过期
    • 加互斥锁
  • 缓存穿透

    指的是缓存和数据库中都没有数据,用户不断请求,比如用户发送id=-1,id为特别大的不存在的数据,可能是攻击者,导致数据库压力过大

    解决方案:

    • 接口层增加校验(限流操作),如用户权限的校验(token方法),id做基础校验,直接拦截
    • 从缓存取不到的数据,在数据库中也没有,则可以将key这是为null,并且缓存时间设置短点,为30秒。防止攻击用户反复用同一个id暴力攻击

2.布隆过滤器

引入hash函数,完成元素判重的过程。主要思想是利用多个不同的hash函数解决“冲突”,如果一个hash得到的两个url的值可能相同,但是如果你引入多个hash对一个元素进行判断,如果多个中的一个判断某元素不在集合中,则该元素肯定不在集合中。如果所有hash函数都判定该元素在集合中,才能确定元素在集合中。Bloom-Filter一般用于在大数据量的集合中判定某元素是否存在。

3.双亲委派

双亲委派机制,就是由子到父,由父到子的过程,就是双亲委派的过程。就是某个类加载器需要加载某个.class文件,首先把这个任务委派给他的上级类加载器,递归这个过程,如果上级的类加载器没有加载,自己才会加载这个类。

  • 类加载器的类别(四种):

    • BootstrapClassLoader(启动类加载器)
    • ExtClassLoader (标准扩展类加载器)
    • AppClassLoader(系统类加载器)
    • CustomClassLoader(用户自定义类加载器)

双亲委派的好处是:

  • 保证核心.class不能被篡改。通过委托方式,不会去篡改核心.clas,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。

  • 防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。

4.线程创建方式

线程创建的方式:

  1. 通过线程池使用线程
  2. 自定义类继承Thread类,覆写run方法
  3. 自定义类继承Runnable接口,覆写run方法
  4. 自定义类继承java.util.concurrent.Callable接口,实现覆写call方法

5.线程池

如果面试官让你讲讲线程池,那你就从为什么用线程池,怎么用,有哪些问题,怎么解决这些问题?

  • 为什么要用线程池?

    池化技术的想法很常见,比如线程池,数据库连接池,http连接池等等,主要是为了减少每个获取资源的消耗,提高对资源的利用率。

    好处:

    • 降低资源消耗,反复利用已创建的线程降低线程创建和销毁造成的消耗
    • 提高响应速度,任务到达时不需要等待线程的创建
    • 提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
  • 怎么用?

    如何创建线程池?

    • 通过构造方法实现ThreadPoolExecutor

    • 通过Executor框架的工具类Executor来实现

      我们可以创建三种类型的 ThreadPoolExecutor:

      • FixedThreadPool : 该方法返回一个固定线程数量的线程池。该线程池中的线程数量始终不变。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行。若没有,则新的任务会被暂存在一个任务队列中,待有线程空闲时,便处理在任务队列中的任务。
      • SingleThreadExecutor: 方法返回一个只有一个线程的线程池。若多余一个任务被提交到该线程池,任务会被保存在一个任务队列中,待线程空闲,按先入先出的顺序执行队列中的任务。
      • CachedThreadPool: 该方法返回一个可根据实际情况调整线程数量的线程池。线程池的线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程。若所有线程均在工作,又有新的任务提交,则会创建新的线程处理任务。所有线程在当前任务执行完毕后,将返回线程池进行复用。
  • 线程池的实现原理

    线程池工作流程

    • 线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。

    • 当调用 execute() 方法添加一个任务时,线程池会做如下判断:

      1. 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;
      1. 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入等待队列;
      1. 如果任务不能入队,说明等待队列已满,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创建非核心线程(临时线程)运行这个任务;
      1. 如果队列满了,而且正在运行的线程数量等于 maximumPoolSize,此时无法执行该任务,根据拒绝执行策略处理。
    • 当一个线程完成任务时,它会从队列中取下一个任务来执行。

    • 当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它最终会收缩到 corePoolSize 的大小。

6.TCP/IP的拥塞控制

目的:

为了防止过多的数据注入网络中,这样可以使网络中的路由器或链路不过载

方法是:

  • 慢开始和拥塞避免

    慢开始:慢开始的思路是开始先探测网络的拥塞程度,由小到大逐渐增加拥塞窗口的大小。

    **拥塞避免:**拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口按线性规律缓慢增长。

  • 快重传和快恢复

TCP的流量控制:

如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。

7.Mybatis如何避免sql注入

SQL注入的是比较常见的网络攻击,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,实现无账号登录,甚至篡改数据库。

  1. 寻找SQL注入的位置
  2. 判断服务器类型和后台数据库类型
  3. 针对不同的服务器和数据库特点进行SQL注入攻击

解决方案:

  1. #{}——PreparedStatement
  2. 使用正则表达式过滤传入的参数,要引入的包
  3. 字符串过滤,比较通用的一个方法
  4. jsp中调用该函数检查是否包含非法字符
  5. 使用js在客户端进行不安全字符屏蔽

8.如何做权限控制 (认证授权)

认证授权就是,①定义角色,②授权角色拥有的权限,③给用户指定角色

使用时,1. 登录时获取用户的权限并初始化侧边栏;2. 给各模块中的动作上锁

基于角色的访问控制,就是用户通过角色与权限进行关联,简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构成“用户-角色-权限‘的授权模型。在这种模型中,用户与角色之间,角色与权限之间都是多对多的关系,为了实现表之间多对多的关系,必须将一个多对多的关系通过一个中间表分为两个一对多的关系。因此引入中间表,用户角色表和角色权限表。

权限管理模块一共涉及*五张表*

  1. 三张主表

a) 用户表(t_user)、

b) 角色表(t_role)、

c) 资源表(t_module)、

  1. 两张中间表

a) 用户角色表(t_user_role)、

b) 角色—资源表(t_permission)、

  1. 赋权限

    使用权限树结构的构建

    ​ a)赋权限

    ​ 1、先把本模块绑定;

    2、绑定父模块;

    3、绑定子模块

    ​ b)删权限

    ​ 1、先删除本模块;

    2、删除子模块;

    3、删除父模块(判断父模块是否有其他的子模块关联词角色,如果没有就取消,如果有就关联)

  2. 认证

    思路:

    从t_permission表中获取权限值(acl_value)与页面传来的值或者与注解中明确的权限值比较,下面提供两种思路:

    1. 页面传递过来Request.getParameter(“permission”);比对 根据userId查询数据库查到的权限列表 contains

    2. 通过注解明确模块权限值:@requirePermission(permission=”1010”;

    后台认证:

    Spring AOP和自定义注解实现认证

    获取用户权限存入session,然后用户操作资源时会提交一个资源的权限值,在判断用户是否包含有此权限

    使用Spring AOP进行拦截认证

    ​   第一步:开启注解驱动<aop:aspectj-autoproxy />

    ​    第二步:创建一个代理类使用@Aspect @Component注解进行标记

    ​    第三步:定义一个切入点@Pointcut(" execution('com.shsxt.controller..*((…))’)")

    ​         public void pointcut() {}

    ​   第四步:编写一个增强:@Around(value=“pointcut()”)

    ​   1.判定用户是否登录

    ​    2.获取用户权限

    ​    3.将权限存入session–》给前端页面判断

    ​   4.后台的权限校验

    ​    5.返回

9.线程池的任务拒绝策略

四种:

  • 不处理新任务,直接丢弃掉
  • 此策略将丢弃最早开始处理的任务的请求
  • 排除异常来拒绝新来的任务
  • 调用执行自己的线程运行任务,即直接调用execute方法的线程中运行被拒绝的任务,如果执行程序已关闭则丢弃。

10.手撕代码,判断一个字符串是ipv6还是ipv4或者两者都不是。

package 面试题目必会;/*** Copyright (C), 2019-2021* author  candy_chen* date   2021/5/27 20:24** @Classname IPV4IPV6* Description: java 判断IP地址是否合法,是IPV4,还是IPV6*//****/
public class IPV4IPV6 {//判断所有的IP地址public String validIPAddressAll(String IP){if (!IP.contains(".") && !IP.contains(":")){return "Neither";}//如果是IPV4if (IP.contains(".")){if (IP.endsWith(".")){return "Neither";}//ip地址以.进行分割String[] arr = IP.split("\\.");if (arr.length != 4){return "Neither";}for (int i = 0; i < 4; i++) {if (arr[i].length() == 0 || arr[i].length() > 3){return "Neither";}for (int j = 0; j < arr[i].length(); j++) {if (arr[i].charAt(j) >= '0' && arr[i].charAt(j) <= '9'){continue;}return "Neither";}if (Integer.parseInt(arr[i]) > 255 || (arr[i].length() >= 2 && String.valueOf(arr[i]).startsWith("0"))){return "Neither";}}return "IPv4";}//如果是IPV6if(IP.contains(":")){if (IP.endsWith(":") && !IP.endsWith("::")){return "Neither";}//如果包含多个"::",一个IPV6地址中只能出现一个"::"if (IP.contains("::") && IP.indexOf("::",IP.indexOf("::") + 2) != -1){return "Neither";}//如果含有一个“::”if (IP.contains("::")){String[] arr = IP.split(":");if (arr.length > 7 || arr.length < 1){//“1::”是最短的字符串return "Neither";}for (int i = 0; i < arr.length; i++) {if (arr[i].equals("")) {continue;}if (arr[i].length() > 4) {return "Neither";}for (int j = 0; j < arr[i].length(); j++) {if ((arr[i].charAt(j) >= '0' && arr[i].charAt(j) <= '9') || (arr[i].charAt(j) >= 'A' && arr[i].charAt(j) <= 'F')|| (arr[i].charAt(j) >= 'a' && arr[i].charAt(j) <= 'f')) {continue;}return "Neither";}}return "IPV6";}//如果不含有"::"if (!IP.contains("::")){String[] arr = IP.split(":");if (arr.length != 8){return "Neither";}for (int i = 0; i < arr.length; i++) {if (arr[i].length() > 4){return "Neither";}for (int j = 0; j < arr[i].length(); j++) {if ((arr[i].charAt(j) >= '0' && arr[i].charAt(j) <= '9') || (arr[i].charAt(j) >= 'A' && arr[i].charAt(j) <= 'F')|| (arr[i].charAt(j) >= 'a' && arr[i].charAt(j) <= 'f')) {continue;}return "Neither";}}return "IPV6";}}return "Neither";}
}

【面经】 招商银行 2022届 秋招提前批面经相关推荐

  1. 2023届秋招提前批信息汇总(持续更新ing)

    实时更新的文档:2023届秋招提前批信息汇总(持续更新ing) (qq.com) 公司 投递链接 面试网站 工作地点 截止时间 互联网及私企(软件) 网易游戏 网易游戏(互娱)校园招聘官网 https ...

  2. 2022年秋招提前批总结(海尔智家)

    2022年的秋招到现在也结束了,也好久没发博客了,突然想着要不分享并记录一下. 谈到秋招,我参加的不多,主要就参加了提前批(哈哈,因为九月已经确定保研了,就没去参加了).首先介绍一下自己的相关信息:本 ...

  3. 【网易互娱内推】2023届秋招提前批内推码:x8aiNS

    网易互娱内推码:x8aiNS 网申时间:7.26-9月中下旬 网申地址:https://game.campus.163.com [网易游戏互娱]OFFER倍加挑战,快GET面试直通卡✅ ‼超多直通岗位 ...

  4. 秋招提前批来了,早就是优势!

    6月21日,蔚来2023届秋招提前批正式启动 6月24日,中兴的未来领军计划正式启动 6月28日,英特尔校招招聘开始 ... 马上进入7月,秋招提前批已陆续开始,卷起来吧! 先给大家普及下校招的时间线 ...

  5. 【含内推码】字节跳动智能创作2022秋招提前批全面开启!

    关注公众号,获取更多AI领域发展机会 01 团队介绍 智能创作团队是字节跳动AI&多媒体技术中台,在计算机视觉.音视频拍摄编辑.特效处理.语音等角度支持抖音.TikTok.剪映.西瓜等公司内众 ...

  6. 2019 秋招提前批蘑菇街一面面经(带答案)

    今天给大家分享一下一位朋友的秋招提前批面试经历,目前三面技术面已过,hr 面也面过了,正在等消息.由于内容太多,先分享一面的面经. 自我介绍一下吧 面试官您好,我是 xxx 大学软件工程的一名大三学生 ...

  7. 【字节跳动-搜索】22秋招提前批/社招 内推来了!直推到组!全程跟进!

    字节跳动-搜索  22秋招提前批/社招  部门内推来了!直推到组!全程跟进! 团队介绍1:字节跳动搜索 字节跳动搜索团队主要负责抖音.今日头条.西瓜视频等产品的搜索算法创新和架构研发工作.我们使用最前 ...

  8. 字节跳动秋招提前批客户端面试(已oc)

    今年七月报了字节的秋招提前批(头条客户端).不得不称赞一句,字节的面试效率真的很快,而且面试官人也很nice,总体好评.也十分感谢字节给我这个机会吧. 7.8投递简历 7.9简历评估 7.14安排面试 ...

  9. 转载: 2019 Android 秋招提前批面试总结 (已拿BAT等6家口头offer)

    作者:minmin_1123 链接: https://www.jianshu.com/p/0f72ac621f82 本文由作者授权发布. 对作者写周记.做读书笔记的习惯超级认同. 在上一篇实习随笔| ...

最新文章

  1. js 动态加载select触发事件
  2. LeetCode 2. Add Two Numbers--C++,Python解法--面试算法题
  3. Beta冲刺博客集合贴
  4. 华为算法工程师-2020届实习招聘题
  5. 计算鞍点(信息学奥赛一本通-T1122)
  6. python sqlite3使用详解
  7. 测试kafka的连通性,自导自演生产者与消费者
  8. 项目方案-标书-文档等等编写规范
  9. 用navixt连接mysql连接不上_技嘉的RX 5500 XT、1650/1660 SUPER显卡现身欧亚经委会数据库:实锤两家中端新卡...
  10. python和c先学哪个-C 和 Python语言先学哪个好?
  11. Mybatis常见面试题总结和基本概念
  12. jquery chosen插件的使用(搜索查询下拉列表,多选)
  13. redis5 外部不能连接_基本拧紧技术,螺纹连接也有大不同!
  14. 多种云资源管理用什么软件好?你知道吗?
  15. python画圆形螺旋线_在PDMS中使用python直接生成管口方位图(开源分享第三集)...
  16. Android6.0动态壁纸,全局透明动态壁纸
  17. 文件服务器和nas区别,nas和ftp服务器的区别
  18. 计算机基础做表格,表格的制作计算机基础.doc
  19. Android开发 自定义控件 边框TextView
  20. day07 c++复习 核心编程02 核心内容(1、友元 2、3、继承 )

热门文章

  1. ubuntu根目录清理
  2. Snipaste截图工具调整线条粗细快捷键
  3. 【转载】颈肩疼痛,你的治疗方法正确么?
  4. 解释清楚Vlan和Trunk的作用
  5. Zabbix的优劣势
  6. python 中文转拼音原理_Python_ jieba、snownlp中文分词、Pinyin中文转拼音
  7. YESLAB教学环境及设备
  8. 加入YESLAB-AI公会,不做伪专家
  9. CPU与外设之间的信息交换方式
  10. x550网卡linux驱动,Intel英特尔X520/X540/X550/82599系列万兆网卡虚拟功能驱动4.10.2版For Linux(2021年2月1日发布)...