JwtFilter (过滤器)

本文档展示了如何在Java Spring环境中使用JWTFilter进行权限验证,并结合Shiro进行配置。JWTFilter用于检查请求头中的token,对特定URL放行并处理token的刷新。同时,配置ShiroFilterFactoryBean以自定义过滤规则,实现全站JWT验证和登录、错误页面的处理。
摘要由CSDN通过智能技术生成

1.JwtFilter 文件



import com.xxx.data.utils.RedisUtil;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.service.spi.ServiceException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@WebFilter(filterName = "jwtfilter",urlPatterns = "/*")
public class JwtFilter implements Filter {
    private Logger logger = LoggerFactory.getLogger(JwtFilter.class);
    private static final String TOKEN = "token";
    @Autowired
    private RedisUtil redisUtil;
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        //过滤放行地址
        String url = httpServletRequest.getRequestURI().startsWith("/")?httpServletRequest.getRequestURI().substring(1):httpServletRequest.getRequestURI();
        logger.info("url:{}",url);
        Map<String,Boolean> map = new HashMap<>();
        /**swagger start**/
        map.put("doc.html",true);
        map.put("webjars/bycdao-ui",true);
        map.put("swagger-resources",true);
        map.put("v2/api-docs",true);
        map.put("data/verification/login",true);
        map.put("data/enterpriseFollowMonitorDetail/listAll",true);
        map.put("data/enterpriseFollowMonitorDetail/update",true);
        map.put("data/enterpriseController/enterpriseRecommend",true);
        /**swagger end**/

        /** 业务放行地址**/
//        map.put("data/aiIndustrySystem",true);
        for(String passUrl: map.keySet()){
            if(url.contains(passUrl)){
                filterChain.doFilter(servletRequest,servletResponse);
                logger.info("passUrl:{}",url);
                return;
            }
        }
        String token = httpServletRequest.getHeader("token");
        if(null==token){
            throw new ServiceException("token 不合法!");
        }
        if(StringUtils.isNotBlank(token)){
            if(refreshToken(token)){
                filterChain.doFilter(servletRequest,servletResponse);
            }
        }
//        throw new ServiceException("token 检验失败!");
    }

    @Override
    public void destroy() {

    }
    //刷新token时间
    public boolean refreshToken(String token) {
        String tokenKey = "sys:user:token" + token ;
        String cacheToken =(String)redisUtil.get(tokenKey);
        if (StringUtils.isNotEmpty(cacheToken)) {
            // 校验token有效性,注意需要校验的是缓存中的token
            if (JwtTokenUtil.checkToken(cacheToken)) {
                redisUtil.set(tokenKey, cacheToken) ;
                redisUtil.expire(tokenKey, 30 * 600 * 2);
                return true;
            }else{
                return false;
            }
        }else{
            if (JwtTokenUtil.checkToken(token)) {
                redisUtil.set(tokenKey, token) ;
                redisUtil.expire(tokenKey, 30 * 60 * 2);
                return true;
            }
        }
        return false;
    }
//    //刷新token时间
//    public boolean refreshToken(String token) {
//        String tokenKey = "sys:user:token" + token ;
//        String cacheToken = String.valueOf("xxxxxxxxxxxxx");
//        if (StringUtils.isNotEmpty(cacheToken)) {
//            // 校验token有效性,注意需要校验的是缓存中的token
//            if (JwtTokenUtil.checkToken(cacheToken)) {
//                String newToken = JwtTokenUtil.createToken(JwtTokenUtil.getJwtPayLoad(cacheToken));
//                // 设置超时时间
//                redisUtil.set(tokenKey, newToken) ;
//                redisUtil.expire(tokenKey, 30 * 60 * 2);
//                return true;
//            }
//        }else{
//            // 校验token有效性,注意需要校验的是缓存中的token
//            if (JwtTokenUtil.checkToken(cacheToken)) {
//                String newToken = JwtTokenUtil.createToken(JwtTokenUtil.getJwtPayLoad(cacheToken));
//                // 设置超时时间
                redisUtil.set(tokenKey, newToken) ;
                redisUtil.expire(tokenKey, 30 * 60 * 2);
//                return true;
//            }
//        }
//        return false;
//    }
}

2.添加自己的过滤器

import com.huishu.attractInvestment.webapp.invest.config.jwt.JwtFilter;
import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
import org.apache.shiro.mgt.DefaultSubjectDAO;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

 
@Configuration
public class ShiroConfiguration {

 
	//需要添加的
    @Bean(name = "shiroFilter")
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        // 添加自己的过滤器并且取名为jwt
        LinkedHashMap<String, Filter> filters = new LinkedHashMap<>();
        filters.put("jwt", new JwtFilter());
        factoryBean.setFilters(filters);
        factoryBean.setSecurityManager(securityManager);
        factoryBean.setLoginUrl("/login");
        factoryBean.setUnauthorizedUrl("/401");

        /*
         * 自定义url规则
         * http://shiro.apache.org/web.html#urls-
         */
        Map<String, String> filterRuleMap = new HashMap<>();
        // 所有请求通过我们自己的JWT Filter
        filterRuleMap.put("/**", "jwt");
        // 访问401和404页面不通过我们的Filter
        filterRuleMap.put("/401", "anon");
        filterRuleMap.put("/controller/login/**","anon");
        factoryBean.setFilterChainDefinitionMap(filterRuleMap);
        return factoryBean;
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

10000guo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值