SpringBootWeb登录认证

登录服务端的核心逻辑就是:接收前端请求传递的 用户名 和 密码 ,然后再根据用户名和密码查询用户信息,如果用户信息存在,则说明用户输入的用户名和密码正确。如果查询到的用户不存在,则说明用户输入的用户名和密码错误。

  • 统一拦截:可以使用两种技术实现,Filter过滤器  以及 Interceptor 拦截器。
  • 登录标记:就需要用户登录成功之后,每一次请求中,都可以获取到该标记。

会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据

客户端会话跟踪技术:Cookie

服务端会话跟踪技术:Session

**会话建立之后,Session给浏览器响应数据的同时,返回一个响应头 set-cookie,值呢就是服务器会话session的ID,然后浏览器就会将对应的值写入浏览器的Cookie

**这种方式有个缺点就是只能在一个服务器中运用,服务器和服务器之间不能传送数据。现在市场上服务器都是集群分布,现在已经很少用了。

令牌

  • 在进行登录请求时,如果用户登录成功,可以给前端响应一个令牌(其实就是一个特殊的字符串,就是一个用户合法的身份凭证)。
  • 前端需要将登录返回的令牌记录下来,保存在浏览器端(客户端)。
  • 该浏览器在后续的请求中,每一次请求都会将该令牌携带到服务端,然后接下来在服务端,我们可以通过Filter或Interceptor对所有的请求进行拦截,然后进行校验,获取到请求中携带过来的令牌,进行判断,如果令牌正确合法,则放行,如果令牌不合法,则直接返回错误信息给前端,前端跳转到登录页面

JWT令牌由Header、Payload、Signature三部分组成

第一部分:Header(头),作用:记录令牌类型、签名算法等。

第二部分:Payload(有效载荷),作用:携带一些用户信息及过期时间等。

第三部分:Signature(签名),作用:防止Token被篡改、确保安全性。

JWT生成:

public class JwtDemo {

    @Test
    public void genJwt(){
        Map<String,Object> claims = new HashMap<>();
        claims.put("id",1);
        claims.put("username","Tom");

        String jwt = Jwts.builder()
                .setClaims(claims) //执行第二部分负载, 存储的数据
                .signWith(SignatureAlgorithm.HS256, "itheima") //签名算法及秘钥
                .setExpiration(new Date(System.currentTimeMillis() + 12*3600*1000)) //设置令牌的有效期
                .compact();
        System.out.println(jwt);
    }

}

JWT校验:

 @Test
    public void parseJwt(){
        Claims claims = Jwts.parser()
                .setSigningKey("itheima")
            				.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZXhwIjoxNjU5OTk1NTE3LCJ1c2VybmFtZSI6IlRvbSJ9.EUTfeqPkGslekdKBezcWCe7a7xbcIIwB1MXlIccTMwo")
                .getBody();
        System.out.println(claims);
    }

Filter:

Filter 过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。

1). 定义类,实现 Filter接口,并重写doFilter方法

2). 配置Filter拦截资源的路径:在类上定义 @WebFilter 注解

3). 在doFilter方法中输出一句话,并放行

4). 在引导类上使用@ServletComponentScan 开启 Servlet  组件扫描

image.png

  • 拦截器Interceptor
  • 拦截器:(Interceptor)是一种动态拦截方法调用的机制,类似于过滤器。在SpringMVC中动态拦截控制器方法的执行

 

  1. 定义拦截器,实现HandlerInterceptor接口,并重写其所有方法。
  2. 注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");
    }
}

  • 获取请求url。
  • 判断请求url中是否包含login,如果包含,说明是登录操作,放行。
  • 获取请求头中的令牌(token)。
  • 判断令牌是否存在,如果不存在,返回错误结果(未登录)。
  • 解析token,如果解析失败,返回错误结果(未登录)。
  • 放行。
 //返回统一NOT_LOGIN结果给前端
            Result errorResult = Result.error("NOT_LOGIN");
            //java对象  JSON之间的映射
            ObjectMapper objectMapper = new ObjectMapper();
            //把java对象变成json字符串
            String json = objectMapper.writeValueAsString(errorResult);
            //返回到前端
            response.getWriter().write(json);
            return false;

全局异常处理器

@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * Exception异常分类
     *  - 运行时异常 : RuntimeException , 编译时无需处理 .
     *  - 编译时异常 : 非 RuntimeException , 编译时处理 .
     */
    @ExceptionHandler(Exception.class)
    public Result ex(Exception ex){
        ex.printStackTrace();
        return Result.error("系统繁忙, 请稍后重试 ... ");
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值