1.InterceptorRegistry
InterceptorRegistry 是 Spring MVC 中的一个类,用于注册拦截器(interceptor)。
在 Spring MVC 中,拦截器是一种强大的机制,可以在请求处理的前后执行一些特定的逻辑。通过注册拦截器,您可以在请求被处理前或处理后进行一些自定义操作,例如身份验证、日志记录、性能监控等。
InterceptorRegistry 类的主要作用就是用于注册拦截器,并指定其拦截的路径。您可以通过实例化 InterceptorRegistry 对象并调用其方法来进行拦截器的注册。
以下是一个示例,展示如何使用 InterceptorRegistry 注册拦截器:
javaCopy Codeimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 创建自定义的拦截器对象
MyInterceptor myInterceptor = new MyInterceptor();
// 注册拦截器,并指定拦截的路径
registry.addInterceptor(myInterceptor)
.addPathPatterns("/api/**"); // 拦截以 "/api" 开头的请求路径
}
}
在上述示例中,我们创建了一个名为 WebConfig 的配置类,并实现了 WebMvcConfigurer 接口。重写了该接口的 addInterceptors 方法,通过 InterceptorRegistry 注册了一个名为 MyInterceptor 的自定义拦截器,并指定了拦截路径为以 “/api” 开头的请求路径。
您可以根据实际需求,调用 InterceptorRegistry 的不同方法进行拦截器的注册和路径配置。
2.JWT的Bearer
Json Web Token (JWT) 是一种开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为 JSON 对象。此信息可以进行验证和信任,因为它是经过数字签名的。可以使用密钥(使用 HMAC 算法)或使用 RSA 或 ECDSA 对公钥/私钥对对 JWT 进行签名。
JWT生成的时候是没有“Bearer ”的,是在Http协议传输的时候的自动加上去的,它是数据传输的标准协议
从request获取相关数据时要去掉Bearer+空格。Str.replace();
可以认为JWT是用户认证的一种协议,可以理解为服务端颁发给客户端的一张身份证,拿到身份证后此后客户端进行接口访问时携带身份证,服务端通过验证以允许客户端访问服务器资源,每一项的含义:
- Json表示令牌的原始值是一个Json格式的数据
- web表示是在互联网传播
- token表示令牌
有没有疑惑为何不直接写成这样就得了:
Authorization : Token
这是因为 W3C 的 HTTP 1.0 规范,Authorization 的格式是:
Authorization: <type> <authorization-parameters>
所以 Bearer 是授权的类型,常见的授权类型还有:
Basic 用于 http-basic 认证;
Bearer 常见于 OAuth 和 JWT 授权;
Digest MD5 哈希的 http-basic 认证 (已弃用)
AWS4-HMAC-SHA256 AWS 授权
什么是OAuth? OAuth 不是_API_或服务:它是授权的开放标准,任何人都可以实施它。
更具体地说,OAuth 是应用程序可以用来为客户端应用程序提供“安全委托访问”的标准。OAuth 通过 HTTPS 工作,并使用访问令牌而不是凭据对设备、API、服务器和应用程序进行授权。
3.Threadlocal 线程问题
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景
- ThreadLocal并不是一个Thread,而是Thread的局部变量。
ThreadLocal是解决线程安全问题一个很好的思路, - 它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。
- 在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。
- Object get():获取该线程局部变量的值。
- void set(Object value):给该线程局部变量赋值。
- protected Object initialValue():返回该线程局部变量的初始值,该方法是一个protected的方法,
- 显然是为了让子类覆盖而设计的。
- public void remove():将当前线程局部变量的值删除。
3.ThreadLocal与Synchronized的区别
ThreadLocal其实是与线程绑定的一个变量。ThreadLocal和Synchonized都用于解决多线程并发访问。
但是ThreadLocal与synchronized有本质的区别:
1、Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
2、Synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享。
一句话理解ThreadLocal,threadlocl是作为当前线程中属性ThreadLocalMap集合中的某一个Entry的key值Entry(threadlocl,value),虽然不同的线程之间threadlocal这个key值是一样,但是不同的线程所拥有的ThreadLocalMap是独一无二的,也就是不同的线程间同一个ThreadLocal(key)对应存储的值(value)不一样,从而到达了线程间变量隔离的目的,但是在同一个线程中这个value变量地址是一样的。
线程池要看一下
WebMvcConfigurer解释一下如何使用
WebMvcConfigurer是Spring MVC框架提供的一个接口,用于自定义和配置Web应用程序中的MVC特性。通过实现该接口并重写其中的方法,可以对Spring MVC进行个性化的配置。
以下是使用WebMvcConfigurer的一般步骤:
- 创建一个类,并实现WebMvcConfigurer接口。例如,创建一个名为MyWebMvcConfigurer的类。
javaCopy Code@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
// 实现WebMvcConfigurer接口的方法
// ...
}
- 在该类中根据需要重写WebMvcConfigurer接口中的方法,以实现自定义配置。下面列举几个常用的方法示例:
- addInterceptors(InterceptorRegistry registry):添加自定义的拦截器,可以对请求进行拦截和处理。
- addViewControllers(ViewControllerRegistry registry):配置视图控制器,将请求映射到指定的视图。
- configureViewResolvers(ViewResolverRegistry registry):配置视图解析器,用于解析返回的视图名称。
- addResourceHandlers(ResourceHandlerRegistry registry):配置静态资源的访问路径。
- configureMessageConverters(List<HttpMessageConverter<?>> converters):配置消息转换器,用于处理请求和响应的数据格式转换。
- 在Spring的配置类中使用@EnableWebMvc注解启用Web MVC配置,将自定义的WebMvcConfigurer实例添加到Spring容器中。
javaCopy Code@Configuration
@EnableWebMvc
public class AppConfig {
@Bean
public WebMvcConfigurer myWebMvcConfigurer() {
return new MyWebMvcConfigurer();
}
}
通过以上步骤,自定义的WebMvcConfigurer配置将生效,并且可以根据需求进行个性化的配置,例如添加拦截器、指定视图控制器、配置静态资源等。在实际开发中,可以根据具体业务需求重写WebMvcConfigurer中的不同方法,以满足自定义的MVC配置要求。
4.HandlerInterceptor中PreHandle()中handler方法如何使用
在preHandle()方法中,参数handler表示被拦截的处理器对象,即被拦截的Controller中的方法。通过对handler的使用,可以获取到一些有关处理器方法的信息。
handler参数的类型是Object,因为具体的处理器对象类型可能会有多种,例如带注解的方法、实现接口的方法等。可以根据实际情况进行类型判断和转换。
下面是一个示例,展示如何在preHandle()方法中使用handler参数:
javaCopy Code@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
// 获取Controller类名
Class<?> controllerClass = handlerMethod.getBeanType();
String className = controllerClass.getName();
// 获取方法名
String methodName = handlerMethod.getMethod().getName();
// 获取方法上的注解
MyAnnotation myAnnotation = handlerMethod.getMethodAnnotation(MyAnnotation.class);
if (myAnnotation != null) {
// 如果方法上有自定义注解MyAnnotation,执行相应的逻辑
// ...
}
// 可以根据需求获取更多处理器方法相关的信息
// ...
}
return true;
}
}
在上述示例中,我们首先将handler转换为HandlerMethod类型,这样就可以获取到方法相关的信息。通过HandlerMethod对象,我们可以获取到Controller类名、方法名等信息。还可以通过getMethodAnnotation()方法获取方法上的注解,从而根据注解来执行相应的逻辑。
需要注意的是,在使用handler参数时,需要进行类型判断,确保handler是HandlerMethod类型,否则可能会抛出ClassCastException异常。
通过以上方式,可以在preHandle()方法中获取和使用被拦截的处理器方法(即Controller中的方法)的相关信息,以满足业务需求。
5.handler instanceof HandlerMethod 这个是用来做什么的
handler instanceof HandlerMethod是用来检查handler对象是否是HandlerMethod类型的实例。在Spring MVC中,HandlerMethod是对处理器方法的封装,包含了关于处理器方法的信息,如Controller类名、方法名、方法参数等。
通过判断handler是否是HandlerMethod的实例,可以确定当前被拦截的处理器是否是一个方法(即Controller中的方法),以便在preHandle()方法中针对特定的处理器方法进行一些操作。
如果handler是HandlerMethod的实例,说明当前被拦截的处理器是一个方法,可以通过将handler转换为HandlerMethod类型来获取处理器方法的相关信息。例如,可以获取到Controller类名、方法名、方法上的注解等,从而根据这些信息进行一些特定的逻辑处理。
如果handler不是HandlerMethod的实例,那么它可能是其他类型的处理器对象,例如拦截器、资源处理器等,此时可能无法获取到处理器方法的具体信息。
因此,通过判断handler instanceof HandlerMethod可以在拦截器中针对具体的处理器方法进行不同的拦截和处理,以满足业务需求。
6.handler的相关属性
handler 对象是 Spring MVC 中处理请求过程中执行的处理器,其具体类型可以是 HandlerMethod,也可以是其他类型的处理器。不同类型的处理器可能包含的属性不同,下面我分别介绍一些常见的类型及其相关属性:
- HandlerMethod
HandlerMethod 是对处理器方法的封装,其包含以下属性:
- bean:处理请求的方法所在的对象实例。
- method:处理请求的方法。
- beanType:处理请求的方法所在的类。
通过这些属性可以访问到处理器方法的具体信息,如方法名称、方法所在的类、方法参数等。
- ResourceHttpRequestHandler
ResourceHttpRequestHandler 处理静态资源时使用,其包含以下属性:
- locations:静态资源所在的位置。
- cacheSeconds:缓存时间。
- supportedMediaTypes:支持的媒体类型。
通过这些属性可以访问到静态资源所在的位置、缓存时间等信息。
- HttpRequestHandlerAdapter
HttpRequestHandlerAdapter 用于将 HttpRequestHandler 转换为 HandlerAdapter,其包含以下属性:
- supportedMethods:支持的 HTTP 方法。
- requireSession:是否需要会话。
通过这些属性可以访问到所支持的 HTTP 方法和是否需要会话等信息。
除了上述常见的类型之外,还有一些其他类型的处理器(如 CallableProcessingInterceptor、AsyncHandlerInterceptor 等),它们的属性也各不相同,需要具体情况具体分析。
userLoginToken.required()
userLoginToken.required() 是表示获取 LoginRequired 注解的属性值,其中 required 是该注解的一个属性名称。该方法返回一个 boolean 类型的值,用于判断处理器方法上是否要求进行登录验证,即 LoginRequired 注解中 required 属性的值。
如果 required 的值为 true,则表示该处理器方法需要进行登录验证;如果 required 的值为 false,则表示可以不用登录就可以访问该处理器方法。
在 Spring MVC 中,LoginRequired 注解通常用于控制处理器方法的访问权限,比如针对某些敏感操作,只有登录后的用户才能进行访问,通过处理器方法的注解就可以很方便地实现这个功能。