zoukankan      html  css  js  c++  java
  • SSM基于Token的登录认证

    1、什么是token

    token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。

    当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。

    简单token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)

    2、SSM基于XML配置

    pom.xml引入

            <!-- token -->
           <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>2.2.0</version>
           </dependency>
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>0.9.0</version>
            </dependency>

    spring-mvc.xml

    配置拦截器

    <mvc:interceptors>
            <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
            <!-- <bean class="com.bybo.aca.web.interceptor.Login"/> -->
            <mvc:interceptor>
                <!-- 进行拦截:/**表示拦截所有controller -->
                <mvc:mapping path="/**" />
                <!-- 不进行拦截 -->
                <mvc:exclude-mapping path="/user/login"/>
                 <!-- 不进行拦截 -->
                <mvc:exclude-mapping path="/get/tableInforAllByStatus" />
                <bean class="com.baccarat.util.JWTInterceptor" />
            </mvc:interceptor>
        </mvc:interceptors>

    拦截器实体类

    package com.baccarat.util;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.log4j.Logger;
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.baccarat.controller.UserController;
    import com.baccarat.entity.User;
    
    
    @Component
    public class JWTInterceptor implements HandlerInterceptor{
        public static Logger logger = Logger.getLogger(UserController.class);
    
        
        public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
                throws Exception {
            // TODO Auto-generated method stub
     
        }
     
        public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
                throws Exception {
            // TODO Auto-generated method stub
     
        }
     
        /**
         * Token validates the interceptor
         * @author Stephen
         * @time 2019-10-11 17:00:32
         * */
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws IOException {
            ResultVO result = new ResultVO();
            PrintWriter out = null ;
            String token = request.getHeader("token");
            String userId = request.getHeader("userId");
            /** 您的处理逻辑 */
    
            //以下是返回拦截器拦截后返回json格式的方式
            result.setStatus(203);
            result.setMessage("Login verification failed, please login again");
            String jsonStr = BaccaratUtil.toJSon(result);
            
            response.setCharacterEncoding("UTF-8");  
            response.setContentType("application/json; charset=utf-8");
            
            out = response.getWriter();
            out.append(jsonStr);
            return false;
        }
        
         
    }

    JWTUtil.java

    package com.baccarat.util;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.apache.log4j.Logger;
    
    import com.auth0.jwt.JWTSigner;
    import com.auth0.jwt.JWTVerifier;
    import com.auth0.jwt.internal.com.fasterxml.jackson.databind.ObjectMapper;
    import com.baccarat.controller.UserController;
    import com.baccarat.entity.User;
    
    /**
     * @Todo JWT(json web token),util
     * @author Stephen
     * @Time 2019-10-11 12:12:04
     */
    public class JWTUtil {
    
        private static Logger logger = Logger.getLogger(UserController.class);
        
        private static final String SECRET = "XX#$%()(#*!()!KL<><MQLMNQNQJQK sdfkjsdrow32234545fdf>?N<:{LWPW";
    
        private static final String EXP = "exp";
    
        private static final String PAYLOAD = "payload";
    
        private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        /**
         * @Todo Encrypt, passing in an object and expiration date
         * @author Stephen
         * @Time 2019-10-11 12:12:44
         */
        public static <T> String sign(T object, long maxAge) {
            try {
                final JWTSigner signer = new JWTSigner(SECRET);
                final Map<String, Object> claims = new HashMap<String, Object>();
                ObjectMapper mapper = new ObjectMapper();
                String jsonString = mapper.writeValueAsString(object);
                claims.put(PAYLOAD, jsonString);
                claims.put(EXP, System.currentTimeMillis() + maxAge);
                return signer.sign(claims);
            } catch (Exception e) {
                return null;
            }
        }
    
        /**
         * @Todo Decrypt, passing in an encrypted token string and decrypted type
         * @author Stephen
         * @Time 2019-10-11 12:13:08
         * @param jwt,classT
         * @return T
         */
        public static <T> T unsign(String jwt, Class<T> classT) {
            final JWTVerifier verifier = new JWTVerifier(SECRET);
            try {
                final Map<String, Object> claims = verifier.verify(jwt);
                if (claims.containsKey(EXP) && claims.containsKey(PAYLOAD)) {
                    long exp = (Long) claims.get(EXP);
                    long currentTimeMillis = System.currentTimeMillis();
                    if (exp > currentTimeMillis) {
                        String json = (String) claims.get(PAYLOAD);
                        ObjectMapper objectMapper = new ObjectMapper();
                        return objectMapper.readValue(json, classT);
                    }
                }
                return null;
            } catch (Exception e) {
                return null;
            }
        }
    
    }

    如有疑问请留意

  • 相关阅读:
    热安装NGINX并支持多站点SSL
    centos 自启动
    gulp入门
    nodejs的包管理器npm和cnpm
    Chrome扩展及应用开发
    dubbo本地搭建实例
    web项目中获取spring的bean对象
    Windows下zookeeper注册中心的安装和启动
    dubbo-admin管理控制台的安装和使用
    启动zookeeper报错:JAVA_HOME is not set
  • 原文地址:https://www.cnblogs.com/dzcici/p/11670952.html
Copyright © 2011-2022 走看看