文档章节

token过滤器

l
 lmx160801
发布于 2017/02/03 11:58
字数 896
阅读 337
收藏 0

package com.chinasofti.controller.imp.security;

import java.io.Serializable;
import java.util.Date;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import com.chinasofti.service.bean.UserDomain;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

/**
 * @author
 * JwtTokenUtil
 */
@Component("jwtTokenUtil")
public class JwtTokenUtil implements Serializable {
    
    private static final long serialVersionUID = -3301605591108950415L;

    static final String CLAIM_KEY_USERNAME = "username";
    static final String CLAIM_KEY_PASSWORD = "password";
    static final String CLAIM_KEY_CREATED = "created";

    //private static final String AUDIENCE_UNKNOWN = "unknown";
    //private static final String AUDIENCE_WEB = "web";
    //private static final String AUDIENCE_MOBILE = "mobile";
    //private static final String AUDIENCE_TABLET = "tablet";
    
    //通过@value注解获取密钥
    //@Value("123456")
    private String secret="123456";
    
    //通过@value注解获取失效时间
    //@Value("${jwt.expiration}")
    private Long expiration=300L;
    
    @Resource(name = "tokenConfig")
    private Map<String, String> tokenConfig;

    /**
     * @param token
     * return username by Token
     */
    public String getUsernameFromToken(String token) {
        String username;
        try {
            final Claims claims = getClaimsFromToken(token);
            username = (String) claims.get(CLAIM_KEY_USERNAME);
            //username = claims.getSubject();
        } catch (Exception e) {
            username = null;
        }
        return username;
    }

    /**
     * @param token
     * return CreatedDate by Token 获取token创建时间
     */
    public Date getCreatedDateFromToken(String token) {
        Date created;
        try {
            final Claims claims = getClaimsFromToken(token);
            created = new Date((Long) claims.get(CLAIM_KEY_CREATED));
        } catch (Exception e) {
            created = null;
        }
        return created;
    }
    /**
     * @param token
     * return ExpirationDate by Token  获取token过期时间
     */
    public Date getExpirationDateFromToken(String token) {
        Date expiration;
        try {
            final Claims claims = getClaimsFromToken(token);
            expiration = claims.getExpiration();
        } catch (Exception e) {
            expiration = null;
        }
        return expiration;
    }
    /**
     * @param token
     * return Password by Token  获取token的密码
     */
    public String getPasswordFromToken(String token) {
        String password;
        try {
            final Claims claims = getClaimsFromToken(token);
            password = (String) claims.get(CLAIM_KEY_PASSWORD);
        } catch (Exception e) {
            password = null;
        }
        return password;
    }
    public Claims getClaimsFromToken(String token) {
        Claims claims;
        try {
            claims = Jwts.parser()
                    //设置签名的密钥
                    .setSigningKey(secret)
                    //把token转换成断言
                    .parseClaimsJws(token)
                    .getBody();
            Date expirationTime = Jwts.parser().setSigningKey(secret).parseClaimsJwt(token).getBody().getExpiration();
            
        } catch (Exception e) {
            claims = null;
        }
        return claims;
    }

    //生成到期日期
    private Date generateExpirationDate() {
        return new Date(System.currentTimeMillis() + expiration * 1000);
    }
    //判断token是否过期
    private Boolean isTokenExpired(String token) {
        final Date expiration = getExpirationDateFromToken(token);
        return expiration.before(new Date());
    }
    //判断token创建时间是否在密码重置之前
    private Boolean isCreatedBeforeLastPasswordReset(Date created, Date lastPasswordReset) {
        return (lastPasswordReset != null && created.before(lastPasswordReset));
    }

    /*private String generateAudience(Device device) {
        String audience = AUDIENCE_UNKNOWN;
        if (device.isNormal()) {
            audience = AUDIENCE_WEB;
        } else if (device.isTablet()) {
            audience = AUDIENCE_TABLET;
        } else if (device.isMobile()) {
            audience = AUDIENCE_MOBILE;
        }
        return audience;
    }
    //忽略token的过期时间
    private Boolean ignoreTokenExpiration(String token) {
        String audience = getPasswordFromToken(token);
        return (AUDIENCE_TABLET.equals(audience) || AUDIENCE_MOBILE.equals(audience));
    }*/

    //生成token
    public String generateToken(Map<String, Object> claims) {
        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(generateExpirationDate())
                .signWith(SignatureAlgorithm.HS512, secret)
                .compact();
    }
    //判断token是否可以刷新
    public Boolean canTokenBeRefreshed(String token, Date lastPasswordReset) {
        final Date created = getCreatedDateFromToken(token);
        return !isCreatedBeforeLastPasswordReset(created, lastPasswordReset)
                && (!isTokenExpired(token)) ;
                /*|| ignoreTokenExpiration(token))*/
    }
    //刷新token
    public String refreshToken(String token) {
        String refreshedToken;
        try {
            final Claims claims = getClaimsFromToken(token);
            claims.put(CLAIM_KEY_CREATED, new Date());
            refreshedToken = generateToken(claims);
        } catch (Exception e) {
            refreshedToken = null;
        }
        return refreshedToken;
    }
    //判读token是否有效
    public Boolean validateToken(String token, UserDomain userDomain) {
       // JwtUser user = (JwtUser) userPO;
        final String username = getUsernameFromToken(token);
        //final Date created = getCreatedDateFromToken(token);
        //final Date expiration = getExpirationDateFromToken(token);
        if(username==null){
            return false;
        }else{
        return (
                username.equals(userDomain.getUsername())
                        && !isTokenExpired(token));
                        //&& !isCreatedBeforeLastPasswordReset(created, user.getLastPasswordResetDate()));
    }
    }
    
    public String getTokenKey() {
        return tokenConfig.get("tokenKey");
    }
}

 

 

 

 

//使用filter对请求进行过滤

package com.chinasofti.controller.imp.security;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.chinasofti.service.bean.UserDomain;

/**
 * @author 

TokenCheckFilter
 */
@WebFilter("/*")
public class TokenCheckFilter implements Filter {

    private Logger logger = LoggerFactory.getLogger(getClass());

    public void init(FilterConfig filterConfig) throws ServletException {
        
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        JwtTokenUtil jwtTokenUtil = new JwtTokenUtil();
        /*//返回的协议名称,默认是http
        System.err.println("返回的协议名称"+req.getScheme());
        //返回的是你浏览器中显示的主机名,你自己试一下就知道了
        System.err.println("返回的是你浏览器中显示的主机名"+req.getServerName());
        //获取服务器端口号
        System.err.println("获取服务器端口号 "+req.getServerPort());
        //获取当前的系统路径
        System.err.println("获取当前的系统路径"+    req.getContextPath());
        String path = req.getContextPath();
        System.err.println("path" + path);*/
        
        //获取请求主页面路径
        String basePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath() + "/";
        System.err.println("basePath:" + basePath);
        // 获得请求的全路径
        String reUrl = req.getRequestURL().toString();
        System.err.println("获得请求的全路径URL:" + reUrl);

        // Checks the given token agains the userDetails retrieved.
        if (reUrl.contains("service")) {
            if (reUrl.contains("service/login")||reUrl.contains("service/pao")) {
                System.err.println("放行");
                chain.doFilter(request, response);
                
            } else {
                String token = req.getHeader("token");
                System.err.println("token:0000000000000" + token);
                jwtTokenUtil.getClaimsFromToken(token);
                UserDomain userDomain = new UserDomain();
                userDomain.setUsername("admin");
                Boolean validateToken = jwtTokenUtil.validateToken(token, userDomain);
                System.err.println("11111username:" + validateToken);
                if (userDomain != null && validateToken) {
                    System.err.println("未拦截");
                    chain.doFilter(request, response);
                    
                    // logger.info(" 请求被放行,刷新token");
                    String refreshToken = jwtTokenUtil.refreshToken(token);
                    logger.error(refreshToken, "请求被放行,刷新token");
                } else {
                    System.out.println("URI:" + reUrl + ">>>>访问被拒绝!");
                    resp.sendRedirect(basePath+"service/pao");
                    System.out.println(basePath);
                }
            }
        } else {
            logger.error("第一次登陆,未拦截");
            chain.doFilter(request, response);
        }
        
    }

    public void destroy() {

    }

}

© 著作权归作者所有

上一篇: Morphia测试
l
粉丝 0
博文 9
码字总数 2921
作品 0
私信 提问
Elasticsearch 2.2.0 分词篇:分析模块

在Elasticsearch中,索引分析模块是可以通过注册分词器(Analyzer)来进行配置。分词器的作用是当一个文档被索引的时候,分词器从文档中提取出若干词元(Token)来支持索引的存储和搜索。 分词器...

赛克蓝德
2016/02/19
736
0
Spring Cloud中Feign如何统一设置验证token

前面我们大致的聊了下如何保证各个微服务之前调用的认证问题 Spring Cloud中如何保证各个微服务之间调用的安全性 Spring Cloud中如何保证各个微服务之间调用的安全性(下篇) 原理是通过每个微...

尹吉欢
2017/11/29
0
0
spring security oauth2 自动刷新续签token (refresh token)

1.引言 前提:了解spring security oauth2的大致流程(对过滤器的内容有一定的了解) 主要思路: 首先用过期token访问受拦截资源 认证失败返回401的时候调用异常处理器 通过异常处理器结合r...

jxlgzwh
09/19
72
0
触类旁通Elasticsearch:分析数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/86693408 目录 一、什么是分析 二、分析文档 三、分析API 四、分析器、分词器、分词...

wzy0623
01/29
0
0
Spring Boot -Shiro配置多Realm

核心类简介 xxxToken:用户凭证 xxxFilter:生产token,设置登录成功,登录失败处理方法,判断是否登录连接等 xxxRealm:依据配置的支持Token来认证用户信息,授权用户权限 核心配置 Shrio整...

MeiJM
03/04
103
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
13
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
13
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部