精华内容
下载资源
问答
  • //获取当前登录用户的用户名AppSecurityUtils.obtainLoginedUsername()//获取当前用户tokenAppSecurityUtils.obtainAccessToken()AppSecurityUtils.javaimport org.apache.shiro.subject.Subject;/*** @author ...

    //获取当前登录用户的用户名

    AppSecurityUtils.obtainLoginedUsername()

    //获取当前用户token

    AppSecurityUtils.obtainAccessToken()

    AppSecurityUtils.java

    import org.apache.shiro.subject.Subject;

    /**

    * @author yangty

    *

    */

    public class AppSecurityUtils {

    /**

    * 获取当前登录用户的用户名

    * @return

    */

    public static String obtainLoginedUsername() {

    Subject currentUser = org.apache.shiro.SecurityUtils.getSubject();

    if(currentUser == null || currentUser.getPrincipal() == null) {

    return "";

    }

    AppShiroUser shiroUser = (AppShiroUser)currentUser.getPrincipal();

    return shiroUser.getId();

    }

    /**

    * 获取当前用户token

    *

    * @return

    */

    public static String obtainAccessToken() {

    Subject currentUser = org.apache.shiro.SecurityUtils.getSubject();

    if(currentUser == null || currentUser.getPrincipal() == null) {

    return "";

    }

    AppShiroUser shiroUser = (AppShiroUser)currentUser.getPrincipal();

    return shiroUser.getAccessToken();

    }

    }

    AppShiroUser

    import java.io.Serializable;

    public class AppShiroUser implements Serializable{

    /**

    *

    */

    private static final long serialVersionUID = 8494048657048720145L;

    private String id;// 用户ID

    private String accessToken;// 用户oauth授权accessToken

    private String ipAddress;//用户登录的机器IP

    public AppShiroUser(String id, String accessToken) {

    super();

    this.id = id;

    this.accessToken = accessToken;

    }

    public String getId() {

    return id;

    }

    public String getAccessToken() {

    return accessToken;

    }

    public void setAccessToken(String accessToken) {

    this.accessToken = accessToken;

    }

    /**

    * @return the ipAddress

    */

    public String getIpAddress() {

    return ipAddress;

    }

    /**

    * @param ipAddress the ipAddress to set

    */

    public void setIpAddress(String ipAddress) {

    this.ipAddress = ipAddress;

    }

    /**

    * 本函数输出将作为默认的输出.

    */

    @Override

    public String toString() {

    return id;

    }

    }

    展开全文
  • 2、token 做用户登录认证● 流程3、 Java 实现● 用户登录生成 token,保存到 Redis 中最简单的 token 可由 uid (用户唯一的身份标识)、sign (签名)、time (当前时间的时间戳) 加密组成。● 客户端把 token 信息存储...
    c0df38f3019e19fc93e507b163eecb3b.png

    1、什么是 token???

    Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌。

    2、token 做用户登录认证

    ● 流程

    5547866abbd0f38fb7d2deb15341d130.png

    3、 Java 实现

    ● 用户登录生成 token,保存到 Redis 中

    最简单的 token 可由 uid (用户唯一的身份标识)、sign (签名)、time (当前时间的时间戳) 加密组成。

    dfad7fc2cf0af67f8bfd00d8755c5fc5.png

    ● 客户端把 token 信息存储到 cookie 中,发起购买请求

    4d125e275523b6d012603544b5c080bc.png

    ① 使用注解 Auth

    c0cce8b474e8a6bacdb4ead57c03ce7f.png

    Auth

    60ace659483cad29870dae24ce41be76.png

    AuthAspect

    b54ab8b7f3e2d8606363e0ec80c559e8.png

    ② 使用 ThreadLocal 保存用户信息

    6822ad247e47660d4919864d01e5630c.png

    除了使用 ThreadLocal,我们还可以使用 SpringBoot 自定义参数解析器。

    d494b49e01c0251d41ba7c5f79a1a817.png

    CurrentUser

    a6c3968a2e213da58a718c617191091f.png

    CurrentUserMethodArgumentResolver

    730bd8e9b9a3e8f2593e681b5bb884fa.png

    WebMvcConfig

    ③ 全局异常捕获

    使用 ControllerAdvice

    1dd5282ba5a697e837b11075cbc0ecb5.png

    ● 客户端发起购买请求

    941063ceae35ec3502da6d7e0ccf94ae.png

    使用 CurrentUser 注解获取用户信息

    be25a55e797fd30df72e53d2a07dc7ae.png

    欢迎关注 @Python大星 ,一个会点 Python 的 Java 程序员。如果你有更好的想法,欢迎留言,一起探讨,想说你就说啊!

    @Python大星 | 文

    展开全文
  • shiro 获取当前用户token

    千次阅读 2019-09-16 02:56:16
    //获取当前登录用户的用户名 AppSecurityUtils.obtainLoginedUsername() //获取当前用户token AppSecurityUtils.obtainAccessToken() AppSecurityUtils.java import org....

    //获取当前登录用户的用户名

    AppSecurityUtils.obtainLoginedUsername()

    //获取当前用户token

    AppSecurityUtils.obtainAccessToken()

    AppSecurityUtils.java

    
    
    import org.apache.shiro.subject.Subject;
    
    
    /**
     * @author yangty
     *
     */
    public class AppSecurityUtils {
    	
    	/**
    	 * 获取当前登录用户的用户名
    	 * @return
    	 */
    	public static String obtainLoginedUsername() {
    		Subject currentUser = org.apache.shiro.SecurityUtils.getSubject();
    		if(currentUser == null || currentUser.getPrincipal() == null) {
    			return "";
    		}
    		AppShiroUser shiroUser = (AppShiroUser)currentUser.getPrincipal();
    		return shiroUser.getId();
    	}
    	
    	/**
    	 * 获取当前用户token
    	 * 
    	 * @return
    	 */
    	public static String obtainAccessToken() {
    		Subject currentUser = org.apache.shiro.SecurityUtils.getSubject();
    		if(currentUser == null || currentUser.getPrincipal() == null) {
    			return "";
    		}
    		
    		AppShiroUser shiroUser = (AppShiroUser)currentUser.getPrincipal();
    		
    		return shiroUser.getAccessToken();
    	}
    }
    

    AppShiroUser 

    
    
    import java.io.Serializable;
    
    public class AppShiroUser implements Serializable{
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 8494048657048720145L;
    
    	private String id;	// 用户ID
    	
    	private String accessToken;	// 用户oauth授权accessToken
    	
    	private String ipAddress;//用户登录的机器IP
    
    	public AppShiroUser(String id, String accessToken) {
    		super();
    		this.id = id;
    		this.accessToken = accessToken;
    	}
    
    	public String getId() {
    		return id;
    	}
    
    	public String getAccessToken() {
    		return accessToken;
    	}
    
    	public void setAccessToken(String accessToken) {
    		this.accessToken = accessToken;
    	}
    	
    	/**
    	 * @return the ipAddress
    	 */
    	public String getIpAddress() {
    		return ipAddress;
    	}
    
    	/**
    	 * @param ipAddress the ipAddress to set
    	 */
    	public void setIpAddress(String ipAddress) {
    		this.ipAddress = ipAddress;
    	}
    	
    	/**
    	 * 本函数输出将作为默认的<shiro:principal/>输出.
    	 */
    	@Override
    	public String toString() {
    		return id;
    	}
    }
    

     

    转载于:https://my.oschina.net/yangty2017/blog/917131

    展开全文
  • 保证接口幂等性,表单重复提交 前台解决方案:提交后按钮禁用、置灰、页面出现遮罩后台...3.接口提交的时候获取对应的令牌,如果能够从redis中获得该令牌(获取后将当前令牌删除),则继续执行访问的业务逻辑 4...

     

    • 保证接口幂等性,表单重复提交

    前台解决方案:
    提交后按钮禁用、置灰、页面出现遮罩


    后台解决方案:   使用token,每个token只能使用一次
    1.在调用接口之前生成对应的Token,存放至redis


    2.在调用接口时,将生成的令牌放入请求request


    3.接口提交的时候获取对应的令牌,如果能够从redis中获得该令牌(获取后将当前令牌删除),
    则继续执行访问的业务逻辑


    4.接口提交的时候获取对应的令牌,如果获取不到改令牌,则直接返回请勿提交

     

    工程源码:https://github.com/youxiu326/sb_more_submit

     

    自定义注解

    ApiToken注解用于将token保存至request,用于页面取token

    ApiRepeatSubmit注解用于标明改方法需要验证token才能提交

    package com.huarui.util;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * 生成token注解
     */
    @Target(value = ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ApiToken {
    }
    ApiToken.java
    package com.huarui.util;
    
    import com.huarui.common.ConstantUtils;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * @功能描述 防止重复提交标记注解
     */
    @Target(ElementType.METHOD) // 作用到方法上
    @Retention(RetentionPolicy.RUNTIME)// 运行时有效
    public @interface ApiRepeatSubmit {
        ConstantUtils value();
    } 
    ApiRepeatSubmit.java
    package com.huarui.common;
    
    /**
     * 【定义从哪里取Token的枚举类】
     * head 即从请求头中取token,即客户端将token放入请求头来请求后端数据
     * body 即直接从请求体中取token
     */
    public enum ConstantUtils {
        BOOD,HEAD
    } 
    ConstantUtils.java

     

    spring.thymeleaf.cache=false
    
    spring.redis.host=youxiu326.xin
    spring.redis.port=6379
    application.properties
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.19.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.huarui</groupId>
        <artifactId>sb_more_submit</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>sb_more_submit</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
            <thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
        </properties>
    
        <dependencies>
    
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.8.1</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    pom.xml

     

     

    切面拦截,

    package com.huarui.util;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Component;
    import org.springframework.util.StringUtils;
    import java.util.UUID;
    import java.util.concurrent.TimeUnit;
    
    /**
     * redis工具类
     */
    @Component
    public class RedisTokenUtils {
    
        private long timeout = 2;//过期时间
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        /**
         * 获取Token 并将Token保存至redis
         * @return
         */
        public String getToken() {
            String token = "token_"+ UUID.randomUUID();
            redisTemplate.opsForValue().set(token,token,timeout, TimeUnit.MINUTES);
            return token;
        }
    
        /**
         * 判断Token是否存在 并且删除Token
         * @param tokenKey
         * @return
         */
        public boolean findToken(String tokenKey){
            String token = (String) redisTemplate.opsForValue().get(tokenKey);
            if (StringUtils.isEmpty(token)) {
                return false;
            }
            // token 获取成功后 删除对应tokenMapstoken
            redisTemplate.delete(tokenKey);
            return true;
        }
    
    
    } 
    RedisTokenUtils.java
    package com.huarui.aop;
    
    import javax.servlet.http.HttpServletRequest;
    import com.huarui.common.ConstantUtils;
    import com.huarui.util.ApiToken;
    import com.huarui.util.ApiRepeatSubmit;
    import com.huarui.util.RedisTokenUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.ValueOperations;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    import java.util.concurrent.TimeUnit;
    
    
    /**
     * @功能描述 aop解析注解
     */
    @Aspect
    @Component
    public class NoRepeatSubmitAop {
    
        private Log logger = LogFactory.getLog(getClass());
    
        @Autowired
        private RedisTokenUtils redisTokenUtils;
    
        /**
         * 将token放入请求
         * @param pjp
         * @param nrs
         */
        @Before("execution(* com.huarui.controller.*Controller.*(..)) && @annotation(nrs)")
        public void before(JoinPoint pjp, ApiToken nrs){
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            request.setAttribute("token", redisTokenUtils.getToken());
        }
    
    
        /**
         * 拦截带有重复请求的注解的方法
         * @param pjp
         * @param nrs
         * @return
         */
        @Around("execution(* com.huarui.controller.*Controller.*(..)) && @annotation(nrs)")
        public Object arround(ProceedingJoinPoint pjp, ApiRepeatSubmit nrs) {
    
            try {
                ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                HttpServletRequest request = attributes.getRequest();
    
                String token = null;
                if (nrs.value() == ConstantUtils.BOOD){
                    //从请求体中取Token
                    token = (String) request.getAttribute("token");
                }else if (nrs.value() == ConstantUtils.HEAD){
                    //从请求头中取Token
                    token = request.getHeader("token");
                }
                if (StringUtils.isEmpty(token)){
                    return "token 不存在";
                }
                if (!redisTokenUtils.findToken(token)){
                    return "请勿重复提交";
                }
                Object o = pjp.proceed();
                return o;
            } catch (Throwable e) {
                e.printStackTrace();
                logger.error("验证重复提交时出现未知异常!");
                return "{\"code\":-889,\"message\":\"验证重复提交时出现未知异常!\"}";
            }
    
        }
    
    }

     

    package com.huarui.controller;
    
    import com.huarui.common.ConstantUtils;
    import com.huarui.util.ApiRepeatSubmit;
    import com.huarui.util.ApiToken;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    @Controller
    public class TestController {
    
    
        /**
         * 进入页面
         * @return
         */
        @GetMapping("/")
        @ApiToken
        public String index(){
            return "index";
        }
    
    
        /**
         * 测试重复提交接口
         * 将Token放入请求头中
         * @return
         */
        @RequestMapping("/test")
        @ApiRepeatSubmit(ConstantUtils.HEAD)
        public @ResponseBody String test() {
            return ("程序逻辑返回");
        }
    
    } 

     

    前端页面:

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <base th:href="${#httpServletRequest.getContextPath()+'/'}">
        <meta charset="UTF-8">
        <title>测试表单重复功能</title>
    </head>
    <body>
    
    <td colspan="1"><button type="button" οnclick="add()">加购</button></td>
    
    </body>
    
    <script src="/jquery-1.11.3.min.js"></script>
    <script th:inline="javascript">
    
        function add(){
            //取得token参数
            var token = [[${token}]];
            console.log("获取到的token:" + token);
            $.ajax({
                type: 'POST',
                url: "/test",
                data: {},
                headers: {
                    "token":token,
                },
                // dataType: "json",
                success: function(response){
                    alert(response);
                },
                error:function(response){
                    alert(response);
                    console.log(response);
                }
            });
        }
    
    </script>
    
    </html>

     

     

    工程源码:https://github.com/youxiu326/sb_more_submit

     

    转载于:https://www.cnblogs.com/youxiu326/p/more_submit.html

    展开全文
  • // 获取当前会话是否已经登录, 返回true或false StpUtil.logout(); // 当前会话注销登录 StpUtil.logoutByLoginId(10001); // 让账号为10001的会话注销登录(踢人下线) StpUtil.hasRole("super-admin"); // 查询...
  • importjava.io.IOException;importjavax.servlet.FilterChain;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache...
  •  使用接口 : appId 是当前开发者的appId 不是用户的  path 是回调地址  这个链接是授权链接,当重定向这个链接的时候,会展示授权页,点击授权之后 跳入你path的请求接口 回调中带了一个参数code获取到就行 ...
  • 一、获取流程1、获取 access_token2、通过access_token换取 jsapi_ticket3、签名算法签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不...
  • 通过自定义 @CurrentUser 获取当前登录用户 1、定义 @CurrenUser注解 package com.presoft.wydl.common.config; import java.lang.annotation.Retention; import java.lang.annotation.Target; import java.lang...
  • 开发者ID,微信公众号的唯一标识AppSecret:开发者密码,操作微信公众号的验证IP白名单:获取access_token时,需要IP白名单才可以获取OpenID:微信用户在当前公众号的唯一标识UnionID:微信用户在当前开放平台账号的...
  • 01-14 (v3.1.1)使用RedisTokenStore不需要jdbc相关的包及配置增加支持统一身份认证(单点登录)功能对于排除拦截的接口也提供获取当前用户信息的方法2019-12-16 (v3.0.0)增加refresh_token机制增加@Ignore注解(用于...
  • 导入方法如下:import timepython的时间模块相当重要获取时间戳tiem.time():获取当前时间戳。时间戳是指从计算机元年到现在经过的秒数。计算机元年是指1970年1月1日0时0分0秒。另外在python中时间戳表示为秒数,在...
  • 模板概述基于 Antlr4 编译 hive 相关 xxx.g 文件生成对应的模板,如 hive 源码中:image.png编译完成生成对应 *.java 文件,Antlr4 详见:Antlr4解析流程Parserimage.png重点:获取SELECT操作中的表和列的相关操作。...
  • 本接口可以获取当前管理组指定类型的素材列表。请求说明Https请求方式: POST请求包结构体为{"type": "image","offset": 0,"count": 10}参数说明参数必须说明access_token是调用接口凭证type是素材类型,可以为图文...
  • * 1 第一步:用户同意授权,获取code * 2 第二步:通过code换取网页授权access_token * 3 第三步:刷新access_token(如果需要) * 4 第四步:拉取用户信息(需scope为 snsapi_userinfo) */ 第一部分:微信授权...
  • 1.通过自定义 @CurrentUser 获取当前登录用户 1、定义 @CurrenUser注解 package com.presoft.wydl.common.config; import java.lang.annotation.Retention; import java.lang.annotation.Target; import java....
  • 我正在编写Java库,需要执行对URL的请求-当前使用ning中的async-http-client-并获取其内容。所以我有一个get方法返回一个String所获取文档的内容。但是,要获得它,我必须执行HTTP基本身份验证,而我的Java代码中却...
  • 慕运维8079593什么RequestContextHolder, shiro啊这些, 你不看源码相信用起来不会安心的, 还是自己写靠谱且简洁, 原理就是使用ThreadLocal这个技术, 以前后端分离的项目(java只是接口, 不渲染界面)为例, 流程我简单...
  • 获取当前登录信息,是每个后端系统必不可少的功能,本文记载了使用ThreadLocal 获取当前登录信息,大致流程如下: ① 服务端接收到请求后,通过解析token 或者 cookies里面的用户信息,将用户信息存入ThreadLocal 中...
  • // 获取当前会话是否已经登录, 返回true或false StpUtil.logout(); // 当前会话注销登录 StpUtil.logoutByLoginId(10001); // 让账号为10001的会话注销登录(踢人下线) StpUtil.hasRole("super-admin"); // 查询...
  • // 获取当前会话是否已经登录, 返回true或false StpUtil.logout(); // 当前会话注销登录 StpUtil.logoutByLoginId(10001); // 让账号为10001的会话注销登录(踢人下线) StpUtil.hasRole("super-admin"); // 查询...
  • ,语言风趣,引人入胜,回顾一下文章内容,为了在Controller的方法中获取已经认证过的用户信息(比如通过JWT-JSON Web Token传输的Token),文中提供了三种方式:方式一(很挫)直接在Controller方法中获取Token头,然后...
  • 01-14 (v3.1.1)使用RedisTokenStore不需要jdbc相关的包及配置增加支持统一身份认证(单点登录)功能对于排除拦截的接口也提供获取当前用户信息的方法2019-12-16 (v3.0.0)增加refresh_token机制增加@Ignore注解(用于...
  • 01-14 (v3.1.1)使用RedisTokenStore不需要jdbc相关的包及配置增加支持统一身份认证(单点登录)功能对于排除拦截的接口也提供获取当前用户信息的方法2019-12-16 (v3.0.0)增加refresh_token机制增加@Ignore注解(用于...
  • 紧凑轻量2.token自身包含用户信息且无法篡改,在服务(网关)中可以自行解析校验出用户信息,对认证服务器(account-svc)压力小不足1.无法吊销令牌,只能等待令牌自身过期2.令牌长度与其包含用户信息多少正相关,传输...
  • WorkWeixinApiUtils.java

    2021-03-22 14:43:18
    连接企业微信接口,获取token ,获取当前用户信息
  • sa-token 之权限验证

    2021-03-31 14:00:31
    因为每个项目的需求不同,其权限设计也千变万化,【获取当前账号权限码集合】这一操作不可能内置到框架中, 所以sa-token将此操作以接口的方式暴露给你,以方便的你根据自己的业务逻辑进行重写 你需要做的就是新建一...
  • 从空对象中获取 / 修改值,如从数据库获取数据赋值给对象,再从当前对象中取值。 访问或修改空对象的字段 取Null的长度(如数组) 将Null抛出 规避空指针的出现: 在使用对象时,确保将其初始化 声名引用变量时,...
  • 调用环信api需要获取环信的token public class Token { private String access_token; //有效的token字符串 private String expires_in; //token 有效时间,以秒为单位,在有效期内不需要重复获取 private ...

空空如也

空空如也

1 2 3 4 5
收藏数 83
精华内容 33
关键字:

java获取当前token

java 订阅