spring boot — 拦截器

1. 配置拦截器

package com.gl.crpt.common.Interceptor;

import com.auth0.jwt.interfaces.Claim;
import com.gl.crpt.system.entity.User;
import com.gl.crpt.system.service.UserService;
import com.gl.crpt.system.util.BadRequestException;
import com.gl.crpt.system.util.TokenUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Map;


@Component
public class LoginInterceptor implements HandlerInterceptor{

    private final String tokenHeader;//定义token
    private final UserService userService;

    public LoginInterceptor(@Value("${jwt.header}") String tokenHeader, UserService userService) {
        this.tokenHeader = tokenHeader;
        this.userService = userService;
    }


    /**
     * 拦截(Controller方法调用之前)
     *
     * @param request  request
     * @param response response
     * @param o        o
     * @return 通过与否
     * @throws Exception 异常处理
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {


        HttpSession session = request.getSession();//获取session

     

        //获取token
        final String requestHeader = request.getHeader(this.tokenHeader);


        String username = null;
        String authToken = null;
        if (requestHeader != null && requestHeader.startsWith("Bearer ")) {
            //获取token中Bearer的值
            authToken = requestHeader.substring(7);
            try {
                //从token中获取username
                Map<String, Claim> stringClaimMap = TokenUtil.verifyToken(authToken);
                System.out.println(stringClaimMap);
                username = stringClaimMap.get("token").asString();

                User users = (User) userService.findByName(username);
                session.setAttribute("user",users);//将用户信息存入seesion中
                //request.setAttribute("user",users);
//                username = jwtTokenUtil.getUsernameFromToken(authToken);

                return true;
            } catch (Exception e) {

                //log.error(e.getMessage());
                throw new BadRequestException("token已经失效");
            }
        }
        System.out.println("没有token");
        throw new BadRequestException("token不存在,请些登录账号");
    }

    // 此方法为处理请求之后调用(调用过controller方法之后,跳转视图之前)
    @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 {

    }





}




2.配置拦截器生效

package com.gl.crpt.common.Interceptor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


/**
 * 配置拦截器
 */
@Configuration
public class MyHandlerInterceptorConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;


    // 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // addPathPatterns("/**") 表示拦截所有的请求,
        // excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问
        registry.addInterceptor(loginInterceptor)
                //.excludePathPatterns("**/api/login")
                .excludePathPatterns("/loginsss")//测试
                .excludePathPatterns("/error")
                .excludePathPatterns("/swagger-ui.html")//api接口文档
                .excludePathPatterns("/swagger-resources/**")//api接口文档
                .excludePathPatterns("/webjars/**")//api接口文档
                .excludePathPatterns("/*/api-docs")//api接口文档
                .excludePathPatterns("/*/yzm")//图片验证码
                .excludePathPatterns("/*/img")//图片验证码
                .excludePathPatterns("/*/addusr")//注册
                .excludePathPatterns("/*/email")//邮箱
                .excludePathPatterns("/*/all")//获取所有企业
                .excludePathPatterns("/*/allaoe")//获取所有aoe等级
                .addPathPatterns("/**")//拦截所有
        ;
    }



}

3.创建和获取token

package com.gl.crpt.system.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class TokenUtil {



    /**
     * 公共密钥
     */
    public static final String SECRET = "michong";


    /**
     * 创建token
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String createToken(String tokens) throws UnsupportedEncodingException {

        //签发时间
        Date date = new Date();

        //过期时间- 1分钟过期
        Calendar nowTime = Calendar.getInstance();
        nowTime.add(Calendar.MINUTE,600);
        Date expiresDate = nowTime.getTime();

        Map<String,Object> map = new HashMap<>();
        map.put("alg","HS256");
        map.put("typ","JWT");
        String token = JWT.create()
                .withClaim("token", tokens)
                //设置过期时间
                .withExpiresAt(expiresDate)
                //设置签发时间
                .withIssuedAt(date)
                .sign(Algorithm.HMAC256(SECRET));

        return token;
    }


    /**
     * 解密
     * @param token
     * @return
     * @throws UnsupportedEncodingException
     */
    public static Map<String, Claim> verifyToken(String token) throws UnsupportedEncodingException {

        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET))
                .build();

        DecodedJWT jwt = null;

        try{

            //解密
            jwt = verifier.verify(token);

        }catch (Exception e){
            throw new RuntimeException("token已经失效");
        }

        return jwt.getClaims();

    }



}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,可以使用拦截器来对请求进行拦截和处理。拦截器是一种AOP(面向切面编程)的技术,在请求到达控制器之前或之后对请求进行处理。拦截器可以用于实现一些通用的功能,如日志记录、权限验证、参数校验等。 在Spring Boot中定义拦截器需要以下步骤: 1. 创建一个拦截器类,该类需要实现HandlerInterceptor接口。可以在拦截器中重写preHandle、postHandle和afterCompletion等方法来实现请求的前置处理、后置处理和完成处理。 2. 创建一个拦截器配置类,该类需要实现WebMvcConfigurer接口,并重写addInterceptors方法。在该方法中,可以注册拦截器类,并为其定义拦截规则。 在配置类中,可以通过使用addPathPatterns方法来定义需要拦截的请求路径,也可以使用excludePathPatterns方法来排除某些请求路径不被拦截。 拦截器与过滤器在功能和使用上有一些区别: 1. 归属不同:过滤器属于Servlet技术,而拦截器属于SpringMVC技术。 2. 内容不同:过滤器对所有访问进行增强,而拦截器仅针对SpringMVC的访问进行增强。 通过上述步骤定义和配置拦截器,可以在Spring Boot应用中实现对请求的拦截和处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Spring-Boot 拦截器](https://blog.csdn.net/PeterMrWang/article/details/123916751)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Springboot——拦截器](https://blog.csdn.net/weixin_51351637/article/details/128058053)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值