Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】(修订版)

基于树莓派4B设计的厨房环境监测系统_368 本项目设计并实现了一种基于树莓派4B的厨房环境监测系统,提升厨房使用过程中的安全性与智能化水平。系统采用树莓派4B作为主控核心,集成DHT11温湿度传感器、MQ2烟雾传感器、火焰传感器、光敏传感器、水滴检测传感器等多种传感器,实现对厨房环境温湿度、烟雾、火焰、光照与溢水等参数的实时监测,并通过蜂鸣器进行本地报警。系统通过WIFI连接互联网,利用MQTT协议将环境数据上传至华为云物联网平台,实现远程可视化监控。 阅读详情

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

什么是会话技术

基本概念: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话.


为什么我们要使用会话技术?

会话跟踪技术可以解决我们很多很多问题。

  • 在论坛登陆的时候,很多时候会有一个小框框问你是否要自动登陆,当你下次登陆的时候就不用输入密码了

640?wx_fmt=png

  • 根据我以前浏览过的商品,猜我喜欢什么商品

640?wx_fmt=png


Cookie

会话跟踪技术有Cookie和Session,Cookie技术是先出现的。我们先讲Cookie技术吧。

什么是Cookie

Cookie是由W3C组织提出,最早由netscape社区发展的一种机制

  • 网页之间的交互是通过HTTP协议传输数据的,而Http协议是无状态的协议。无状态的协议是什么意思呢?一旦数据提交完后,浏览器和服务器的连接就会关闭,再次交互的时候需要重新建立新的连接。

  • 服务器无法确认用户的信息,于是乎,W3C就提出了:给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie

640?wx_fmt=png


Cookie的流程:浏览器访问服务器,如果服务器需要记录该用户的状态,就使用response向浏览器发送一个Cookie,浏览器会把Cookie保存起来。当浏览器再次访问服务器的时候,浏览器会把请求的网址连同Cookie一同交给服务器。

Cookie API

  • Cookie类用于创建一个Cookie对象

  • response接口中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段

  • request接口中定义了一个getCookies方法,它用于获取客户端提交的Cookie

常用的Cookie方法:

  • public Cookie(String name,String value)

  • setValue与getValue方法

  • setMaxAge与getMaxAge方法

  • setPath与getPath方法

  • setDomain与getDomain方法

  • getName方法

简单使用Cookie

  • 创建Cookie对象,发送Cookie给浏览器、

        //设置response的编码	
        response.setContentType("text/html;charset=UTF-8");	
        //创建Cookie对象,指定名称和值	
        Cookie cookie = new Cookie("username", "zhongfucheng");	
        //向浏览器给一个Cookie	
        response.addCookie(cookie);	
        response.getWriter().write("我已经向浏览器发送了一个Cookie");
  • 浏览器本身没有任何Cookie

640?wx_fmt=png

  • 访问Servlet1,再回到文件夹中,还是没有发现Cookie,这是为什么呢?我明明向浏览器发送了一个Cookie的。

  • 原来发送Cookie给浏览器是需要设置Cookie的时间的。在给浏览器之前,设置一下Cookie的时间

        //设置Cookie的时间	
        cookie.setMaxAge(1000);
  • 再次访问,已经发现文件夹中多了个Cookie的文本了

640?wx_fmt=png


Cookie细节

Cookie不可跨域名性

  • 很多人在初学的时候可能有一个疑问:在访问Servlet的时候浏览器是不是把所有的Cookie都带过去给服务器,会不会修改了别的网站的Cookie

  • 答案是否定的。Cookie具有不可跨域名性。浏览器判断一个网站是否能操作另一个网站的Cookie的依据是域名。所以一般来说,当我访问baidu的时候,浏览器只会把baidu颁发的Cookie带过去,而不会带上google的Cookie。

Cookie保存中文

  • 上面我们的例子保存的是英文字符,下面我们来看下保存中文字符会怎么样。

        response.setContentType("text/html;charset=UTF-8");	
        PrintWriter printWriter = response.getWriter();	
        String name = "中国";	
        Cookie cookie = new Cookie("country", name);	
        cookie.setMaxAge(2000);	
        response.addCookie(cookie);	
        printWriter.write("我颁发了一个Cookie,值保存的是中文数据");
  • 访问Servlet1,好吧。出异常了!

640?wx_fmt=png

  • 中文属于Unicode字符,英文数据ASCII字符,中文占4个字符或者3个字符,英文占2个字符。

  • 解决:Cookie使用Unicode字符时需要对Unicode字符进行编码。

        //对Unicode字符进行编码	
        Cookie cookie = new Cookie("country", URLEncoder.encode(name, "UTF-8"));
  • 再次访问Servlet1,已经把Cookie成功颁发给浏览器了

640?wx_fmt=png

640?wx_fmt=png

  • 我们发现Cookie保存在硬盘的中文数据是经过编码的,那么我们在取出Cookie的时候要对中文数据进行解码

        Cookie[] cookies = request.getCookies();	
        for (int i = 0; cookies != null && i < cookies.length; i++) {	
            String name = cookies[i].getName();	
            //经过URLEncoding就要URLDecoding	
            String value = URLDecoder.decode(cookies[i].getValue(), "UTF-8");	
            printWriter.write(name + "------" + value);	
        }
  • 取出存进Cookie的值

640?wx_fmt=png


Cookie的有效期

Cookie的有效期是通过setMaxAge()来设置的。

  • 如果MaxAge为正数,浏览器会把Cookie写到硬盘中,只要还在MaxAge秒之前,登陆网站时该Cookie就有效【不论关闭了浏览器还是电脑】

  • 如果MaxAge为负数,Cookie是临时性的,仅在本浏览器内有效,关闭浏览器Cookie就失效了,Cookie不会写到硬盘中。Cookie默认值就是-1。这也就为什么在我第一个例子中,如果我没设置Cookie的有效期,在硬盘中就找不到对应的文件。

  • 如果MaxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie对应的方法,把MaxAge设置为0等同于删除Cookie


Cookie的修改和删除

  • 上面我们已经知道了Cookie机制没有提供删除Cookie的方法。其实细心点我们可以发现,Cookie机制也没有提供修改Cookie的方法。那么我们怎么修改Cookie的值呢?

  • Cookie存储的方式类似于Map集合,如下图所示

640?wx_fmt=png


  • Cookie的名称相同,通过response添加到浏览器中,会覆盖原来的Cookie。


  • 以country为名保存的是%E4%B8%AD%E5%9B%BD,下面我再以country为名,把值改变一下。 

640?wx_fmt=png

        String name = "看完博客就点赞";	
        //对Unicode字符进行编码	
        Cookie cookie = new Cookie("country", URLEncoder.encode(name, "UTF-8"));
  • 再次查看Cookie的时候,值已经改变了,但是文件还是那一份

640?wx_fmt=png

  • 现在我要删除该Cookie,把MaxAge设置为0,并添加到浏览器中即可

        String name = "看完博客就点赞";	
        //对Unicode字符进行编码	
        Cookie cookie = new Cookie("country", URLEncoder.encode(name, "UTF-8"));	
        //一定不要忘记添加到浏览器中	
        cookie.setMaxAge(0);	
        response.addCookie(cookie);	
        printWriter.write("我删除了该Cookie");
  • 访问Servlet,在硬盘已经找不到Cookie的文件了!

640?wx_fmt=png

640?wx_fmt=png


  • 注意:删除,修改Cookie时,新建的Cookie除了value、maxAge之外的所有属性都要与原Cookie相同。否则浏览器将视为不同的Cookie,不予覆盖,导致删除修改失败!


  • 我们来试验一下把。


        String name = "看完博客就点赞";	
        //对Unicode字符进行编码	
        Cookie cookie = new Cookie("country", URLEncoder.encode(name, "UTF-8"));	
        //一定不要忘记添加到浏览器中	
        cookie.setMaxAge(10000);	
        response.addCookie(cookie);

640?wx_fmt=png

  • 上面新建了一个Cookie,我修改下Cookie的其他属性,再删除,看能否把Cookie删除掉

        //一定不要忘记添加到浏览器中	
        cookie.setPath("/ouzicheng");	
        cookie.setMaxAge(0);	
        response.addCookie(cookie);	
        printWriter.write("删除一个Cookie");
  • 结果Cookie还在硬盘中

640?wx_fmt=png


Cookie的域名

Cookie的domain属性决定运行访问Cookie的域名。domain的值规定为“.域名”


  • Cookie的隐私安全机制决定Cookie是不可跨域名的。也就是说www.baidu.com和www.google.com之间的Cookie是互不交接的。即使是同一级域名,不同二级域名也不能交接,也就是说:www.goole.com和www.image.goole.com的Cookie也不能访问


  • 我在本地上配置了3个虚拟主机,localhost,www.zhongfucheng.com,www.image.zhongfucheng.com【如果不知道怎么配置,在我Tomcat的博客有】


640?wx_fmt=png

640?wx_fmt=png

  • 我用www.zhongfucheng.com域名发送了一个Cookie给浏览器

        Cookie cookie = new Cookie("name", "zhongfucheng");	
        cookie.setMaxAge(1000);	
        response.addCookie(cookie);	
        printWriter.write("使用www.zhongfucheng.com域名添加了一个Cookie");

640?wx_fmt=png

  • 首先,证明了Cookie不可跨名性,localhost域名拿不到www.zhongfucheng.com颁发给浏览器的Cookie

640?wx_fmt=png

  • 再使用www.image.zhongfucheng.com域名访问,证明即使一级域名相同,二级域名不同,也不能获取到Cookie

640?wx_fmt=png

  • 当然,使用www.zhongfucheng.com当然能获取到Cookie,Cookie通过请求头带给服务器

640?wx_fmt=png

  • 现在我希望一级域名相同的网页Cookie之间可以相互访问。也就是说www.image.zhongfucheng.com可以获取到www.zhongfucheng.com的Cookie就需要使用到domain方法。

        Cookie cookie = new Cookie("name", "ouzicheng");	
        cookie.setMaxAge(1000);	
        cookie.setDomain(".zhongfucheng.com");	
        response.addCookie(cookie);	
        printWriter.write("使用www.zhongfucheng.com域名添加了一个Cookie,只要一级是zhongfucheng.com即可访问");

  • 使用www.zhongfucheng.com发布一个Cookie 640?wx_fmt=png



  • 使用www.image.zhongfucheng.com域名访问一下。发现可以获取到Cookie了


640?wx_fmt=png


Cookie的路径

Cookie的path属性决定允许访问Cookie的路径


  • 一般地,Cookie发布出来,整个网页的资源都可以使用。现在我只想Servlet1可以获取到Cookie,其他的资源不能获取。



  • 使用Servlet2颁发一个Cookie给浏览器,设置路径为"/Servlet1"。


        Cookie cookie = new Cookie("username", "java");	
        cookie.setPath("/Servlet1");	
        cookie.setMaxAge(1000);	
        response.addCookie(cookie);	
        printWriter.write("该Cookie只有Servlet1获取得到");
  • 使用Servlet3访问服务器,看看浏览器是否把Cookie带上。显然,浏览器访问Servlet3并没有把Cookie带上。

640?wx_fmt=png

  • 使用Servlet1访问服务器,看看浏览器是否把Cookie带上。答案是肯定的!

640?wx_fmt=png


Cookie的安全属性

  • HTTP协议不仅仅是无状态的,而且是不安全的!如果不希望Cookie在非安全协议中传输,可以设置Cookie的secure属性为true,浏览器只会在HTTPS和SSL等安全协议中传输该Cookie。

  • 当然了,设置secure属性不会将Cookie的内容加密。如果想要保证安全,最好使用md5算法加密【后面有】。


Cookie的应用

显示用户上次访问的时间


  • 其实就是每次登陆的时候,取到Cookie保存的值,再更新下Cookie的值。


  • 访问Serlvet有两种情况


  • 第一次访问


  • 已经访问过了



  • 全部代码如下:


        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");	
        response.setContentType("text/html;charset=UTF-8");	
        PrintWriter printWriter = response.getWriter();	
        //获取网页上所有的Cookie	
        Cookie[] cookies = request.getCookies();	
        //判断Cookie的值是否为空	
        String cookieValue = null;	
        for (int i = 0; cookies != null && i < cookies.length; i++) {	
            //获取到以time为名的Cookie	
            if (cookies[i].getName().equals("time")) {	
                printWriter.write("您上次登陆的时间是:");	
                cookieValue = cookies[i].getValue();	
                printWriter.write(cookieValue);	
                cookies[i].setValue(simpleDateFormat.format(new Date()));	
                response.addCookie(cookies[i]);	
                //既然已经找到了就可以break循环了	
                break;	
            }	
        }	
        //如果Cookie的值是空的,那么就是第一次访问	
        if (cookieValue == null) {	
            //创建一个Cookie对象,日期为当前时间	
            Cookie cookie = new Cookie("time", simpleDateFormat.format(new Date()));	
            //设置Cookie的生命期	
            cookie.setMaxAge(20000);	
            //response对象回送Cookie给浏览器	
            response.addCookie(cookie);	
            printWriter.write("您是第一次登陆啊!");	
        }
  • 按照正常的逻辑来写,程序流程应该是这样子的。先创建Cookie对象,回送Cookie给浏览器。再遍历Cookie,更新Cookie的值。

640?wx_fmt=png


  • 但是,按照上面的逻辑是做不到的!因为每次访问Servlet的时候都会覆盖原来的Cookie,取到Cookie的值永远都是当前时间,而不是上次保存的时间。



  • 我们换一个逻辑写:先检查(遍历)所有Cookie有没有我要的,如果得不到我想要的Cookie,Cookie的值是null,那么就是第一次登陆,于是就有了上面的代码了。



  • 我们来看下效果吧!当我第一次登陆的时候


640?wx_fmt=png

  • Cookie保存在硬盘中。

640?wx_fmt=png

  • 再次访问Servlet。明显地,取到的就是Cookie的值

640?wx_fmt=png


显示上次浏览过商品

  • 我就以书籍为例子了!首先设计Book对象

    private String id ;	
    private String name ;	
    private String author;	
    public Book() {	
    }	
    public Book(String id, String name, String author) {	
        this.id = id;	
        this.name = name;	
        this.author = author;	
    }	
    ...各种set、get方法
  • 设计一个简单的数据库存储数据。就用LinkedHashMap集合【根据商品的id找书籍所以用Map,删改较多所以用Linked】

    private static LinkedHashMap<String, Book> linkedHashMap = new LinkedHashMap();	
    //简化开发复杂度,book的id和商品的id相同	
    static {	
        linkedHashMap.put("1", new Book("1", "javaweb", "zhong"));	
        linkedHashMap.put("2", new Book("2", "java", "fu"));	
        linkedHashMap.put("3", new Book("3", "oracle", "cheng"));	
        linkedHashMap.put("4", new Book("4", "mysql", "ou"));	
        linkedHashMap.put("5", new Book("5", "ajax", "zi"));	
    }	
    //获取到所有书籍	
    public static LinkedHashMap getAll() {	
        return linkedHashMap;	
    }
  • 显示网页上所有的书籍【首页】

        printWriter.write("网页上所有的书籍:"+"<br/>");	
        //拿到数据库所有的书	
        LinkedHashMap<String, Book> linkedHashMap = DB.getAll();	
        Set<Map.Entry<String, Book>> entry = linkedHashMap.entrySet();	
        //显示所有的书到网页上	
        for (Map.Entry<String, Book> stringBookEntry : entry) {	
            Book book = stringBookEntry.getValue();	
            printWriter.write(book.getId() +"           "+ book.getName()+"<br/>");	
        }

640?wx_fmt=png

  • 接着,我们要做的就是给显示的书籍挂上一个超链接,当用户点击想看的书籍时,就跳转到该书籍的详细信息页面

  • 超链接应该把书的id传递过去,不然处理页面是不知道用户想看的是哪一本书的!

        //显示所有的书到网页上	
        for (Map.Entry<String, Book> stringBookEntry : entry) {	
            Book book = stringBookEntry.getValue();	
            printWriter.write("<a href='/ouzicheng/Servlet2?id=" + book.getId() + "''target=_blank' +" + book.getName() + "</a>");	
            printWriter.write("<br/>");	
        }

640?wx_fmt=png

  • 接收id,找到用户想要看哪一本书,输出该书的详细信息

        String id = request.getParameter("id");	
        //由于book的id和商品的id是一致的。获取到用户点击的书	
        Book book = (Book) DB.getAll().get(id);	
        //输出书的详细信息	
        printWriter.write("书的编号是:" + book.getId()+"<br/>");	
        printWriter.write("书的名称是:" + book.getName()+"<br/>");	
        printWriter.write("书的作者是:" + book.getAuthor()+"<br/>");
  • 点击想要的书籍。

640?wx_fmt=png

  • 得到书籍的详细信息

640?wx_fmt=png


  • 既然用户点击了书籍,那么服务器就应该颁发Cookie给浏览器,记住用户点击了该书籍



  • 现在问题来了,Cookie的值应该是什么呢?试想一下,待会还要把浏览过的书籍显示出来,所以用书籍的id是最好不过的。想到了用书籍的id作为Cookie的值,我们还要定义一些规则!



  • 我们可能有非常多的书籍,不可能把用户浏览过的书籍都显示出来。所以我们定义只能显示3本浏览过的书籍



  • 书籍的id都是数字,如果不做任何修改,存到Cookie里边可能就是231,345,123此类的数字,这样取出某一个id的时候就十分费劲并且后面还要判断该书是否存在Cookie里边了,所以我们要把存储到Cookie的书籍id分割起来。所以我们定义”_“作为分隔符



  • 按上面的应用,我们的逻辑应该是:先遍历下Cookie,看下有没有我们想要的Cookie。如果找到想要的Cookie,那就取出Cookie的值


        String bookHistory = null;	
        Cookie[] cookies = request.getCookies();	
        for (int i = 0; cookies != null && i < cookies.length; i++) {	
            if (cookies[i].getName().equals("bookHistory")) {	
                bookHistory = cookies[i].getValue();	
            }	
        }

  • 取出了Cookie的值也分几种情况


  1. Cookie的值为null【直接把传入进来的id当做是Cookie的值】

  2. Cookie的值长度有3个了【把排在最后的id去掉,把传进来的id排在最前边】

  3. Cookie的值已经包含有传递进来的id了【把已经包含的id先去掉,再把id排在最前面】

  4. Cookie的值就只有1个或2个,直接把id排在最前边

        if (bookHistory == null) {	
            return id;	
        }	
        //如果Cookie的值不是null的,那么就分解Cookie的得到之前的id。	
        String[] strings = bookHistory.split("\\_");	
        //为了增删容易并且还要判断id是否存在于该字符串内-----我们使用LinkedList集合装载分解出来的id	
        List list = Arrays.asList(strings);	
        LinkedList<String> linkedList = new LinkedList<>();	
        linkedList.addAll(list);	
        if (linkedList.contains(id)) {	
            linkedList.remove(id);	
            linkedList.addFirst(id);	
        }else {	
            if (linkedList.size() >= 3) {	
                linkedList.removeLast();	
                linkedList.addFirst(id);	
            } else {	
                linkedList.addFirst(id);	
            }	
        }
  • 这么折腾完了,我们的Cookie值就在LinkedList集合里边了。接下来,我们要做的就是把集合中的值取出来,拼接成一个字符串

        StringBuffer stringBuffer = new StringBuffer();	
        //遍历LinkedList集合,添加个下划线“_”	
        for (String s : linkedList) {	
            stringBuffer.append(s + "_");	
        }	
        //最后一个元素后面就不需要下划线了	
        return stringBuffer.deleteCharAt(stringBuffer.length() - 1).toString();
  • 好的,我们现在已经完成了Cookie值了。接下来设置Cookie的生命周期,回送给浏览器即可

        String bookHistory = makeHistory(request, id);	
        Cookie cookie = new Cookie("bookHistory", bookHistory);	
        cookie.setMaxAge(30000);	
        response.addCookie(cookie);
  • 既然我们已经把Cookie回送给浏览器了。那么接下来我们就在首页上获取Cookie的值,显示用户浏览过什么商品就行了!

        printWriter.write("您曾经浏览过的商品:");	
        printWriter.write("<br/>");	
        //显示用户浏览过的商品	
        Cookie[] cookies = request.getCookies();	
        for (int i = 0; cookies != null && i < cookies.length; i++) {	
            if (cookies[i].getName().equals("bookHistory")) {	
                //获取到的bookHistory是2_3_1之类的	
                String bookHistory = cookies[i].getValue();	
                //拆解成每一个id值	
                String[] ids = bookHistory.split("\\_");	
                //得到每一个id值	
                for (String id : ids) {	
                    //通过id找到每一本书	
                    Book book = linkedHashMap.get(id);	
                    printWriter.write(book.getName());	
                    printWriter.write("<br/>");	
                }	
                break;	
            }	
        }
  • 好的,我们来试验一下吧!!,第一次访问首页,并没有浏览过的商品

640?wx_fmt=png

  • 当我点击javaweb书籍再访问首页的时候

640?wx_fmt=png

  • 再点击ajax然后访问首页

640?wx_fmt=png

  • 再点击javaweb然后访问首页

640?wx_fmt=png

  • 点击oracle然后访问首页

640?wx_fmt=png

  • 好的,经过测试,该程序应该没有什么问题了!


最后

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!

640?wx_fmt=jpeg

有帮助?好看!转发!640


USB 基础学习:USB 电气信号介绍 USB电气信号技术解析 USB通信的核心是差分信号传输技术,通过D+和D-两根线传输相位相反的电压信号实现数据通信。USB信号系统包含三类关键信号:差分数据信号(抗干扰性强)、单端状态信号(用于设备识别)和电源信号(提供5V供电)。USB2.0采用400mV电压摆幅和NRZI编码,支持低速(1.5Mbps)至高速(480Mbps)传输;USB3.0则新增专用差分对,数据速率可达20Gbps。物理层通过上拉/下拉电阻检测设备连接,高速模式需特殊握手协议。抗干扰设计的关键在于保持差分线等长、阻抗匹配和使用共模扼 阅读详情

相关推荐

TYPE-C接口电路设计篇(一)

常见USB接口类型 随着USB Type-C接口的推行,USB Type-C是一种通用串行总线(USB)的硬件接口形式,USB Type-C接口在消费类产品普及程度越来越高,常见的适配器、笔电、手机等产品都兼容USB Type-C设计,接口多元化逐渐趋向归一,从而可以看出USB Type-C的重要性。 在了解USB Type-C接口之前,我们先来回顾下USB Type-A和USB Type-B接口,USB3.0 Type-A和Type-B接口定义分别如下。 USB 3.0...

JWu的博客 3万+

Servlet Cookie 获取不到问题

servlet cookie el表达式 ${cookie.xxx.value} 读取不了 因为path路径导致浏览器识别不了cookie

reinforceI的博客 1018

Matlab生成dsp程序——环境搭建(c2000系列[F28335、F2837x]都适用)

一、环境配置 (28377D的操作是一模一样就是硬件设置的时候需要选择28377d进行相应的设置) 1)matlab与ccs联合编译需要安装对应的matlab版本和ccs版本,且只有2016a以上的matlab支持c2000系列。具体对应关系参照: http://software-dl.ti.com/ccs/esd/documents/ccs_matlab.html 2)matlab版本确定之后,还需要安装有关于ccs的相关软件: I、TI Code Composer Studio xxxx(对应

qq_42151264的博客 2万+

Servlet Cookie取不到值

访问的时候,cookie uid值放在127.0.0.1:8080下,在127.0.0.1:8080下的cookie服务端的Servlet永远都获取不到;在测试带Cookie的HTTP请求时发现,服务端用request.getHeader("cookie")可以去到值;访问的时候,cookie值放在localhost下,服务器自动生成的SESSIONID也是存放在localhost路径下。当然是服务器已经有域名的就不会出现端口号下获取不到cookie的值。所以在服务端下发cookie的时候,

QQ1057081261的专栏 510

双RTX 3090实战:如何用vLLM低成本部署Qwen2.5-14B大模型(附避坑清单)

本文详细介绍了如何利用双RTX 3090显卡低成本部署Qwen2.5-14B大模型的完整指南,包括硬件选型、环境配置、vLLM优化及生产环境调优。重点解析了BF16混合精度在显存占用与推理质量上的平衡策略,并提供了实用的避坑清单和性能调优技巧,帮助开发者高效实现大模型部署。

pz890123456的博客 699

echarts的坐标轴处理算法

参考原文:https://www.cnblogs.com/vicky-li/p/11653415.html。2、可用于双轴的情况,指定splitNumber,保证左右两边的线没有交叉显示的情况。1、设置echarts显示的最大最小值,让数据显示比较有起伏。处理echarts的一些问题。

HYeeee的博客 801

笔记09-Filter、Cookies

Filter(过滤器) 一、作用: 1.生活中:帮助我们筛选杂质,提取优质的物品 2.web应用中:过滤request,response 3.真是应用中: 1)可以做自动登录,记住用户名密码, 2)处理整个web应用的字符集 3)过滤敏感字体 二、优先级 过滤器是在web服务器启动的时候直接加载,所以优先于所有资源,高于页面,高于jsp,可以理解为过滤器在mvc模型中处于人和页面交互之间的位置。 三、强调 访问页面一次就要加载一次Filter过滤器 四、创建一个Filter过滤器 1.实现Filter接..

qq_53855503的博客 608

能量机关 STM32HAL库开发大疆A板WS2812B彩灯(PWM+DMA)

本文主要目的是为了制作RoboMaster比赛能量机关的灯条控制,模拟比赛场中大符,搭建出类似场地道具,以供视觉测试 使用的是RoboMaster开发板A型,芯片为STM32F427IIH6,使用的灯条为WS2812B。 采用PWM+DMA控制,使用CUBEMX配置底层,keil5编辑烧录代码 实现:一共五片扇叶,每片扇叶均实现流水灯+常亮颜色 参考文章在后面会标记出来

m0_51756449的博客 4291

为什么设置上了cookie,但第一次请求的时候拿不到?(最简解释 + 图、文、码三维解析)

一、答案 1、cookie是设置在客户端的,setcookie函数自己并不能设置cookie,它只能通过头信息的方式告诉浏览器说:我想要设置一个 cookie,键为a,值为value,你在你那里帮我设置一下 2、编程语言的执行是自上而下的,当次执行的时候cookie文件中并没有,请求之初也没有携带需要的存的信息,所以拿不到 3、当第二次请求的时候,由于服务器让浏览器存入了cookie文件...

蔡梦龙的专栏 1万+

钣金件设计规范

为保证折弯 强度,钣金折弯钣金应大于材料的最小折弯半径。在设计U型弯曲件时,两弯曲边最好长度相等,以免弯曲时产品偏 移而产生废品,如果因为结构设计不允许两边一样长,为保证产品在模 具中准确定位,应预先在设计时添加工艺定位孔,特别是多次折弯成 形的零件,必须设计工艺孔为定位基准,以减少累计误差,保证产品 质量,如图2-11所示。凸包是依靠材料的延伸使钣金件形成局部凹陷或凸起的冲压工序凸包与拉深是完全不同的冲压工艺,凸包中材料厚度的改变为费意图性 的,即厚度的少量改变是变形过程中形成的,不是设计指定的要求。

制冷技术咨询与服务的博客 7327

Arduino与Proteus仿真实例-LCD2004-I2C(PCF8574)驱动仿真

LCD2004-I2C(PCF8574)驱动仿真 PCF8574/74A 通过两线双向 I2C 总线(串行时钟 (SCL)、串行数据 (SDA))提供通用远程 I/O 扩展。 LCD2004,即2004字符型液晶显示器,是一种点阵模块,用于显示字母、数字、字符等。 它由 5x8 个点阵位置组成; 每个位置可以显示一个字符。 两个字符之间有一个点间距,行之间有一个空格,从而将字符和行分开。 模型 2004 表示它显示 4 行,每行 20 个字符。 在前面的实例中对PCF8574和LCD2004的已经做了详细介

视觉与物联智能 1165

[已解决]Spring Boot Ajax跨域问题,Cookie无法获取 丢失问题

服务端获取cookie失败报错, 注册和更改密码需要使用Cookie的功能失效, 在查找文档后发现错误来源于springboot和ajax的跨域cookie丢失问题, 由于我是刚接触后端的小白, 这里只贴出我的解决方案。在写自己项目的登录注册页面时, 因为我的注册和更改密码功能采用了邮箱验证, 在发送验证码的时候后端会向响应数据中添加一个cookie。再响应标头中分明有set-Cookie, 但是再第二次的请求标头中却找不到Cookie。在本地进行测试时, Cookie能正确添加进响应中, 也能正确获取。

qq_52960593的博客 3675

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

查看网站所有会话_Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】(修订版)...

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y什么是会话技术基本概念: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话.为什么我们要使用会话技术?会话跟踪技术可以解决我们很多很多问题。在论坛登陆的...

weixin_39907850的博客 169

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Servlet第六篇【Session介绍、API、生命周期、应用、与Cookie区别】(修订版)

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y什么是SessionSess...

3y 495

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

深入分析Java Web技术内幕(修订版)

阿里巴巴集团技术丛书 深入分析Java Web技术内幕(修订版)(阿里巴巴集团技术丛书。技术大牛范禹、玉伯、毕玄联合力荐!大型互联网公司开发应用实践!) 许令波 著 ISBN 978-7-121-23293-0 2014年8月出版 定价:79.00元 464页 16开 编辑推荐 让读者知其然,并知其所以然,是《深入分析Java Web技术内幕(修订版)》一书最大...

weixin_30810583的博客 182

过滤器入门看这一篇就够了(修订版)

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y什么是过滤器过滤器是Serv...

3y 368

url过滤怎么解除_过滤器入门看这一篇就够了(修订版)

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y什么是过滤器过滤器是Servlet的高级特性之一,也别把它想得那么高深,只不过是实现Filter接口的Java类罢了!首先,我们来看看过滤器究竟Web容器的哪处:从上面的图我们可以发现,当浏览器发送请求给服务器的时候,先执行过滤器,然后才访问Web...

weixin_39870664的博客 1万+

Web应用开发和SSH

最近在学习Web应用开发和SSH架构, 这几个Blog值得推荐学习. http://blog.youkuaiyun.com/lfsf802/article/list/1?viewmode=contents http://tech.idv2.com/2007/09/14/servlet-basic/ http://www.java-forums.org/blogs/all/ http://openhom

luke_wang的专栏 614

MuleSoft驱动的企业级AI编排实战:从网关到执行的全栈落地

AI编排(AI Orchestration)是企业将大语言模型规模化集成进现有IT架构的核心范式,其本质是以API为中心、策略为驱动、治理为底线的能力调度体系。不同于轻量级AI Workflow或自治型AI Agent,它强调服务契约、流量治理、身份联邦与端到端可观测性,解决LLM在生产环境中常见的权限失控、上下文溢出、敏感数据泄露、响应抖动与审计缺失等关键问题。依托MuleSoft等企业级集成平台,可实现Prompt热更新、RAG双维度检索、七层安全防护及Stateful流程编排,让LLM调用具备与SAP

weixin_33713707的博客 404

Java架构师必看的10本书

1、大型网站系统与JAVA中间件实践 本书围绕大型网站和支撑大型网站架构的Java中间件的实践展开介绍。 从分布式系统的知识切入,让读者对分布式系统有基本的了解;然后介绍大型网站随着数据量、访问量增长而发生的架构变迁;接着讲述构建Java中间件的相关知识;之后的几章都是根据笔者的经验来介绍支撑大型网站架构的Java中间件系统的设计和实践。希望读者通过本书可以了解大型网站架构变迁过程中的较为通用

Java技术栈,分享最主流的Java技术 8357

http域名在浏览器set-cookie失败,导致cookie中获取不到内容解决方案

由于开发一个表格系统时,前端使用的是Vue,后端使用的是 spring boot,在本地调试时用 localhost来访问,可以做到服务端和客户端使用cookie(HttpSession session) 通信,实现验证是否登录,但是在生产环境客户端(浏览器)在登录时无法set-cookie,导致cookie 信息没有保存在浏览器,其他接口无法做验证登录。

tpl9236 的博客 5289

HttpServletRequest获取请求参数与cookie、session

使用HttpServletRequest获取请求参数

m0_37635053的博客 1万+

Servlet Cookie取不到值原因

现象: 在测试带Cookie的HTTP请求时发现,服务端用request.getHeader("cookie")可以去到值;但是用request.getCookies()却不行Cookie mycookies[] = request.getCookies();中永远获取不到uid的值;(80端口号除外) 原因: 查了浏览器的具体cookie值,发现http://localho...

diaomu5377的博客 1790

IIS Cookies 失效故障的解决过程

Web服务器发生了硬件故障,修好后将Web站点迁回到服务器上,很快所有网站都能正常访问了。这时发现有两个网站,打开后需要输入用户名和密码进行登录,但输入用户名和密码后登录失败。在服务器上打开网站登录,提示禁用了Cookies,在客户端上打开网站登录,点击确定按钮后没有任何提示。检查了一下没能发现问题,于是开始深入排查故障。 先说一下服务器环境:Windows Server 2...

weixin_30528371的博客 1234

request.getCookies() 获取不到设置的对象

最近前端工程师将cookie整理,使用一个对象进行管理,原有的request.getCookies()只能获取到数值或字符串形式的键值,但从Header中可以获取到,故本文给出解决方法 解决方法代码: public static String getCookieValue(HttpServletRequest request, String cookieName, boolean isDecoder) { String cookie=request.getHeader("cookie");

大圈技术博客 1812

介绍会话技术、Cookie的API、详解、应用

介绍会话技术、Cookie的API、详解、应用 前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 什么是会话技术 基本概念: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话. 为什么我...

孤独的灵魂的博客 338
上一篇: Servlet第一篇【HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】(修订版)...
下一篇: Servlet第二篇【Servlet细节、ServletConfig、ServletContext】(修订版)
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值