登录与登录校验:Web安全核心解析

文章目录


前言

登录与登录校验是Web开发中的核心功能,涉及用户身份验证与权限控制。通过查询数据库验证用户凭据,并结合会话技术(如Cookie、Session或令牌)实现状态管理,确保系统安全性与用户体验。


登录与登录校验

一、登录功能

(一)登录成功判定

只有用户名和密码都输入正确,登录才成功;否则登录失败。

(二)本质

登录功能本质是查询操作,即依据用户名和密码查询员工信息。

(三)代码实现流程(以 Java + Spring Boot 为例)
  1. Controller 层
java 复制代码
/**
 * 登录Controller
 */
@Slf4j
@RestController
public class LoginController {
    @Autowired
    private EmpService empService;
    /**
     * 登录
     * @return
     */
    @PostMapping("/login")
    public Result login(@RequestBody Emp emp){
        log.info("用户登录:{}",emp);
        LoginInfo info=empService.login(emp);
        if (info==null) {
            return Result.error("用户名或密码错误");
        }
        return Result.success(info)                                                                                                         ;
    }
}

Controller 层主要负责接收前端传来的登录请求参数(用户名和密码),然后调用 Service 层的方法进行登录验证,最后根据验证结果返回相应的结果。

2. Service 层

java 复制代码
@Service
public class LoginServiceImpl implements LoginService {

    @Autowired
    private EmpMapper empMapper;

    @Override
    public Emp login(String username, String password) {
        // 调用 Mapper 层方法,根据用户名和密码查询员工信息
        Emp emp = empMapper.findByUsernameAndPassword(username, password);
        return emp;
    }
}

// Service 接口
interface LoginService {
    Emp login(String username, String password);
}

Service 层根据传入的用户名和密码,调用 Mapper 层方法查询员工信息,并将查询结果返回给 Controller 层。

3. Mapper 层

java 复制代码
/**
     * 根据用户名和密码查询员工信息
     * @param emp
     * @return
     */
    @Select("select id,username,name from emp where username=#{username} and password=#{password}")
    Emp selectByUserNameAndPassword(Emp emp);

Mapper 层通过执行 SQL 语句select * from emp where username = #{username} and password = #{password},从数据库中查询对应的员工信息。

二、登录校验

(一)问题与需求
  • 问题:未登录时,能直接访问部门管理、员工管理等后台功能。

  • 需求:只有员工登录成功,才允许访问后台系统数据。

(二)校验思路

利用统一拦截 (过滤器 Filter、拦截器 Interceptor)结合会话技术来实现。用户登录成功后会生成登录标记(基于会话技术),后续每次请求,统一拦截组件会获取该标记,判断用户是否已登录,进而决定是否允许访问后台功能。

三、会话技术

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

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

会话跟踪方案:

•客户端会话跟踪技术:Cookie

•服务端会话跟踪技术:Session

•令牌技术

(一)Cookie 示例(客户端会话跟踪)
java 复制代码
    //设置Cookie
    @GetMapping("/c1")
    public Result cookie1(HttpServletResponse response){
        response.addCookie(new Cookie("login_username","itheima")); //设置Cookie/响应Cookie
        return Result.success();
    }

    //获取Cookie
    @GetMapping("/c2")
    public Result cookie2(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if(cookie.getName().equals("login_username")){
                System.out.println("login_username: "+cookie.getValue()); //输出name为login_username的cookie
            }
        }
        return Result.success();
    }
  • 原理:通过响应头 Set - Cookie 向客户端设置 Cookie,客户端后续请求时通过请求头 Cookie 携带 Cookie,以此实现会话跟踪。

  • 优缺点

  • 优点:是 HTTP 协议支持的技术。

  • 缺点:移动端 APP 无法使用 Cookie;不安全,用户可自行禁用 Cookie;Cookie 不能跨域(跨域从协议、IP / 域名、端口三个维度区分)。

(二)Session 示例(服务端会话跟踪)
java 复制代码
@GetMapping("/s1")
    public Result session1(HttpSession session){
        log.info("HttpSession-s1: {}", session.hashCode());

        session.setAttribute("loginUser", "tom"); //往session中存储数据
        return Result.success();
    }

    @GetMapping("/s2")
    public Result session2(HttpSession session){
        log.info("HttpSession-s2: {}", session.hashCode());

        Object loginUser = session.getAttribute("loginUser"); //从session中获取数据
        log.info("loginUser: {}", loginUser);
        return Result.success(loginUser);
    }

Session 是服务端的会话跟踪技术,将用户登录信息存储在服务端 Session 中,后续请求通过获取 Session 中的信息判断用户是否登录。

(三)令牌技术

1.令牌会话跟踪方案的优缺点 ?

优点:

  • 支持PC端、移动端
  • 决集群环境下的认证问题
  • 减轻服务器端存储压力

缺点:需要自己实现

总结

登录功能本质是通过数据库查询验证用户身份,而登录校验则依赖统一拦截机制与会话跟踪技术(如Cookie、Session或JWT令牌)实现访问控制。每种技术各有优劣:

  • Cookie 简单但受限于客户端支持与安全性;
  • Session 服务端存储更安全,但需解决集群环境问题;
  • 令牌技术 兼容多端且无状态,适合分布式系统,但需自行实现逻辑。

合理选择方案需结合业务场景,平衡安全、性能与扩展性需求。

相关推荐
在努力的前端小白2 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
一叶飘零_sweeeet4 小时前
从繁琐到优雅:Java Lambda 表达式全解析与实战指南
java·lambda·java8
艾伦~耶格尔5 小时前
【集合框架LinkedList底层添加元素机制】
java·开发语言·学习·面试
一只叫煤球的猫5 小时前
🕰 一个案例带你彻底搞懂延迟双删
java·后端·面试
最初的↘那颗心5 小时前
Flink Stream API 源码走读 - print()
java·大数据·hadoop·flink·实时计算
JH30736 小时前
Maven的三种项目打包方式——pom,jar,war的区别
java·maven·jar
带刺的坐椅7 小时前
轻量级流程编排框架,Solon Flow v3.5.0 发布
java·solon·workflow·flow·solon-flow
David爱编程7 小时前
线程调度策略详解:时间片轮转 vs 优先级机制,面试常考!
java·后端
阿冲Runner8 小时前
创建一个生产可用的线程池
java·后端
写bug写bug8 小时前
你真的会用枚举吗
java·后端·设计模式