96SEO 2026-02-23 11:47 1
第三步修改LoginServlet类的代码当验证码错误时显示“验证码错误”若验证码不成功不验证用户名和密码是否正确

Cookie翻译成中文是小甜点小饼干的意思。
在HTTP中它表示服务器送给客户端浏览器的小甜点。
其实Cookie就是一个键和一个值构成的随着服务器端的响应发送给客户端浏览器。
然后客户端浏览器会把Cookie保存起来当下一次再访问服务器时把Cookie再发送给服务器。
Cookie是由服务器创建然后通过响应发送给客户端的一个键值对。
客户端会保存Cookie并会标注出Cookie的来源哪个服务器的Cookie。
当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器这样服务器就可以识别客户端了
创建于服务器保存于客户端不同的浏览器之间不能共享不能跨浏览器Cookie的keyvalue都是String在之后的请求中cookie会以请求头的方式自动发送给服务器
不安全在客户端浏览器的键值不加密keyvalue的数据类型有限只能存string类型的数据
Cookie大小上限为4KB不同的浏览器cookie的内存大小可能不同
不同浏览器之间是不共享Cookie的。
也就是说在你使用IE访问服务器时服务器会把Cookie发给IE然后由IE保存起来当你在使用FireFox访问服务器时不可能把IE保存的Cookie发送给服务器。
如果服务器端发送重复的Cookie那么会覆盖原有的Cookie例如客户端的第一个请求服务器端发送的Cookie是Set-Cookie:
path为/下的cookie和path为/user下的cookie
Cookie(k2,v200);//cookie的设置代码,一定在addCookie()之前//给cookie设置最大存活时间cookie1.setMaxAge(150);cookie2.setMaxAge(150);//保存到客户端resp.addCookie(cookie1);resp.addCookie(cookie2);
System.out.println(req.getHeader(Cookie));Cookie[]
cookie.getName();if(name.equals(username)
cookie.getValue();System.out.println(key:name,value:value);}}}三案例记住我功能的实现
因为我们需要实现的是登录成功之后把用户名、密码保存起来所以这两个数据应该在服务器端的逻辑代码执行完毕之后传给客户端所以是服务器传给客户端的数据。
所以我们选择使用cookie来存储从服务器端传来的数据也就是登录成功之后的用户名和密码。
登录成功之后,并且用户勾选了“记住我”用户名,密码保存到cookie
响应编码resp.setCharacterEncoding(UTF-8);resp.setContentType(text/html;charsetUTF-8);//进行验证码验证String
verifyreq.getParameter(verifycode);HttpSession
code(String)session.getAttribute(CHECKCODE_SERVER);if
(code.equals(verify)){//2.获取请求参数String
req.getParameter(password);//3.调用业务层LoginService的登录方法LoginService
remreq.getParameter(rem);if(Objects.nonNull(rem)){//把用户名密码保存到cookieCookie
7天cookie1.setMaxAge(60*60*24*7);cookie2.setMaxAge(60*60*24*7);//设置path为/
项目下任何资源可以访问cookie1.setPath(/);cookie2.setPath(/);//保存到客户端resp.addCookie(cookie1);resp.addCookie(cookie2);}session.setAttribute(login,loginInfo);resp.sendRedirect(/index.jsp);}else{
//登录失败//转发到登录页面//把错误信息保存到request域req.setAttribute(error,
用户名或密码错误);req.getRequestDispatcher(/login.jsp).forward(req,
resp);}}else{req.setAttribute(error,验证码错误);req.getRequestDispatcher(/login.jsp).forward(req,resp);}}
cookiesrequest.getCookies();String
cookie:cookies){if(cookie.getName().equals(username)){usernamecookie.getValue();}if
(cookie.getName().equals(pwd)){passwordcookie.getValue();}}}
hrefjavascript:refreshCode()img
spantimes;/span/buttonstrong${error}/strong/div
HttpSession域对象创建于服务器保存于服务器同一次会话有效
javax.servlet.http.HttpSession接口表示一个会话我们可以把一个会话内需要共享的数据保存到HttpSession对象中
request.getSesssion()如果当前会话已经有了session对象那么直接返回如果当前会话还不存在会话那么创建session并返回
request.getSession(boolean)当参数为true时与requeset.getSession()相同。
如果参数为false那么如果当前会话中存在session则返回不存在返回null
HttpServletRequest一个请求创建一个request对象所以在同一个请求中可以共享request例如一个请求从AServlet转发到BServlet那么AServlet和BServlet可以共享request域中的数据
ServletContext一个应用只创建一个ServletContext对象所以在ServletContext中的数据可以在整个应用中共享只要不启动服务器那么ServletContext中的数据就可以共享
HttpSession一个会话创建一个HttpSession对象同一会话中的多个请求中可以共享session中的数据
value)用来存储一个对象也可以称之为存储一个域属性例如session.setAttribute(“xxx”,
“XXX”)在session中保存了一个域属性域属性名称为xxx域属性的值为XXX。
请注意如果多次调用该方法并且使用相同的name那么会覆盖上一次的值这一特性与Map相同
name)用来获取session中的数据当前在获取之前需要先去存储才行例如String
session.getAttribute(“xxx”);获取名为xxx的域属性
name)用来移除HttpSession中的域属性如果参数name指定的域属性不存在那么本方法什么都不做
{//服务器通知浏览器不要缓存response.setHeader(pragma,no-cache);response.setHeader(cache-control,no-cache);response.setHeader(expires,0);//在内存中创建一个长80宽30的图片默认黑色背景//参数一长//参数二宽//参数三颜色int
BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//获取画笔Graphics
image.getGraphics();//设置画笔颜色为灰色g.setColor(Color.GRAY);//填充图片g.fillRect(0,0,
width,height);//产生4个随机验证码12EyString
getCheckCode();//将验证码放入HttpSession中request.getSession().setAttribute(CHECKCODE_SERVER,checkCode);//设置画笔颜色为黄色g.setColor(Color.YELLOW);//设置字体的小大g.setFont(new
Font(黑体,Font.BOLD,24));//向图片上写入验证码g.drawString(checkCode,15,25);//将内存中的图片输出到浏览器//参数一图片对象//参数二图片的格式如PNG,JPG,GIF//参数三图片输出到哪里去ImageIO.write(image,PNG,response.getOutputStream());}/***
r.nextInt(size);//在base字符串中获取下标为index的字符char
base.charAt(index);//将c放入到StringBuffer中去sb.append(c);}return
{this.doGet(request,response);}
hrefjavascript:refreshCode()img
{//每次点击时重新生成验证码console.log(refreshCode....)//选择器
浏览器缓存,url没有变化使用上一次缓存的内容//加一个时间戳每一次都不一样浏览器发现参数不一样以为是新请求不使用上一次缓存$(#vcode).attr(src,/checkCode?timenew
第三步修改LoginServlet类的代码当验证码错误时显示“验证码错误”若验证码不成功不验证用户名和密码是否正确
verifyreq.getParameter(verifycode);HttpSession
code(String)session.getAttribute(CHECKCODE_SERVER);if
(code.equals(verify)){//2.获取请求参数String
req.getParameter(password);//3.调用业务层LoginService的登录方法LoginService
remreq.getParameter(rem);if(Objects.nonNull(rem)){//把用户名密码保存到cookieCookie
7天cookie1.setMaxAge(60*60*24*7);cookie2.setMaxAge(60*60*24*7);//设置path为/
项目下任何资源可以访问cookie1.setPath(/);cookie2.setPath(/);//保存到客户端resp.addCookie(cookie1);resp.addCookie(cookie2);}session.setAttribute(login,loginInfo);resp.sendRedirect(/index.jsp);}else{
//登录失败//转发到登录页面//把错误信息保存到request域req.setAttribute(error,
用户名或密码错误);req.getRequestDispatcher(/login.jsp).forward(req,
resp);}}else{req.setAttribute(error,验证码错误);req.getRequestDispatcher(/login.jsp).forward(req,resp);}
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback