一、登录校验的实现思路是怎样的?
项目中访问核心资源,通常都要进行登录校验,访问京东商城的订单,必须要先登录才能访问查询。实现思路:可以在访问资源前进行访问的拦截,判断你当前会话是否有登录,如果没有登录拒绝访问。如果是登录的那就可以进行访问资源。
二、会话技术有哪些方式可以实现?
传统技术可以使用Cookie+Session去实现会话,进行会话跟踪。但是这种传统方式有弊端: 不能在集群服务中灵活使用,手机客户端无法支持cookie。
为了解决这些问题,可以使用令牌技术来解决。令牌技术优点是:可以在集群服务中灵活使用,移动端也可以支持。
三、JWT令牌组成部分有哪些,各自作用是什么?
JWT令牌由Header、Payload、Signature三部分组成,每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz
header.payload.signature 部分的数据会以Base64的方式进行编译。
这三部分的作用分别是:
header: 指定令牌类型,加密的算法。..
payload:存储一些令牌要携带的信息,比如用户的基本信息id,username,过期时间
signature : 保证令牌不被算改。
四、怎么使用JWT令牌?(依赖,创建,校验)
1). pom.xml 引入jwt的依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2). 生成JWT令牌
String jwt = Jwts,builder()
.addclaims(携带的数据,是一个map集合)
.signWith(SignatureAlgorithm,HS256,秘钥)
.setExpiration(new Date(System,currentTimeMillis() + expire))
.compact();
3).解析令牌
Claims claims = Jwts.parser(l
.setsigningKey(秘钥)//要和创建令牌时的秘钥保持一致
.parseClaimsJws(令牌》//要解析的令牌
.getBody();
4).当解析不报异常,此时就代表令牌是有效的。报任何异常都意味着令牌失效。
五、项目中在什么时候去生成令牌?
在登录时生成令牌,在访问核心资源的时候进行令牌的校验
六、当前端携带令牌访问资源时怎么去拦截校验令牌的合法性?
有两种方案可以实现:
1、过滤器
2、拦截器
七、过滤器具体使用的步骤是怎样的?
使用步骤如下
1、创建一个类实现接口Filter接口,重写doFilter方法
2、类上面需要加注解: @Webpilter(urlPatterns =“/")
3、在引导类中注解: @ServletComponentscan
4、要做具体的拦截业务在doFilter中完成
public void doFilter(ServletRequest reg, ServletResponse rsp,FilterChain chain){
//登录校验拦裁
XXXXXX
//放行(如果不放行,就不执行如下语句)
chain.doFilter(reg,rsp);
yyyyyyy
}
八、拦截器具体使用的步骤是怎样的?
Interceptor使用步骤如下:
1、创建一个类实现HandlerInterceptor接口,上面加上注解
@Component
public class LoginCheckInterceptor implements HandlerInterceptor
2、重写方法方法
preHandler 方法可以实现在资源访问前的拦裁
3、写配置类,在里面进行注册:
3.1 写一个类叫做配置,实现接口WebMvcConfigurer,并在类型上加上注解: @Configuration
@Configuration
public class WebConfig implements WebMvcConfigurer
3.2 注入拦截器对象,重写方法addInterceptors 进行注册,并设定拦裁路径
@configuration
public class WebConfig implements WebMvcconfigurer {
@Autowired
private LoginCheckInterceptor loginCheckInterceptor;
eOverride
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器
registry.addInterceptor(loginCheckInterceptor)
.addPathPatterns("/**");
}
九、项目中异常是怎么处理的?具体怎么实现?
异常处理有两种方案:
1、在每一个controller中的方法里面单独try-catch捕获处理 (代码几余,繁琐)
2、全局异常处理 (推荐的方案]
全局异常处理的实现步骤:
1、创建一个类用来专门处理异常,在类上面加上注解: @RestcontrollerAdvice
2、在里面写一个方法用来处理异常: 该方法返回值类型用同一响应结果Result,还需要使用注解@BxceptionHandler
去定义要处理的异常类型。
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result ex(Exception e) {
Log.error("全局异常处理",e);
return Result.error("系统繁忙,请稍后重试!!“);
}