token令牌

防止重复刷新提交:token令牌.


创建一个单例模式,防止两人同时提交,使用synchronzied关键字使线程安全.使用通用识别码随机生成一个uuid

package com.dt64.util;

import java.util.UUID;

public class Stoken {
    static Stoken  st=null;
    private Stoken(){}
    public synchronized static Stoken getInstance(){
        if(st==null){
            st=new Stoken();
        }
        return st;
        
    }
    public static String getTokenStr(){
        return    UUID.randomUUID().toString();
    }
}

Initservlet加载获取令牌,调用token实例中的静态获取uuid方法

使用session存储令牌属性,然后由addShoppingservlet得到服务器中的令牌。判断服务器中的令牌是否为空

得到参数。令牌匹配成功的话,就表名登录过,然后消除令牌


request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html");    
        BizServiceImpl  bs=new BizServiceImpl();
        BizDaoImpl   bdi=new BizDaoImpl();
        bs.setBizDao(bdi);
        PrintWriter out=response.getWriter();
        //判断是否登录?
        HttpSession session=request.getSession(false);
        Object  obj=session.getAttribute("uname");
        Object obj_token=session.getAttribute("str_token");//服务器
        //out.print("alert("+obj_token+");");
        if(obj_token!=null){
            String client_token=request.getParameter("client_token");
            String server_token=(String)obj_token;
            if(client_token.equals(server_token)){
                //令牌匹配成功
                if(obj!=null){
                    //登录过
                    String id=request.getParameter("id");
                    Integer k_id=Integer.parseInt(id);
                    Shopping  sp=bs.getShoppingById(k_id);
                    //逻辑    如果窗口相同,数量自增,如果不同的商品,累加一条记录
                    //1.如果在map集合中有相同key的时候,num++  2.没有的话,num=1
                    if(map.containsKey(k_id)){
                        //存在的话,数量自增
                        sp.setSpnum(map.get(k_id).getSpnum()+1);
                        map.put(k_id, sp);
                    }else{
                        //不存在
                        sp.setSpnum(1);
                        map.put(k_id, sp);
                    }
                    
                    
            //request.setAttribute("sp", sp);
            request.setAttribute("map", map);
            //跳转 登录过
            request.getRequestDispatcher("show.jsp").forward(request, response);
        }else{   
            out.write("<script>");
            out.write("alert('尚未登录,请先登录!');");
            out.write("location.href='init';");
            out.write("</script>");
            }
            //消除session令牌
            session.removeAttribute("str_token");
            }
            
        }else{ //session中没有令牌的情况
            out.print("<script>");
            out.print("alert('不能重复刷新');");
            out.print("location.href='init';");
            out.print("</script>");
            
        }

虽然可以防止重复刷新,但是又出现了一个新的问题:点击浏览器中的"后退按钮"时候,也可以进入到initservlet里面去,造成了一个浏览器缓存问题

解决方法:不读取页面缓存即可。

在对应的jsp页面添加

<%// 不读取缓存

      response.setHeader("Cache-Control","no-store"); //缓存控制器

      response.setHeader("Pragrma","no-cache"); //无缓存

      response.setDateHeader("Expires",0);

      %>



猜你喜欢

转载自blog.csdn.net/brid_fly/article/details/81050804