当前位置: 首页 > news >正文

使用Filter AND Interceptor校验等录(全网独一份,机不可失)

说明:基于spring boot进行的校验

1.熟悉如何使用jwt令牌。(不会的看这里:带你领略JWTl令牌的魅力!!!-CSDN博客)

 Filter和Interceptor共用文件:(可以仿照,根据你的实际情况)

controller层代码:

/*
 * Copyright (c) 2020, 2023,  All rights reserved.
 *
 */
package com.itheima.controller;

import com.itheima.pojo.Emp;
import com.itheima.pojo.Result;
import com.itheima.service.EmpService;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>Project: tlias-web-management - LoginController</p>
 * <p>Powered by scl On 2023-10-16 14:16:46</p>
 * <p>描述:<p>
 *
 * @author 孙臣龙 [1846080280@qq.com]
 * @version 1.0
 * @since 17
 */
@Slf4j
@RestController
public class LoginController {

    @Autowired
    private EmpService empService;

    @PostMapping("/login")
    public Result login(@RequestBody Emp emp) {
        log.info("员工登录:{}", emp);
        Emp e = empService.login(emp);

        //登录成功生成令牌,下发令牌
        if (e != null) {
            Map<String, Object> climas = new HashMap<>();
            climas.put("id", e.getId());
            climas.put("name", e.getName());
            climas.put("username", e.getUsername());
            String s = JwtUtils.generateJwt(climas);
            return Result.success(s);
        }
        return Result.error("用户名或密码错误");
    }
}

service层代码:

package com.itheima.service;

import com.itheima.pojo.Emp;
import com.itheima.pojo.PageBean;
import org.springframework.format.annotation.DateTimeFormat;

import java.time.LocalDate;
import java.util.List;

/**
 * <p>Project: tlias-web-management - EmpService</p>
 * <p>Powered by scl On 2023-10-12 15:31:01</p>
 * <p>描述:<p>
 *
 * @author 孙臣龙 [1846080280@qq.com]
 * @version 1.0
 * @since 17
 */
public interface EmpService {

    /**
     * 用户登录
     * @param emp
     * @return
     */
    Emp login(Emp emp);
}

mapper层代码:

package com.itheima.mapper;

import com.itheima.pojo.Emp;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDate;
import java.util.List;

/**
 * <p>Project: tlias-web-management - EmpMapper</p>
 * <p>Powered by scl On 2023-10-12 15:29:01</p>
 * <p>描述:<p>
 *
 * @author 孙臣龙 [1846080280@qq.com]
 * @version 1.0
 * @since 17
 */
@Mapper
public interface EmpMapper {
    

    /**
     * 用户登录
     * @param emp
     * @return
     */
    @Select("select * from emp where username=#{username} and password=#{password}")
    Emp getByUserNameAndPwd(Emp emp);
}

Result(响应代码):

package com.itheima.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
    private Integer code;//响应码,1 代表成功; 0 代表失败
    private String msg;  //响应信息 描述字符串
    private Object data; //返回的数据

    //增删改 成功响应
    public static Result success(){
        return new Result(1,"success",null);
    }
    //查询 成功响应
    public static Result success(Object data){
        return new Result(1,"success",data);
    }
    //失败响应
    public static Result error(String msg){
        return new Result(0,msg,null);
    }
}

 2.Filter校验器:

①:首先需要在pom文件中添加依赖:


        <!--jwt令牌-->
        <!-- jjwt-api -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
<!--        fastJson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>

 ②:创建Filter过滤器:

/*
 * Copyright (c) 2020, 2023,  All rights reserved.
 *
 */
package com.itheima.filter;

import com.alibaba.fastjson.JSONObject;
import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.util.Locale;

/**
 * <p>Project: tlias-web-management - LoginCheckFilter</p>
 * <p>Powered by scl On 2023-10-17 16:30:20</p>
 * <p>描述:<p>
 *
 * @author 孙臣龙 [1846080280@qq.com]
 * @version 1.0
 * @since 17
 */
@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse resp= (HttpServletResponse) servletResponse;
        HttpServletRequest req= (HttpServletRequest) servletRequest;
        //获取url
        String url = req.getRequestURI().toString();
        log.info("获取的url:{}",url);

        //判断url中是否包含login
        if (url.contains("login")){
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }

        //获取请求头的内容
        String jwt = req.getHeader("token");

        //判断jwt令牌是否存在
        if (!StringUtils.hasLength(jwt)){
            log.info("请求头token不存在");
            Result error = Result.error("NOT_LOGIN");
            String nologin = JSONObject.toJSONString(error);
            resp.getWriter().write(nologin);
            return;
        }

        //解析jtw令牌
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("jwt令牌解析错误,");
            Result error = Result.error("NOT_LOGIN");
            String nologin = JSONObject.toJSONString(error);
            resp.getWriter().write(nologin);
            return;
        }

        //jwt令牌解析成功,放行
        log.info("放行");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

3.Interceptor拦截器:

①:创建拦截器:

/*
 * Copyright (c) 2020, 2023,  All rights reserved.
 *
 */
package com.itheima.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
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;

/**
 * <p>Project: tlias-web-management - LoginCheckInterceptor</p>
 * <p>Powered by scl On 2023-10-17 17:18:06</p>
 * <p>描述:<p>
 *
 * @author 孙臣龙 [1846080280@qq.com]
 * @version 1.0
 * @since 17
 */
@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override //目标资源方法运行前运行,返回true:放行,返回false:不放行
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {

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

        //判断url中是否包含login
        if (url.contains("login")){
            return true;
        }

        //获取请求头的内容
        String jwt = req.getHeader("token");

        //判断jwt令牌是否存在
        if (!StringUtils.hasLength(jwt)){
            log.info("请求头token不存在");
            Result error = Result.error("NOT_LOGIN");
            String nologin = JSONObject.toJSONString(error);
            resp.getWriter().write(nologin);
            return false;
        }

        //解析jtw令牌
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("jwt令牌解析错误,");
            Result error = Result.error("NOT_LOGIN");
            String nologin = JSONObject.toJSONString(error);
            resp.getWriter().write(nologin);
            return false;
        }

        //jwt令牌解析成功,放行
        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...");
    }
}

说明一下:有实体类代码我没有上传(需要根据你自己的数据库决定),Filter和Interceptor使用一个就可以了。

相关文章:

  • CCF CSP认证 历年题目自练Day34
  • IDEA中创建Web工程流程
  • Java NIO三大核心组件
  • python和go执行字符串表达式
  • 苏轼在密州的四首千古名作
  • DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务
  • 【RTOS学习】优先级 | Tick | 任务状态 | 空闲任务 | 任务调度
  • javaweb:mybatis:mapper(sql映射+代理开发+配置文件之设置别名、多环境配置、顺序+注解开发)
  • 一图看懂CodeArts Governance 三大特性,带你玩转开源治理服务
  • OpenCV实现人脸关键点检测
  • pdf格式的简历中的照片太小,如何修改图片的大小
  • iOS 中,isa 指针
  • 小程序 | 小程序后端用什么语言开发比较好
  • 通讯网关软件024——利用CommGate X2Access实现Modbus TCP数据转储Access
  • ORACLE 19C PDB FOR MYSQL 5.7 部署ogg
  • 1.16.C++项目:仿muduo库实现并发服务器之HttpContext以及HttpServer模块的设计
  • 事务管理 vs. 锁控制:你真的分得清吗?何时使用何种并发控制策略?
  • EfficientDet: Scalable and Efficient Object Detection
  • 多架构环境下docker-compose部署rocketmq单机模式—— 筑梦之路
  • 力扣第39题 组合总和 c++ 回溯剪枝题
  • 中国证监会印发《推动公募基金高质量发展行动方案》
  • 青年与城市共成长,第六届上海创新创业青年50人论坛将举办
  • 秦洪看盘|涌现新逻辑,A股放量回升
  • 科技赋能文化体验,“五一”假期“海昏侯”人气创新高
  • 特朗普要征100%关税,好莱坞这批境外摄制新片能躲过吗?
  • 抗战回望18︱《广西学生军》:“广西的政治基础是青年”