如何在项目中用token进行权限验证

如何在项目中用token进行权限验证
原理: 当用户首次登录的时候,后台给用户生成一个token,并缓存到Map中,后续每次登录都会根据userId校验,移动端调用后台的每个服务都需要有token的验证通过才视作合法的。

1.首先自定义一个annotations,注解br/>@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ApiAuth {
String value() default "";
}

2.自定义一个拦截器
public class ApiAuthInterceptor extends HandlerInterceptorAdapter {

private static final int TOKEN_LONG = 32; //token的长度

@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
        throws Exception {
}

@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
        throws Exception {
}

// token验证
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    if (handler instanceof HandlerMethod) {
        ApiAuth authPassport = ((HandlerMethod) handler).getMethodAnnotation(ApiAuth.class);
        if (authPassport != null) {
            String paramToken = request.getParameter("token");
            if (paramToken == null) {
                fillUnauthorizedResponse(response);
                return false;
            }

            if (!isTokenValid(paramToken)) {
                fillTokenUnauthorizedResponse(response);
                return false;
            }

            return true;
        }
    }

    return true;
}

private boolean isTokenValid(String token) {
    // token为空,或者token位数不为32位
    if (StringUtils.isEmpty(token) || token.length() != TOKEN_LONG) {
        return false;
    }

    // 验证token是否存在
    return BaseDataMapCache.checkToken(token);
}

private void fillUnauthorizedResponse(HttpServletResponse response) throws IOException {
    response.setCharacterEncoding("UTF-8");
    response.setContentType("application/json;charset=UTF-8");
    PrintWriter out = response.getWriter();
    out.print(JSON.toJSONString(ResultObject.error("身份验证未通过!")));
    out.flush();
    out.close();
}

private void fillTokenUnauthorizedResponse(HttpServletResponse response) throws IOException {
    response.setCharacterEncoding("UTF-8");
    response.setContentType("application/json;charset=UTF-8");
    PrintWriter out = response.getWriter();
    out.print(JSON.toJSONString(ResultObject.error("token验证失败!")));
    out.flush();
    out.close();
}

}

public class BaseDataMapCache {

private static Map<String, String> dataMap = Maps.newHashMap();

public static void push(String key, String value) {
    dataMap.put(key, value);
}

public static String putToken(String userId) {
    if (!dataMap.containsKey(userId)) {
        String token = UUID.randomUUID().toString().replaceAll("-", "");
        dataMap.put(userId, token);
    }
    return dataMap.get(userId);
}

public static boolean checkToken(String token) {
    return !dataMap.isEmpty() && dataMap.containsValue(token);
}

}

3.配置spring-mvc.xml文件
<!-- APP的token验证 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.flower.mall.commons.interceptors.ApiAuthInterceptor" />
</mvc:interceptor>
</mvc:interceptors>

转载于:https://blog.51cto.com/9381188/2354265

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java项目中,可以使用Token进行身份验证。引用\[1\]中的TokenService类是一个示例,它使用了auth0.jwt库来生成Token。在该类中,getToken方法接收一个User对象作为参数,并根据用户的id和密码生成Token。生成的Token包含了用户的id以及Token的有效期。可以根据具体需求来设置Token的有效期。 另外,引用\[2\]中的TokenUtil类是一个工具类,用于获取请求中的Token以及解析Token中的用户id。该类中的getTokenUserId方法通过获取请求头中的token,并使用JWT库解析出其中的用户id。 在Java项目进行Token验证时,可以选择在拦截器中实现。引用\[3\]中提到了使用拦截器(HandlerInterceptor)对URL进行拦截,并进行Token验证。在拦截器中,可以判断请求的URL是否需要进行Token验证,然后使用TokenUtil类中的方法获取请求中的Token,并进行验证验证的方式可以包括成功验证、无效验证、超时验证、刷新处理以及主动失效处理,具体的实现可以根据项目的需求来进行。 总结起来,Java项目中的Token验证可以通过生成TokenTokenService类和解析TokenTokenUtil类来实现,同时可以使用拦截器对需要验证的URL进行拦截,并进行Token验证处理。 #### 引用[.reference_title] - *1* *2* [Java实现Token登录验证(基于JWT的token认证实现)](https://blog.csdn.net/shuux666/article/details/123442085)[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^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【JAVA】基于Token的用户验证](https://blog.csdn.net/swl979623074/article/details/81150184)[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^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值