cookie和session页面随机数和防止重复提交

http

无状态的协议,每次请求都是独立的我们不能存储第一次访问的数据

Cookie

实现访问请求的数据保存

将服务器中的一小段,存入浏览器中放在浏览器中的cookie中,是存入浏览器中。

优点:减少服务器的压力

缺点:不安全,存储的数据单一,只能为字符串,可以通过路由器获得所有的cookie

1. 添加cookie

2. 获得cookie

3. 解决中文乱码问题

4. 修改cookie的两种方式(cookie为键值对,key值不能重复,或者cookie.setvalues())

5. 生命周期

(1)默认为添加到浏览器和关闭浏览器

(2)设置setMaxAge(>0)

package cn.jiedada.controller;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("*.cookie")
public class CookieServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得uri
        String uri = req.getRequestURI();
        //输出类型
        resp.setContentType("text/html;charset=utf-8");
        //判断请求
        uri=uri.substring(uri.indexOf("/")+1, uri.indexOf("."));
        if(uri.equals("add")){
            doAdd(req,resp);
        }if(uri.equals("find")){
            doFind(req,resp);
        }
    }

    private void doFind(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        Cookie[] cookies = req.getCookies();
        //获得cookie
        for (Cookie cookie : cookies) {
            String name = cookie.getName();
            String value = cookie.getValue();
            //解码方式
            value=URLDecoder.decode(value, "UTF-8");
            resp.getWriter().print("<h1>"+name+"--"+value+"</h2>");
        }
    }

    private void doAdd(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //解决中文乱码问题
        Cookie c1 = new Cookie("name", URLEncoder.encode("杰帅", "UTF-8"));
        Cookie c2 = new Cookie("age", "20");
        //创建cookie并且发送到页面
        resp.addCookie(c1);
        resp.addCookie(c2);
        resp.getWriter().print("<h1>登陆成功</h1>");
    }
}

作用可以通过cookie来实现再次浏览该网页,然后登陆,判断里面的cookie值,如果有就直接登陆

Session

Session一次会话的,的创建方式

1通过servlet中的req.getSession()获得

2. 创建一个jsp

session的使用

Session.setAttribute()

Session.getAttribute()

Session.removeAttribute()

session的注销

Session.inv

package cn.jiedada.controller;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("*.session")
public class SessionServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String uri = req.getRequestURI();
        resp.setContentType("text/html;charset=utf-8");
        uri=uri.substring(uri.indexOf("/")+1, uri.indexOf("."));
        if(uri.equals("add")){
            doAdd(req,resp);
        }
    }
    private void doAdd(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        HttpSession session = req.getSession();
        session.setAttribute("name", "tom");
        //session.setMaxInactiveInterval(30);
        resp.sendRedirect("session.jsp");
    }
}

防止重复提交

把随机数生成的值绑定到前端,然后在Java代码中删除这次的绑定参数,这样就可以在第二次提交的时候随机数通不过

    //通过绑定之获得随机数中的随机值,判断是否和我们输入的相同
        String incode = req.getSession().getAttribute("RANDOMCODE_IN_SESSION").toString();
        //清除值,让他为null防止重复提交
        req.getSession().removeAttribute("RANDOMCODE_IN_SESSION");
        if(code.equals(incode)){

验证码

有多种方式这里使用的是uuid的方式,还有雪花函数,等等。。。。

package cn.jiedada.controller;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import java.util.UUID;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/randomCode")
public class RandomCode1Servlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //生成随机数
        String randomCode = UUID.randomUUID().toString().substring(0, 5);

        //把随机数放进Session中
        req.getSession().setAttribute("RANDOMCODE_IN_SESSION", randomCode);

        //创建图片对象
        int width = 100;
        int height = 30;
        int imageType = BufferedImage.TYPE_INT_RGB;
        BufferedImage image = new BufferedImage(width, height, imageType);

        //画板
        Graphics g = image.getGraphics();
        g.setColor(Color.WHITE);
        //绘制一个实心的矩形
        g.fillRect(1, 1, width - 2, height - 2);

        //把随机数画进图片中
        g.setColor(Color.BLUE);//设置随机数的颜色
        Font font = new Font("宋体", Font.BOLD + Font.ITALIC, 25);
        g.setFont(font);//设置随机数的字体和大小
        g.drawString(randomCode, 10, 23);
        //干扰线
        g.setColor(Color.GRAY);
        Random r = new Random();
        for (int i = 0; i < 100; i++) {
            g.fillRect(r.nextInt(width), r.nextInt(height), 2, 2);
        }

        //关闭
        g.dispose();
        //把图片对象以流的方式保存出去
        ImageIO.write(image, "jpg", resp.getOutputStream());
    }
}

原文地址:https://www.cnblogs.com/xiaoruirui/p/11437864.html

时间: 2024-10-07 18:39:55

cookie和session页面随机数和防止重复提交的相关文章

JavaWeb学习总结(十一):Session解决form表单重复提交

在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提交的常见应用场景 有如下的form.jsp页面 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML>

easyui的tab加载页面中的form重复提交

http://blog.csdn.net/fxz1982/article/details/8987769 Easyui中的tabs组件以href方式加载目标页面,如果目标页面中有dialog或者window这类的easyui组件中放了form.那么在关闭这个tab再次打开.如果进行form提交操作,后台就会收到两次提交请求,再次重复以上操作会收到3次提交请求,如果将表单serialize()后以jquery的post提交服务器将收到值全是数组方式组织的. 经分析发现,Easyui的tab加载页面

ASP.NET整理:Cookie,Application,Session,页面生命周期

一.设置Cookie的2种方式 1.    Repsonse.Cookie[“名”] = 值; 2.    HttpCookie hcCookie = new HttpCookie(“名”,值); hcCookie.Expires = Date.Now.AddDays(1);这里可以增加月 Response.Cookies.Add(hcCookie); 从Cookie中取值: string str = Response.Cookies[“名”].Value; 注意: 1.Cookie若没指定时间

JAVA–利用Filter和session防止页面重复提交

JAVA–利用Filter和session防止页面重复提交解决思路:1 用户访问表单页面,先经过过滤器,过滤器设置一个随机id作为token令牌, 并将该token放入表单隐藏域中.2 表单响应到浏览器,用户填充数据后提交请求;3 请求经过过滤器,过滤器获取表单中的令牌进行验证,如果和之前生成的令牌一致,则将请求放行,并且清空令牌;4 如果用户重复提交表单,请求经过过滤器,过滤器进行验证.因为第一次放行后令牌已经清空失效,令牌不一致,不放行.跳转到提醒界面. 需用知识:1 过滤器基础知识2 se

学习Java 采取令牌的方式避免重复提交

重复提交原因 从提交页面到成功页面的跳转一般采用视图定位,由于视图定位是在服务端跳转的,如果用户在点击提交之后再次刷新页面,会导致重复提交,数据库的数据会有重复. 采用令牌措施 1.在转账展示页面生成一个随机的令牌号码,然后放入session和传参中. @RequestMapping("/toTrans")// public String toTrans(ModelMap modelMap, HttpSession session ) {//! // //如果是转账,则先查询余额 St

防重复提交实现方案

在WEB系统操作中,往往会出现用户连续重复点击一个按钮导致重复提交,后台程序的同一个接口代码往往上一个请求还没执行完,下一个请求就到达了,而这两个请求又是请求和操作的同一条数据,就会出现业务上的逻辑错误,往往结果不可预料: 要解决重复提交带来的问题的解决方案有多种,不如网上有很多介绍怎么通过前端页面控制来解决重复提交,当然还有其他方式,这里我采用了通过后台程序代码利用redis做分布式锁的方式来防止重复提交,其思路就是在进入一个后端接口执行前先获取一个分布式锁,如果获取成功则上锁,然后执行业务代

前端页面——Cookie与Session有什么差别

我们在实际生活中总会遇到这种事情,我们一旦登录(首次输入username和password)某个站点之后,当我们再次訪问的时候(仅仅要不关闭浏览器),无需再次登录.而当我们在这个站点浏览一段时间后,它会产生我们浏览的记录,并且有的站点还提供购物车的功能.这些简单有用的功能就是通过Cookie与Session实现的.接下来.让我们一起探讨一下它们是怎样执行的. 1.概念 Cookie 有时也用其复数形式Cookies.指某些站点为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(

前端页面——Cookie与Session有什么区别

我们在实际生活中总会遇到这样的事情,我们一旦登录(首次输入用户名和密码)某个网站之后,当我们再次访问的时候(只要不关闭浏览器),无需再次登录.而当我们在这个网站浏览一段时间后,它会产生我们浏览的记录,而且有的网站还提供购物车的功能.这些简单实用的功能就是通过Cookie与Session实现的,接下来,让我们一起探讨一下它们是如何运行的. 1.概念 Cookie 有时也用其复数形式Cookies,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). Se

day09(--Cookie与Session)

一.会话 1.   一次对话,可能说了很多句: 2.   Web开发中的会话: l  打开浏览器,点击了多个连接(发出了多次的请求) l  会话共享多次请求的数据 二.Cookie(客户端的文件中)è不可以存对象,可以存储字符串类型的数据 1.   Cookie客户端应用:记住登录用户名 2.   Response:把cookie存在客户端  response.addCookie(cookie); 3.   Request:获取客户端的cookie   Cookie[] csokies = re