zoukankan      html  css  js  c++  java
  • 登陆权限--token 的生成和验证

     在前后端分离时,实现登陆权限控制。 在这使用token来处理,提前说明后端采用的是SSM框架 

    后端需要完成的操作如下:

    1、生成token的工具类TokenUtil(内含用户名+密码生成token值和token验证是否正确的两个方法):

    package com.lw.util;

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

    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;

    public class TokenUtil {
    private static final long EXPIRE_TIME = 15 * 60 * 1000; // 设置过期时间为15分钟
    private static final String TOKEN_SECRET = "JNVCOR&$@)_(#VSZ+_?CV}{XNVM^&"; // 设置签名私钥
    /**
    * 生成token,可以将你认为需要的数据当成参数存入
    */
    public static String sign(String userName,String password) {
    try {
    // 设置过期时间
    Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
    // 私钥和加密算法
    Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
    // 设置头部信息
    Map<String, Object> header = new HashMap<String, Object>(2);
    header.put("Type", "Jwt");
    header.put("alg", "HS256");
    // 返回token字符串
    return JWT.create()
    .withHeader(header)
    .withClaim("userName", userName)
    .withClaim("password",password)
    .sign(algorithm);
    } catch (Exception e) {
    e.printStackTrace();
    return null;
    }
    }
    /**
    * 检验token是否正确语句
    */
    public static boolean verify(String token){
    try {
    Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
    JWTVerifier verifier = JWT.require(algorithm).build();
    DecodedJWT jwt = verifier.verify(token);
    return true;
    } catch (Exception e){
    return false;
    }
    }

    /**
    * 获取token中的参数值
    * @param token
    * @return
    */
    public static String getUserName(String token){
    try{
    DecodedJWT jwt = JWT.decode(token);
    return jwt.getClaim("userName").asString();
    }catch (Exception e){
    return null;
    }

    }
    /**
    * 获取token中的参数值
    * @param token
    * @return
    */
    public static String getPassword(String token){
    try{
    DecodedJWT jwt = JWT.decode(token);
    return jwt.getClaim("password").asString();
    }catch (Exception e){
    return null;
    }

    }

    }

    2、导入工具类TokenInterceptor(获取前端token值进行校验是否相等)

    package com.lw.controller.interceptor;

    import com.alibaba.fastjson.JSONObject;
    import com.lw.util.Result;
    import com.lw.util.TokenUtil;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class TokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handle) throws Exception {

    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "*");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "*");
    response.setHeader("Content-Type", "application/json;charset=utf-8");
    String token = request.getHeader("token"); //获取在前端存储的token值。

    response.setCharacterEncoding("utf-8");
    //跨域ajax请求,都会先发一次method为OPTIONS的预请求
    //1、获取服务器支持的HTTP请求方法。
    //2、用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。
    if (request.getMethod().equals("OPTIONS")) {
    System.out.println("OPTIONS");
    response.setStatus(HttpServletResponse.SC_OK);
    return true;

    }
    else if (null != token) {
               //token不为空,验证是否token是否正确
    if ( TokenUtil.verify(token)) {
    return true;
    }
    }
    Result result = Result.err("用户过期,请重新登录");
    String json = JSONObject.toJSONString(result);
    response.getWriter().write(json);
    return false;
    }
    @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 {

    }
    }


    3、在Spring-mvc.xml文件中配置token拦截器:(起拦截作用,可设置实现未登录时不能访问该页面权限)
     <!--配置token校验拦截器-->
    <mvc:interceptors>
    <mvc:interceptor>
    <mvc:mapping path="/topic/comment"/>
    <mvc:mapping path="/topic/send"/>
    <mvc:mapping path="/topic/like"/>
    <mvc:mapping path="/topic/unlike"/>
    <mvc:mapping path="/topic/delete"/>
    <mvc:mapping path="/home/user/profile"/>
    <mvc:mapping path="/home/user/editSubmit"/>
    <bean class="com.lw.controller.interceptor.TokenInterceptor" />
    </mvc:interceptor>
    </mvc:interceptors>
  • 相关阅读:
    剑指offer——最小的K个数和数组中第K大的元素
    Leetcode刷题指南链接整理
    160. Intersection of Two Linked Lists
    100. Same Tree
    92. Reverse Linked List II
    94. Binary Tree Inorder Traversal
    79. Word Search
    78,90,Subsets,46,47,Permutations,39,40 DFS 大合集
    0x16 Tire之最大的异或对
    0x16 Tire
  • 原文地址:https://www.cnblogs.com/zxl971213/p/12979994.html
Copyright © 2011-2022 走看看