1. 登录校验的实现思路是怎样的?
只是通过验证密码和用户名的方式登录是无法真正完成登录功能的,通过地址直接访问某项具体功能就会跳过登录界面。所以在完成基础的登录功能后,还需要进行登录校验。具体思路如下
首先在用户登录成功后,将用户登录成功的信息存储起来,记录用户已经成功登录的标记。
其次,在客户端向服务端发起请求时,需要在服务端进行统一拦截,然后读取登录标记中的信息,如果有登录成功的信息,就说明用户登陆成功,放过请求,如果没有登录标记,或者登录标记中的信息不正确,给客户端返回相应的错误信息,并且页面会跳转至登录界面,重新登陆。
2. 会话跟踪技术有哪些方式可以实现?
会话就是服务端和客户端进行连接,知道其中一方断开连接,会话才会结束。通俗点来说,就是双方进行信息的交互,一方发送请求,一方给予回应。一次会话中,会有多个请求,多个响应。
会话跟踪技术就是一种维护浏览器状态的方法。服务器需要识别多次请求是否来自于同一浏览器,来自于同一浏览器的,会在同一次会话中的多次请求间共享数据。服务器识别浏览器的过程就是会话跟踪。
具体实现的方法有两种,一种是传统的方法,Cookie和Session配合使用。还有一种是令牌技术JWT。
3. JWT令牌组成部分有哪些,各自作用是什么?
分为三部分:
第一部分:Header:记录令牌类型,签名算法等。
第二部分:Payload:携带一些用户信息及过期时间等。
第三部分:Signature:防止Token被篡改,确保安全性。
4. 怎么使用JWT令牌?(依赖,创建,校验)
第一步,引入依赖。
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
第二步、创建一个JWT的工具类,用来生成JWT令牌。
String jwt = Jwts.builder()
.setClaims(claims) //执行第二部分负载, 存储的数据
.signWith(SignatureAlgorithm.HS256, "miyao") //签名算法及秘钥
.setExpiration(new Date(System.currentTimeMillis() + 12*3600*1000)) //设置令牌的有效期
.compact();
上图中,Jwts.builder()方法来构建JWT令牌。用setClaims存储数据,signWith是令牌的算法和密钥,setExpiration是为令牌设置有效期。最后用compact()方法来生成JWT令牌。得到的是一串字符串。
第三步,在Controller层调用创建的工具类,将前端接受的数据,进行登陆判断。成功登录,生成JWT令牌,并回传个前端。后续在有请求时,前端会在请求头header中携带token到服务端,token的值就是登录是发送的令牌。通过对令牌的解析来成功与否进行校验判断,解析成功校验成功,解析失败,校验失败。
5. 项目中在什么时候去生成令牌?
在登录阶段生成令牌。
6. 当前端携带令牌访问资源时怎么去拦截校验令牌的合法性?
通过Filter过滤器或者Interceptor拦截器,把对资源的请求拦截下来,然后再对令牌的合法性进行校验。校验成功则通过,失败则返回登录界面。
7. 过滤器具体使用的步骤是怎样的?
第一步、定义类,实现Filter接口,并重写doFilter方法
第二步、配置资源拦截路径,具体方法:在Filter的实现类上定义@WebFilter注解。(/*,表示拦截所有路径)
@WebFilter(urlPatterns = "/*")
第三步、在引导类上使用@ServletComponentScan注解,开启Servlet组件扫描。
8. 拦截器具体使用的步骤是怎样的?
第一步、定义拦截器,实现HandlerInterceptor接口,重写其所有方法。
第二步、注册拦截器。
9. 项目中异常是怎么处理的?具体怎么实现?
两种方法,第一种,在Controller的方法中进行try...catch处理,抓住异常。第二种是全局处理方案。
第一种用try...catch把代码包起来就可以了,比较简单,要是处理的异常过多,就会导致代码过于臃肿。
第二种全局处理方案,定义一个类,里面定义一个方法,用来接收所有异常。类上要定义@RestControllerAdvice注解,方法上面要定义个 @ExceptionHandler(Exception.class)注解。