Java 定义基础拦截器

Posted Java小周

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 定义基础拦截器相关的知识,希望对你有一定的参考价值。

项目中拦截器用来处理特定的需要拦截的请求来进行一些特殊处理,如token验证,用户校验等等

一般需要以下两个类来实现一个基础拦截器的功能

AuthenticationInterceptor类

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**
 * @Auther: 周先生
 * @Date: 2022/4/02 12:26
 * @Description:  用拦截器校验token
 */
@Slf4j
public class AuthenticationInterceptor implements HandlerInterceptor 
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception 

        String token = httpServletRequest.getHeader("userToken");// 从 http 请求头中取出 token

        if(!JwtUtil.verifyToken(token))  //校验token
            throw new BadRequestException(HttpStatus.UNAUTHORIZED,"Token已过期或不存在");
        

        return true;
    

    @Override
    public void postHandle(HttpServletRequest httpServletRequest,
                           HttpServletResponse httpServletResponse,
                           Object o, ModelAndView modelAndView) throws Exception 

    
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest,
                                HttpServletResponse httpServletResponse,
                                Object o, Exception e) throws Exception 
    

InterceptorConfig类
 

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @Auther: 周先生
 * @Date: 2022/4/02 12:26
 * @Description: 拦截器,拦截所有资源
 */
@Configuration
public class InterceptorConfig implements WebMvcConfigurer 
    @Override
    public void addInterceptors(InterceptorRegistry registry) 
        registry.addInterceptor(authenticationInterceptor())
                .addPathPatterns("/**/h5/**");   //拦截路径
    
    // 由于拦截器执行顺序的问题,必要要把第二个类加入容器,不然会报错,具体的解释我忘记了,旨在网上看到郭义熙,可以自行查阅
    @Bean
    public AuthenticationInterceptor authenticationInterceptor() 
        return new AuthenticationInterceptor();
    

addPathPatterns("/**/h5/**") 用来拦截所有请求中带/h5/ 的请求并进行token验证

至于其他请求不做拦截处理

附上Jwt  Token验证工具类

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import lombok.extern.slf4j.Slf4j;

import java.util.Calendar;
import java.util.Date;

/**
 * @author 周先生
 * @version 1.0
 * @Description
 * @Classname JwtUtil
 * @company
 * @Date 2021/12/17 10:07
 */
@Slf4j
public class JwtUtil 
    private static final String SECRET_KEY = "6XAOBsoCtqN&yMjO3C#N%5MtsNQQmWIL";

   
    /**
     * 生成用户Token
     * @param username
     * @param minute
     * @return
     */
    public static String generateUser(String username, int minute)
        Calendar nowTime = Calendar.getInstance();
        nowTime.add(Calendar.MINUTE, minute);
        Date expiresDate = nowTime.getTime();
        return JWT.create().withIssuedAt(new Date())
                .withExpiresAt(expiresDate)
                .withClaim("username", username)
                .sign(Algorithm.HMAC256(SECRET_KEY));
    


    /**
     * 检验合法性
     * @param token
     */
    public static Boolean verifyToken(String token) 
        try 
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET_KEY)).build();
            verifier.verify(token);
            return true;
         catch (Exception e) 
            return false;
        
    


    public static String getUser(String token)
        if(!verifyToken(token))
            return null;
        
        Claim claim = JWT.decode(token).getClaim("username");
        if(claim == null)
            return null;
        
        return claim.asString();
    

    public static void main(String[] args) 
        log.info(generateUser("ce569b67cf942f625033287fefda287e", 14400));
        log.info(getUser("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzIwMTk1NTUsImlhdCI6MTYzMTkzMzE1NSwidXNlcklkIjoiZDEyZTJlOGI0MDcyNGEwZjc3NmY5MGYyZTJjOTY0ODMifQ.1hMQrspnriRqTpRcRIgDLLPyyKCb29p6LCqsD9kIURG"));
    

超强干货来袭 云风专访:近40年码龄,通宵达旦的技术人生

以上是关于Java 定义基础拦截器的主要内容,如果未能解决你的问题,请参考以下文章

Java 定义基础拦截器

《大道至简》第一章读后感Java伪代码

《程序员周先生之前端开发面试题》

《程序员周先生之前端开发面试题》

struts2自定义拦截器

20145319 第五周学习总结