【JavaWeb】登录校验的实现

目录

一、概述

二、会话技术

1、什么是会话技术

2、会话跟踪方案对比

方案一:Cookie

方案二:Session

方案三:令牌技术

三、JWT令牌技术

1、简介

2、应用场景

3、JWT的生成

4、生成令牌

四、过滤器Filter

1、概念

2、Filter快速入门 

3、Filter详解

Filter执行流程

Filter拦截路径

过滤器链

4、登录校验Filter

 流程

 五、拦截器Interceptor

1、概述

2、Interceptor快速入门

​3、Interceptor详解 

 拦截器-拦截路径

 拦截器-执行流程

4、登录校验Interceptor


一、概述

没有登录校验的话,即使我们没有登录,也能访问功能网页。

解决方法是加上登录标记统一拦截功能

 二、会话技术

1、什么是会话技术

  • 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
  • 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据
  • 会话跟踪方案
    • 客户端会话跟踪技术:Cookie(传统)
    • 服务端会话跟踪技术:Session(传统)
    • 令牌技术(主流)

2、会话跟踪方案对比

方案一:Cookie

 注:什么叫跨域

 三个维度任何一个不同就不是相同的域

方案二:Session

 方案三:令牌技术

三、JWT令牌技术

1、简介

  • 全称:JSON Web Token(https://jwt.io/
  • 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。
  • 组成:
    • 第一部分:Header(头),记录令牌类型、签名算法等。例如:{"alg":"HS256","type":"JWT"}
    • 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。例如:{"id":"1","username":"Tom"}
    • 第三部分:Signature(签名),防止Token被簒改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。

 2、应用场景

  • 场景:登录认证
  1. 登录成功后,生成令牌
  2. 后续每个请求,都要携带JWT令牌,系统在每次请求处理之前,先校验令牌,通过后,再处理

 3、JWT的生成

    /**
     * 生成JWT
     */
    @Test
    public void testGenJwt(){
        Map<String, Object> claims = new HashMap<>();
        claims.put("id",1);
        claims.put("name","tom");
        String jwt = Jwts.builder()
                .signWith(SignatureAlgorithm.HS256, "iknow")//算法签名
                .setClaims(claims)//自定义内容(载荷)
                .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置有效期为1h
                .compact();
        System.out.println(jwt);
    }
    /**
     * 解析JWT
     */
    @Test
    public void testParseJwt(){
        Claims claims = Jwts.parser()
                .setSigningKey("iknow")
                .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY4NzYwNzQ4Mn0.ytrShABndc41ZCcVOdeoGwbSsXhQIGPFHsk5l8qATJg")
                .getBody();
        System.out.println(claims);
    }

注意事项

  • JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的。
  • 如果JWT令牌解析校验时报错,则说明JWT令牌被篡改或失效了,令牌非法。

思路

  • 令牌生成:登录成功后,生成JWT令牌,并返回给前端。
  • 令牌校验:在请求到达服务端后,对令牌进行统一拦截、校验。

4、生成令牌

步骤

  • 引入JWT令牌操作工具类。
  • 登录完成后,调用工具类生成JWT令牌,并返回。

四、过滤器Filter

1、概念

  • 概念:Filter过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
  • 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
  • 过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

2、Filter快速入门 

步骤

  1. 定义Filter:定义一个类,实现 Filter接口,并重写其所有方法。
  2. 配置Filter:Filter类上加@WebFilter注解,配置拦截资源的路径。引导类上加@ServletComponentScan开启Servlet组件支持。

 

 3、Filter详解

Filter执行流程

疑问

  • 放行后访问对应资源,资源访问完成后,还会回到Filter中吗?
  • 如果回到Filter中,是重新执行还是执行放行后的逻辑呢?执行放行后逻辑

Filter拦截路径

  • Filter 可以根据需求,配置不同的拦截资源路径:

 过滤器链

  • 介绍:一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链
  • 顺序:注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序。

4、登录校验Filter

 流程

 

package com.iknow.tliaswebmanagement.filter;

import com.alibaba.fastjson.JSONObject;
import com.iknow.tliaswebmanagement.pojo.Result;
import com.iknow.tliaswebmanagement.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;

        //1.获取请求url
        String url = req.getRequestURL().toString();
        log.info("请求的url:{}",url);

        //2.判断请求url中是否包含login,如果包含,说明是登录操作,放行
        if (url.contains("login")){
            log.info("登录操作,放行...");
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }
        //3.获取请求头中的令牌(token)
        String jwt = req.getHeader("token");

        //4.判断令牌是否存在,如果不存在,返回错误结果(未登录)
        if(!StringUtils.hasLength(jwt)){
            log.info("请求头token为空,返回未登录的信息");
            Result error = Result.error("NOT_LOGIN");
            //手动转化 对象--json --------------> 阿里巴巴fastJSON
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return;
        }

        //5.解析token,如果解析失败,返回错误结果(未登录)
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析令牌失败,返回未登录错误信息");
            Result error = Result.error("NOT_LOGIN");
            //手动转化 对象--json --------------> 阿里巴巴fastJSON
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return;
        }

        //6.放行
        log.info("令牌合法,放行");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

 五、拦截器Interceptor

1、概述

  • 概念:是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截控制器方法的执行。
  • 作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。

 2、Interceptor快速入门

步骤

  1. 定义拦截器,实现Handlerlnterceptor接口,并重写其所有方法。
  2. 注册拦截器

3、Interceptor详解 

 拦截器-拦截路径

  • 拦截器可以根据需求,配置不同的拦截路径:

 拦截器-执行流程

 4、登录校验Interceptor

package com.iknow.tliaswebmanagement.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.iknow.tliaswebmanagement.pojo.Result;
import com.iknow.tliaswebmanagement.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override //目标资源方法运行前运行,返回true;放行,放回false,不放行
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {

        //1.获取请求url
        String url = req.getRequestURL().toString();
        log.info("请求的url:{}",url);

        //2.判断请求url中是否包含login,如果包含,说明是登录操作,放行
        if (url.contains("login")){
            log.info("登录操作,放行...");
            return true;
        }
        //3.获取请求头中的令牌(token)
        String jwt = req.getHeader("token");

        //4.判断令牌是否存在,如果不存在,返回错误结果(未登录)
        if(!StringUtils.hasLength(jwt)){
            log.info("请求头token为空,返回未登录的信息");
            Result error = Result.error("NOT_LOGIN");
            //手动转化 对象--json --------------> 阿里巴巴fastJSON
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return false;
        }

        //5.解析token,如果解析失败,返回错误结果(未登录)
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析令牌失败,返回未登录错误信息");
            Result error = Result.error("NOT_LOGIN");
            //手动转化 对象--json --------------> 阿里巴巴fastJSON
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return false;
        }

        //6.放行
        log.info("令牌合法,放行");
        return true;
    }

    @Override //目标资源方法运行后运行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle ...");
    }

    @Override //视图渲染完毕后运行,最后运行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion ...");
    }
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要实现JavaWeb登录和注册功能,可以按照以下步骤进行: 1. 创建数据库表格,用于存储用户注册的信息,如用户名、密码等。 2. 在JavaWeb项目中创建登录和注册页面,可以使用HTML和CSS进行页面设计。 3. 在JavaWeb项目中创建一个Servlet,用于处理用户的登录和注册请求。可以使用JDBC连接数据库,从而实现对用户注册信息的插入和查询操作。 4. 在Servlet中处理用户登录和注册请求时,需要对用户输入的用户名和密码进行验证,验证成功后再执行登录或注册操作。 5. 在登录成功后,可以将用户信息保存在Session中,方便在其他页面进行身份验证。 6. 在JavaWeb项目中,还可以使用Filter实现用户身份验证、权限控制等功能。 通过以上步骤的实现,就可以完成JavaWeb登录和注册功能。 ### 回答2: 要实现Java Web的登录和注册功能,可以按照以下步骤进行。 首先,需要创建一个数据库来存储用户的登录和注册信息,可以使用MySQL或者其他关系型数据库。在数据库中创建一个用户表,包含用户名、密码等字段。 接下来,需要创建一个Java类来处理用户的登录和注册请求。可以使用Servlet或者Spring MVC框架。在该类中,可以实现以下功能: 1. 注册功能:接收用户提交的注册信息,包括用户名和密码。在数据库中查询是否已存在该用户名,如果不存在,则将用户信息插入数据库中。如果存在重名,则返回注册失败的提示信息。 2. 登录功能:接收用户提交的登录信息,包括用户名和密码。在数据库中查询该用户名是否存在,并验证密码是否正确。如果验证通过,则表示登录成功;否则,返回登录失败的提示信息。 在前端页面上,可以使用HTML、CSS和JavaScript实现注册和登录页面。通过表单提交用户输入的信息,并将其发送给后端处理。 在注册和登录过程中,要注意对用户输入的数据进行校验和过滤,防止SQL注入、XSS攻击等安全问题。可以使用正则表达式或者一些常见的安全库来进行过滤和验证。 此外,还可以加入一些其他功能,例如密码加密、记住登录状态、验证码等,以增加系统的安全性和用户体验。 最后,可以进行测试和优化。通过模拟用户的注册和登录过程,检查功能是否正常,同时分析性能并进行调优,以提高系统的稳定性和响应速度。 以上就是实现Java Web登录和注册功能的基本步骤,可以根据具体需求和技术栈进行调整和扩展。 ### 回答3: 要实现JavaWeb登录和注册功能,可以按照以下步骤进行。 首先,在后端创建一个User类,包含用户的属性如用户名、密码等,以及相应的getter和setter方法。 接着,创建一个数据库表来存储用户信息。可以用MySQL或其他数据库管理系统创建一个名为"user"的表,包含用户名和密码字段。 在后端创建一个UserDao类,包含对用户信息的操作方法,如添加用户、查询用户等。可以使用JDBC技术实现与数据库的交互。 创建一个RegisterServlet类,处理用户的注册请求。在该类的doPost方法中,获取用户输入的用户名和密码,然后通过UserDao的方法将用户信息添加到数据库中。 创建一个LoginServlet类,处理用户的登录请求。在该类的doPost方法中,获取用户输入的用户名和密码,然后通过UserDao的方法查询数据库中是否存在该用户。若存在,则登录成功,跳转到登录成功的页面;若不存在,则登录失败,返回登录页面并给出提示。 在前端创建一个注册页面,包含输入用户名和密码的表单以及一个提交按钮。当用户填写完毕后,点击提交按钮将表单数据发送到RegisterServlet进行注册。 在前端创建一个登录页面,包含输入用户名和密码的表单以及一个提交按钮。当用户填写完毕后,点击提交按钮将表单数据发送到LoginServlet进行登录。 最后,将注册页面和登录页面部署到服务器上,用户可以通过浏览器访问这两个页面进行注册和登录操作。 通过以上步骤,就可以实现JavaWeb登录和注册功能。当用户填写注册信息并提交后,会将用户信息存储到数据库中;当用户填写登录信息并提交后,会与数据库中的信息进行比对,判断登录是否成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iknow181

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值