精华内容
下载资源
问答
  • 登录成功后,使用用户id构造生成一个token并保存到redis中,同时也保存用户id到session中生成token的代码如下:@Overridepublic String createToken(String phone,String appId) throwsException {long loginTime =...

    登录成功后,使用用户id构造生成一个token并保存到redis中,同时也保存用户id到session中

    生成token的代码如下:

    @Overridepublic String createToken(String phone,String appId) throwsException {long loginTime =DateUtil.getNowTimeStampTime().getTime();

    String str= String.valueOf(phone) + CommonConstant.COMMA_CHARACTER+appId+ CommonConstant.COMMA_CHARACTER+String.valueOf(loginTime);byte[] cipherData = null;

    String result= null;

    cipherData= RSAEncrypt.encrypt(Rsa2Manager.getPublicKeyGmall(), str.getBytes("UTF-8"));//RSA加密

    result=Base64.encode(cipherData);//加密returnresult;

    }

    checkToken,获取当前session,有效则已登录,无效则获取当前的token,解密token,再去查询redis中的token是否有效,有效则再次对session赋值,还原登录状态

    @Override

    public boolean isLogin(HttpSession session) throws Exception {

    boolean islogin = false;

    String appId = (String) session.getAttribute(UserConstant.LOGIN_APP_ID);

    String userId = (String) session.getAttribute(UserConstant.USER_SESSION_KEY);

    if (StringUtils.isNotBlank(appId) && StringUtils.isNotBlank(userId)) {

    islogin = true;

    } else {

    String phone ="";

    String appid ="";

    HttpServletRequest request = getCurrentThreadRequest();

    String currentToken = request.getHeader(CommonConstant.REQUEST_HEADER_TOKEN_NAME);

    if(StringUtils.isNotBlank(currentToken)){

    byte[] res = null;

    res = RSAEncrypt.decrypt(Rsa2Manager.getPrivateKeyGmall(), Base64.decode(currentToken));

    String restr = new String(res);

    String[] str = restr.split(",");

    phone = str[0];

    appid = str[1];

    String redisKey = CommonConstant.LOGIN_TOKEN.concat(phone);

    String token = RedisUtil.getRedisString(redisKey);

    if (StringUtils.isNotBlank(token)) {

    request.getSession().setAttribute(UserConstant.USER_SESSION_KEY, phone);

    request.getSession().setAttribute(UserConstant.LOGIN_APP_ID, appid);

    islogin = true;

    }else{

    islogin = false;

    }

    }

    }

    return islogin;

    }

    展开全文
  • 登录成功后,使用用户id构造生成一个token并保存到redis中,同时也保存用户id到session中 生成token的代码如下: @Override public String createToken(String phone,String appId) throws Exception { ...

    登录成功后,使用用户id构造生成一个token并保存到redis中,同时也保存用户id到session中

    生成token的代码如下:

        @Override
        public String createToken(String phone,String appId) throws Exception {
            long loginTime = DateUtil.getNowTimeStampTime().getTime();
            String str = String.valueOf(phone) + CommonConstant.COMMA_CHARACTER+appId+ CommonConstant.COMMA_CHARACTER+ String.valueOf(loginTime);
            byte[] cipherData = null;
            String result = null;
            cipherData = RSAEncrypt.encrypt(Rsa2Manager.getPublicKeyGmall(), str.getBytes("UTF-8"));//RSA加密
            result = Base64.encode(cipherData);//加密
            return result;
        }

    checkToken,获取当前session,有效则已登录,无效则获取当前的token,解密token,再去查询redis中的token是否有效,有效则再次对session赋值,还原登录状态

    @Override
    	public boolean isLogin(HttpSession session) throws Exception {
    		boolean islogin = false;
    		String appId = (String) session.getAttribute(UserConstant.LOGIN_APP_ID);
    		String userId = (String) session.getAttribute(UserConstant.USER_SESSION_KEY);
    		if (StringUtils.isNotBlank(appId) && StringUtils.isNotBlank(userId)) {
    			islogin = true;
    		} else {
    			String phone ="";
    			String appid ="";
    			HttpServletRequest request = getCurrentThreadRequest();
    			String currentToken = request.getHeader(CommonConstant.REQUEST_HEADER_TOKEN_NAME);
    			if(StringUtils.isNotBlank(currentToken)){
    				byte[] res = null;
    				res = RSAEncrypt.decrypt(Rsa2Manager.getPrivateKeyGmall(), Base64.decode(currentToken));
    				String restr = new String(res);
    				String[] str = restr.split(",");
    				phone = str[0];
    				appid = str[1];
    				String redisKey = CommonConstant.LOGIN_TOKEN.concat(phone);
    				String token = RedisUtil.getRedisString(redisKey);
    				if (StringUtils.isNotBlank(token)) {
    					request.getSession().setAttribute(UserConstant.USER_SESSION_KEY, phone);
    					request.getSession().setAttribute(UserConstant.LOGIN_APP_ID, appid);
    					islogin = true;
    				}else{
    					islogin = false;
    				}
    			}
    		}
    		return islogin;
    	}
    

      

    转载于:https://www.cnblogs.com/ouyanxia/p/7490613.html

    展开全文
  • 登录成功后,使用用户id构造生成一个token并保存到redis中,同时也保存用户id到session中生成token的代码如下:@Overridepublic String createToken(String phone,String appId) throwsException {long loginTime =...

    登录成功后,使用用户id构造生成一个token并保存到redis中,同时也保存用户id到session中

    生成token的代码如下:

    @Overridepublic String createToken(String phone,String appId) throwsException {long loginTime =DateUtil.getNowTimeStampTime().getTime();

    String str= String.valueOf(phone) + CommonConstant.COMMA_CHARACTER+appId+ CommonConstant.COMMA_CHARACTER+String.valueOf(loginTime);byte[] cipherData = null;

    String result= null;

    cipherData= RSAEncrypt.encrypt(Rsa2Manager.getPublicKeyGmall(), str.getBytes("UTF-8"));//RSA加密

    result=Base64.encode(cipherData);//加密returnresult;

    }

    checkToken,获取当前session,有效则已登录,无效则获取当前的token,解密token,再去查询redis中的token是否有效,有效则再次对session赋值,还原登录状态

    @Override

    public boolean isLogin(HttpSession session) throws Exception {

    boolean islogin = false;

    String appId = (String) session.getAttribute(UserConstant.LOGIN_APP_ID);

    String userId = (String) session.getAttribute(UserConstant.USER_SESSION_KEY);

    if (StringUtils.isNotBlank(appId) && StringUtils.isNotBlank(userId)) {

    islogin = true;

    } else {

    String phone ="";

    String appid ="";

    HttpServletRequest request = getCurrentThreadRequest();

    String currentToken = request.getHeader(CommonConstant.REQUEST_HEADER_TOKEN_NAME);

    if(StringUtils.isNotBlank(currentToken)){

    byte[] res = null;

    res = RSAEncrypt.decrypt(Rsa2Manager.getPrivateKeyGmall(), Base64.decode(currentToken));

    String restr = new String(res);

    String[] str = restr.split(",");

    phone = str[0];

    appid = str[1];

    String redisKey = CommonConstant.LOGIN_TOKEN.concat(phone);

    String token = RedisUtil.getRedisString(redisKey);

    if (StringUtils.isNotBlank(token)) {

    request.getSession().setAttribute(UserConstant.USER_SESSION_KEY, phone);

    request.getSession().setAttribute(UserConstant.LOGIN_APP_ID, appid);

    islogin = true;

    }else{

    islogin = false;

    }

    }

    }

    return islogin;

    }

    展开全文
  • 配置过滤器  spring-mvc.mxl <mvc:interceptors> <!--判断是否是登录转台--> <bean class=".../&...--防止表单重复提交--> <mvc:in...
    1. 配置过滤器

     spring-mvc.mxl

      <mvc:interceptors>
            <!--判断是否是登录转台-->
            <bean class="com.xjkcsj.core.aspect.LoginInterceptor"/>
            <!--防止表单重复提交-->
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <bean class="com.xjkcsj.core.aspect.TokenInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>

    2.写注解类

    /**
     * 自定义Token注解
     * 
     * @author weixiaodong
     * 
     */
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Token {
    
    	boolean save() default false;
    
    	boolean remove() default false;
    
    }

    3.写拦截器,反射读注解,判断是否提交过

    
    /**
     * Token 拦截器,用于防止表单重复提交<br>
     * 
     * 需要再spring配置文件中配置拦截器
     * 
     * @author weixiaodong
     * 
     */
    public class TokenInterceptor extends HandlerInterceptorAdapter {
    
    	@Override
    	public boolean preHandle(HttpServletRequest request,
    			HttpServletResponse response, Object handler) throws Exception {
    		if (handler instanceof HandlerMethod) {
    			HandlerMethod handlerMethod = (HandlerMethod) handler;
    			Method method = handlerMethod.getMethod();
    			Token annotation = method.getAnnotation(Token.class);
    			if (annotation != null) {
    				boolean needSaveSession = annotation.save();
    				if (needSaveSession) {
    					request.getSession(true).setAttribute("token",
    							UUID.randomUUID().toString());
    				}
    				boolean needRemoveSession = annotation.remove();
    				if (needRemoveSession) {
    					if (isRepeatSubmit(request)) {
    						response.sendRedirect(request.getContextPath()
    								+ "/error_401");
    						return false;
    					}
    					request.getSession(true).removeAttribute("token");
    				}
    			}
    			return true;
    		} else {
    			return super.preHandle(request, response, handler);
    		}
    	}
    
    	private boolean isRepeatSubmit(HttpServletRequest request) {
    		String serverToken = (String) request.getSession(true).getAttribute(
    				"token");
    		if (serverToken == null) {
    			return true;
    		}
    		String clinetToken = request.getParameter("token");
    		if (clinetToken == null) {
    			return true;
    		}
    		if (!serverToken.equals(clinetToken)) {
    			return true;
    		}
    		return false;
    	}
    }

    4.form中加隐藏的input

    <input type="hidden" name="token" value="${token}"/>

    到此为止自定义的token注解就配置完了,接下来就是注解加在哪里,下面的俩个方法,一个加@Token(save=true),这个方法是你跳到要提交的表单页面的方法,另一个加@Token(remove=true),这个方法是提交表单的方法

      /**
         * 跳转到会员确认页面
         *
         * @return
         */
        @Token(save = true)
        @RequestMapping(value = "/save", method = RequestMethod.POST)
        public ModelAndView saveApply(HttpServletRequest request,Memberapply memberapply, MemberApplyChildArry memberApplyChildArry) {
            ModelAndView mav = new ModelAndView("website/apply/applyInfo");
            Map<String,String> pathMap = FileUpload.tranferFile(request,"member");
            if(pathMap != null && pathMap.containsKey("file")){
                memberapply.setHyd80704dwlog67(pathMap.get("file"));
            }
    
            if(pathMap != null && pathMap.containsKey("file1")){
                memberapply.setHyd80704tydmz71(pathMap.get("file1"));
            }
            Memberapplychild[] memberapplychilds =memberApplyChildArry.getMemberapplychilds();
            if(memberapplychilds != null){
                mav.addObject("memberapplychild",memberapplychilds);
            }
            mav.addObject("memberapply",memberapply);
            mav.addObject("step", 2);
            return mav;
        }
        /**
         * 提交会员申请
         *
         * @param memberapply
         * @param
         * @return
         */
        @Token(remove = true)
        @RequestMapping(value = "/submit", method = RequestMethod.POST)
        public ModelAndView memberApply(Memberapply memberapply, MemberApplyChildArry memberApplyChildArry) {
    
            ModelAndView mav = new ModelAndView("website/apply/finish");
            String mPk = TableHelper.getNextID("hydjbQ18070400008");
            memberapply.setRecorderno(mPk);
            Timestamp timestamp = new Timestamp(System.currentTimeMillis());
            memberapply.setRecordtime(timestamp);
            memberapply.setCurstatus(2);
            String company = memberapply.getHyd80704dwmc066();//单位名称
            memberapplyService.insertSelective(memberapply);
            Memberapplychild[] memberapplychilds = memberApplyChildArry.getMemberapplychilds();
            //写入字表资质等级及范围
            if(memberapplychilds != null && memberapplychilds.length!=0) {
                for (Memberapplychild memberApplyChild : memberapplychilds) {
                    memberApplyChild.setRecorderno(TableHelper.getNextID("zzdjjQ18080100001"));
                    memberApplyChild.setCurstatus(2);
                    memberApplyChild.setLinkrecordid(mPk);
                    memberApplyChild.setRecordtime(timestamp);
                    memberapplychildService.insertSelective(memberApplyChild);
                }
            }
            String actorID = actorDefineService.findByActorName("会员管理岗");
            List<String> list = actorAssignService.selectByActorID(actorID);
            String pk = TableHelper.getNextID("TaskSender");
            String spk = pk;//同组编号
            for (String accepter : list) {
                TaskSender taskSender = new TaskSender();
                taskSender.setWorkorderno(pk);
                taskSender.setSameorderno(spk);
                taskSender.setAccepter(accepter);
                taskSender.setReflinkurl("/ProjManager/page/memberapply?taskActionType=info&curRecorderNO=" + mPk + "&isOpen=true&smid=" + spk);
                taskSender.setMsgstatus(2);
                taskSender.setTasktitle("【" + company + "】发起的入会申请流程");
                taskSender.setTaskmsgtype("网站任务");
                taskSender.setTaskcardkey("WEBTask");
                taskSender.setTaskcardval("入会申请");
                taskSender.setRecordtime(timestamp);
                taskSender.setCurstatus(2);
                taskSenderService.insertSelective(taskSender);
                pk = TableHelper.getNextID("TaskSender");
            }
            return mav;
        }

     

    展开全文
  • 最近在项目上遇到了一个同一账号多终端(或者说多用户)同时登录导致的token重复问题。可以在浏览器相应地做一些防止表单重复提交的操作,比如登录按钮点击一次后变成不可点击的状态,等待服务器的响应之后再恢复成...
  • DRF + jwt + mysql 防止用户重复登录

    千次阅读 2019-11-18 23:06:18
    DRF + jwt + mysql 防止用户重复登录实现目标说明创建自定义用户模块安装配置djangorestframework-jwt模块编写 检查重复登录 的方法编写用户 注册 登录 和 修改密码 的方法通过postman测试用户的 合法性 和 唯一性 ...
  • 1.新建存放用户登录口令token的表,并生成modelCREATE TABLE IF NOT EXISTS `tbl_admin_session` ( `session_id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL, `session_token` varchar(56) NOT ...
  • vue 项目实现请辞请求之前携带参数(token) import axios from './network/baseRequest' //这里给每次请求封装 Vue.prototype.axios = axios // // 发送请求 axios.interceptors.request.use( config => { ...
  • 1)防止表单重复提交、 2)anti csrf攻击(跨站点请求伪造)。 两者在原理上都是通过session token来实现的。当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放置到session当中...
  • 一、登录 客户端填写账密信息发起请求,后台生成RSA密钥,保存私钥,返回公钥 (此公钥不安全,没有验证就可以获取,报文不能用其加密) 客户端对账密使用RSA公钥进行加密,再传输到后台(防止账密被解密获取) ...
  • 在代码层面,对接口进行安全设计一、使用token进行用户身份认证二、使用sign防止传入参数被篡改三、用时间戳防止暴力请求 一、使用token进行用户身份认证 用户身份认证的流程图如下: 具体说明如下: 1、用户登录时...
  • 学习webwork有段时间,今晚做个登录注册登录功能,用到webwork中的token防止表单的重复提交。首先配置: 1、register.jsp中加入&lt;token/&gt; 例如: &lt;ww:form action="register.action&...
  • Struts2防止表单重复提交登录,可以使用两种拦截器 原理: 首先在提交表单中须加上&lt;s:token&gt;&lt;/s:token&gt;一个令牌。这个是服务器给你的一个令牌。实际上他是服务器产生的session ID,把这...
  • token的使用

    2020-07-15 10:21:03
    1.防止表单重复提交 2.身份验证 三.token身份验证的使用-----前端 大概流程: 1.客户端使用用户名跟密码请求登录 2.服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给...
  • 学习webwork有段时间,今晚做个登录注册登录功能,用到webwork中的token防止表单的重复提交。首先配置: 1、register.jsp中加入 例如: 2、xwork.xml加入: /repeaterror.jsp PS:当你注册一个
  • 防止重复提交 2.防止CSRF(跨站请求伪造)攻击Token是服务器生成的一串字符串,以作客户端进行请求的一个令牌。当第一次登录后,服务器生成一个Token并返回给客户端,以后客户端只需带上这个Token前来请求数据即可,...
  • 每周积累|token令牌

    2019-09-26 19:57:32
    Token,就是令牌,最大的特点就是随机性,Token是服务端生成的一串字符串,当第一次登录后,服务器生成一个Token便将此Token返回给客户端, 以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和...
  • struts中拦截器防止表单重复提交

    千次阅读 2012-10-20 22:35:53
    由于某些原因,用户在进行类似表单...登录页面中的关键技术就是使用了标签库中的标签,它的作用就是在用户访问此页面时会生成一个sessionId,在提交时会服务器会据此验证表单是否已提交,提交到的Action便能配置Token
  • 防止重复提交 2.防止CSRF(跨站请求伪造)攻击 Token是服务器生成的一串字符串,以作客户端进行请求的一个令牌。 当第一次登录后,服务器生成一个Token并返回给客户端,以后客户端只需带上这个Token前来请求数据...
  • 1.在登录表单的jsp的页面的表单中添加 2.在struts.xml文件中的配置其过滤器文件代码如下在package包下面 <interceptor-stack name="MyInterceptor"> <interceptor-ref name="token"/>
  • 固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库 token在客户端一般存放于localStorage,cookie,或sessionStorage中。在服务器一般存于数据库中 token 的认证流程 用户登录,成功后服务器...
  • Springboot学习笔记——若依框架中用户认证机制下的后端接口测试token用户认证机制request和session的区别token主要有两个作用防止表单重复提交使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。...
  • 解决刷新重复提交的方法有很多种,如:ajax,token. 这里我用的是redirect来防止页面刷新重复提交. 适用场景:登录页面点击登录后跳转登录成功页面,等待session过期后刷新页面,重新回到登录页面. //登录方法旧 @...
  • 判断登录用户是否合法(虽然你是你,但是你还需要门票(token)才能进入) 请求的唯一性(防止恶意重复提交–爬虫、网络攻击等) 二:工作流程 不加校验: 获取一个列表:...
  • 这是本工程所有包与类。 1.创建好登录、注册页面。 <%@ page language="java" import="java.util.*" ...%@ taglib uri="http://www.chinasofti.com/token" prefix="csi" %> <% String pat...
  • 对于前后端分离的项目,后端人员通常都要对发起请求的用户的合法性和权限进行审核(比如用户每次请求...笔者作为某小公司中的唯一后端开发,在数据安全这块也是操碎了心的,先是重构了登录注册接口,防止用户账号密...
  • 1,在app登录成功后,服务端生成一个长达200的字符序列(不重复,当然也可以是500,1000)存入数据库,同时返回给app。 2,app拿到序列后,每次访问接口,在header里用该序列中的一个加上用户id(...

空空如也

空空如也

1 2 3
收藏数 54
精华内容 21
关键字:

token防止重复登录