首页
留言
友链
壁纸
更多
直播
追番
统计
关于
Search
1
欢迎使用 Typecho
189 阅读
2
为Joe主题增加表情包
163 阅读
3
Java的一些基础知识总结
140 阅读
4
『转载』Linux文件自动备份百度网盘
139 阅读
5
Js 音频律动
125 阅读
默认分类
Java
Java基础知识
Java面向对象
JavaWeb服务
前端三剑客
HTML
JS
Typecho
前端小结
Vue
登录
/
注册
Search
标签搜索
Java
Servlet
HTML
面向对象
Web
Vue
JS
Typecho
Typora
Markdown
乐抖系统
Typecho主题
技术教程
类与对象
基础知识
Tomcat
Maven
Linux
MySQL
Mybatis
白衣少年
累计撰写
48
篇文章
累计收到
42
条评论
首页
栏目
默认分类
Java
Java基础知识
Java面向对象
JavaWeb服务
前端三剑客
HTML
JS
Typecho
前端小结
Vue
页面
留言
友链
壁纸
直播
追番
统计
关于
用户登录
登录
注册
搜索到
48
篇
白衣少年
发布的文章
2022-11-08
Java-Session与Cookie及详解
Session是什么"会话控制",Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个会话中一直存在下去。当用户请求来自应用程序的Web页面时,如果该用户还没有会话,则Web服务器将自动创建一个Session对象。当会话过期或者被放弃后,服务器将终止该会话。 注意:会话状态只在支持Cookie的浏览器中保存Cookie是什么Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息。例如,如果在用户请求站点中的页面时应用程序发送给该用户的不仅仅是一个页面,还有一个包含日期和时间的 Cookie,用户的浏览器在获得页面的同时还获得了该 Cookie,并将它存储在用户硬盘上的某个文件夹中。Session与Cookie的区别Session :是针对每个用户的,只有客户端才能访问,程序为该客户添加一个 session。session中主要保存用户的登录信息、操作信息等等。此 session将在用户访问结束后自动消失(如果也是超时)。Cookie :是针对每个网站的信息,每个网站只能对应一个,其他网站无法访问,这个文件保存在客户端,每次您拨打相应网站,浏览器都会查找该网站的 cookies,如果有,则会将该文件发送出去。cookies文件的内容大致上包括了诸如用户名、密码、设置等信息。存储数据的大小不同,一个 cookie存储的数据不超过3 K; session存储在服务器上可以任意存储数据,但是,当 session存储数据太多时,服务器可选择进行清理。有效期不同 :通过设置 Cookie的属性,开发 Cookie能够长期有效。而Session依赖于一个名为 JSESSIONID的 cookies,而 CookiJSESSIONID的过期时间默认为-1,只需关闭该窗口,因此 Session将无法达到长期有效的效果。Session是何时创建的当浏览器第一次访问服务器一个页面之后由服务器创建的,并使用特殊算法算出一个Session的ID(JSESSIONID),以Cookie的方式保存在客户端中,而这个JSESSIONID在随后的请求中会被用来获得已经创建的Session;在Session被创建之后,就可以调用Session的相关方法往Session中增加内容了,而这些内容只会保存在服务器中,响应给客户端的只有JSESSIONID;当客户端再次发送请求的时候,会将这个JSESSIONID带上,服务器接收到请求之后就会依据JSESSIONID找到响应的Session。 浏览器第一次访问服务器一个页面后创建JSESSIONID其实是做了这些事情Cookie cookie=new Cookie("JSESSIONID",特殊算法算出来的Session ID); response.addCookie(cookie);Session方法的使用HttpSession session=request.getSession(); boolean isNew(); //判断该Session对象是不是新创建的 String getId(); //获取Session对象的JSESSIONID void setAttribute(String var1, Object var2); //保存数据到Session对象中 Object getAttribute(String var1); //从Session对象中取数据 void removeAttribute(String var1); //移除Session对象中的键值对 void invalidate(); //注销Session,注销之后服务器会生成一个新的JSESSIONID void setMaxInactiveInterval(int var1); //设置Session失效时间的秒数 int getMaxInactiveInterval(); //获取Session失效时间的秒数HttpSession session = req.getSession(true); 如果该客户端在此服务器中存在Session,就返回这个Session;如果不存在,就创建一个新的Session返回HttpSession session = req.getSession(false); 如果该客户端在此服务器中存在Session,就返回这个Session;如果不存在,就返回一个nullCookie的使用Cookie创建document.cookie = 'Authentication=' + response.data; document.cookie = 'Platform=manageBackend';表示创建了名为 Authentication ,内容为 response.data 的Cookie,名为 Platform ,内容为 manageBackend的Cookie 。Cookie的删除// 给cookie设置的过期时间 const date = new Date(); date.setTime(date.getTime() - 10000); // 删除cookie信息 document.cookie = `Platform=; expires=${date['toGMTString']()};path=${cookiePath}; domain=${document.domain}`;Cookie 不仅仅有 key 和 value 属性,还有域( domain )、过期时间( expires )、路径( path )等属性。其中,不同户域、不同的路径下可以存相同名字的 cookie 。所以删除 cookie 需要写上他的所有属性,这样才能成功删除 cookie 。
2022年11月08日
46 阅读
0 评论
3 点赞
2022-11-07
Java-Request的应用
什么是RequestHttpServletRequest代表客户端的请求,用户通过Http协议访问服务器;HTTP请求中的所有信息会被封装到HttpServletRequest 简单来说,要得到浏览器信息,就找HttpServletRequest对象HttpServletRequest常用方法获得客户机【浏览器】信息getRequestURL方法返回客户端发出请求时的完整URL。getRequestURI方法返回请求行中的资源名部分。getQueryString 方法返回请求行中的参数部分。getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。getRemoteAddr方法返回发出请求的客户机的IP地址getRemoteHost方法返回发出请求的客户机的完整主机名getRemotePort方法返回客户机所使用的网络端口号getLocalAddr方法返回WEB服务器的IP地址。getLocalName方法返回WEB服务器的主机名获得客户机请求头getHeader方法getHeaders方法getHeaderNames方法获得客户机请求参数(客户端提交的数据)getParameter方法getParameterValues(String name)方法getParameterNames方法getParameterMap方法获取前端传递的参数,请求转发//重点学习 public String getParameter(String name); public String[] getParameterValues(String name); //可以忽略 public Enumeration<String> getParameterNames(); public Map<String, String[]> getParameterMap();public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决乱码问题 resp.setCharacterEncoding("utf-8"); req.setCharacterEncoding("utf-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); String[] hobbys = req.getParameterValues("hobby"); System.out.println("=================================="); System.out.println(username+":"+password); System.out.println("爱好"+ Arrays.toString(hobbys)); System.out.println("=================================="); //这里不需要写/r 转发不需要写当前项目,重定向需要 req.getRequestDispatcher("/success.jsp").forward(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }常见错误{callout color="#409eff"}没有重新配置tomcat服务器路径错误{/callout}
2022年11月07日
48 阅读
0 评论
4 点赞
2022-11-07
Java-Response实现重定向
什么是重定向重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。重定向作用在客户端,客户端将请求发送给服务器后,服务器响应给客户端一个新的请求地址,客户端重新发送新请求。转发与重定向的区别相同点 :页面都会跳转不同点 :请求转发时,url不会发生变化重定向时,浏览器地址栏的url会发生变化。public class Servlet4 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 重定向的时候,一定要注意路径问题,否则就会出现404 resp.sendRedirect("/s1/index.jsp"); } }重定向web资源B收到A的请求后,B会通知A客户端去反问另一个web资源C,这个过程叫重定向void sendRedirect(String var1) throws IOException;Status Code:302 重定向 Location:/r/img代码public class RedirectServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.sendRedirect("/r/img");//重定向 //拆分 /* resp.setHeader("Location","/r/img"); resp.setStatus(302); */ } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }常见场景:用户登录场景代码 :jsp文件 <!-- index文件 --> <html> <body> <h2>Hello World!</h2> <%--这里提交的路径需要寻找到项目的路径--%> <%-- pageContext.request.contextPath() 这段代码表示的是当前项目 --%> <form action="${pageContext.request.contextPath}/login" method="get"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> <input type="submit"> </form> </body> </html> <!-- success文件 --> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>Success</h1> </body> </html>public class RequestTest extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("进入这个请求"); //处理请求 String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println(username+":"+password); //重定向一定要注意路径问题 resp.sendRedirect("/r/success.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }错误总结:1.配置maven的时候没有导入jsp的文件包,需要导入该包,导入代码如下 <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency>2.检查index.jsp form表单的拼写3.检查web.xml文件的配置面试题:重定向与转发的区别相同点页面都会跳转不同点请求转发的时候,url不会产生变化重定向的时候,url地址栏会发生变化
2022年11月07日
76 阅读
0 评论
3 点赞
2022-11-07
Java-Response实现下载文件和验证码
一、概述在创建 servlet 时会覆盖 service() 方法,或 doGet()/doPost() ,这些方法都有两个参数,一个为代表请求的 request 和代表响应的 response 。 service 方法中的 response 的类型是 ServletResponse ,而 doGet/doPost 方法的 response 的类型是 HttpServletResponse,HttpServletResponse 是ServletResponse的子接口,功能和方法更加强大。二、流程三、HttpServletResponseweb服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表相应的一个HttpServletResponse:如果要获取请求的参数:HttpServletRequest如果要给客户端相应一些信息:HttpServletResponse简单分类{callout color="#409eff"}负责向浏览器发送数据的方法{/callout}ServletOutputStream getOutputStream() throws IOException; PrintWriter getWriter() throws IOException;{callout color="#409eff"}负责向浏览器发送响应头的方法{/callout}void setCharacterEncoding(String var1); void setContentLength(int var1); void setContentLengthLong(long var1); void setContentType(String var1); void setDateHeader(String var1, long var2);//设置日期 void addDateHeader(String var1, long var2);//添加日期 void setHeader(String var1, String var2);//设置表头 void addHeader(String var1, String var2);//添加表头 void setIntHeader(String var1, int var2); void addIntHeader(String var1, int var2); void setStatus(int var1);//设置状态码 /*状态码不需要记忆,忘掉建议百度,常见的为404,500,200*/常见应用向浏览器输出东西下载文件—-上传文件(1). 获取下载文件的路径 (2). 获取下载的文件名 (3). 设置浏览器,让它能够支持我们的下载 (4). 获取下载文件的输入流 (5). 创建缓冲区 (6). 获取OutputStream对象 (7). 将获取的文件流写入到buffer缓冲区 (8). 使用OutputStream将缓冲区里面的文件刷入flush或close本地硬盘{callout color="#409eff"}代码(仅供参考){/callout}public class FileServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String realPath = "E:\\ideaWorkplace\\com.yu\\response\\src\\main\\resources\\1.jpg"; System.out.println("下载文件的路径:"+realPath); String fileName = realPath.substring(realPath.lastIndexOf("//")+1); resp.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(fileName)); FileInputStream in = new FileInputStream(realPath); int len=0; byte[] buffer = new byte[1024]; ServletOutputStream out = resp.getOutputStream(); while ((len=in.read(buffer))!=-1){ out.write(buffer,0,len); } in.close(); out.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }验证码生成{callout color="#409eff"}如何实现验证?{/callout}前端实现 后端实现,需要用到java的图片类,产生一个图片{callout color="#409eff"}代码实现(只要前面的maven配置没有问题,跟着老师走就行,没啥好说的){/callout} public class ImageServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //如何让浏览器5秒刷新一次? resp.setHeader("refresh","3"); //在内存中创建图片 BufferedImage image = new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB); //开始画图 Graphics2D g=(Graphics2D) image.getGraphics(); //设置图片背景颜色 g.setBackground(Color.white); g.fillRect(0,0,100,50); //写入验证码 g.setColor(Color.GREEN); g.setFont(new Font(null,Font.ROMAN_BASELINE,20)); g.drawString(makeNumber(),0,25); //高速浏览器,这个请求用图片的方式打开 resp.setContentType("image/png"); //设置不让浏览器缓存图片 resp.setDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Program","no-cache"); //把图片写给浏览器 boolean write = ImageIO.write(image,"png", resp.getOutputStream()); } //生成随机数 private String makeNumber(){ Random r = new Random(); String num=r.nextInt(99999999)+""; StringBuffer sBuffer = new StringBuffer(); for (int i = 0; i < 8-num.length(); i++) { sBuffer.append("x"); } return sBuffer.toString()+num; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }## 好了本篇文章就到这里啦,剩下的便是自行参悟喽 :$(doge)
2022年11月07日
39 阅读
0 评论
3 点赞
2022-11-04
Java-ServletContxt对象及使用
什么是ServletContextWeb容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext对象,这个对象代表当前Web应用。并且它被所有客户端共享(比如你在淘宝登陆了,那你的登陆信息会被带到很多页面,就是跳到其他页面发现也是登陆上的)。ServletContext的应用共享数据 多个Servlet通过ServletContext对象实现数据共享添加属性:setAttribute(String name, Object obj);得到值:getAttribute(String name),这个方法返回Object删除属性:removeAttribute(String name)测试:首先创建一个放置数据的类package com.cheng.servlet; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); String username = "万里顾一程";//数据 context.setAttribute("username", "万里顾一程");//将一个数据保存在ServletContext中,username=万里顾一程 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }注册Servlet<servlet> <servlet-name>hello</servlet-name> <servlet-class>com.cheng.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>然后创建一个接收数据的类package com.cheng.servlet; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class GetServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); String attribute = (String) context.getAttribute("username");//返回值,并类型强转为String resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); resp.getWriter().print("名字="+attribute); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }注册Servlet<servlet> <servlet-name>hello1</servlet-name> <servlet-class>com.cheng.servlet.GetServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello1</servlet-name> <url-pattern>/hello1</url-pattern> </servlet-mapping>启动Tomcat开始测试:启动 HelloServlet 放置数据到ServletContext中启动 GetServlet 从ServletContext中获得数据获取配置的初始化参数在 web.xml 里配置的初始化参数可以用getInitParameter()方法获取<context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/mybatis</param-value> </context-param>写一个实现类package com.cheng.servlet; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ServletDemon03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); String url = context.getInitParameter("url"); resp.getWriter().print(url); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } 注册Servlet<servlet> <servlet-name>hello3</servlet-name> <servlet-class>com.cheng.servlet.ServletDemon03</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello3</servlet-name> <url-pattern>/hello3</url-pattern> </servlet-mapping>运行Tomcat,查看结果请求转发RequestDispatcher 代表请求的派发者。Forward是指内部转发。当一个Servlet处理请求的时候,它可以决定自己不继续处理,而是转发给另一个Servlet处理。例如,我们已经编写了一个能处理 /hello3 的 ServletDemon03 ,继续编写一个能处理 /hello4 的 ServletDemon04 , ServletDemon04 在收到浏览器的请求后,它并不自己发送响应,而是把请求和响应都转发给路径为 /hello3 的 ServletDemon03 ,后续请求的处理实际上是由 ServletDemon03 完成的。这种处理方式称为转发( Forward )流程图如下所示:编些一个实现请求转发的实现类package com.cheng.servlet; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @User len * @Classname com.cheng.servlet.ServletDemon04 * @Project javaweb-01-servlet * @Description TODO * @Author wpcheng * @Create 2021-02-06-18:36 * @Version 1.0 */ public class ServletDemon04 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); //RequestDispatcher 代表请求的派发者, 只能使用绝对路径 RequestDispatcher dispatcher = context.getRequestDispatcher("/hello3");//请求的是地址为/hello3的资源,因此该请求是由路径为/hello3的servlet实现的 dispatcher.forward(req,resp);//内部转发 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }注册路径为/hello4的servlet<servlet> <servlet-name>hello4</servlet-name> <servlet-class>com.cheng.servlet.ServletDemon04</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello4</servlet-name> <url-pattern>/hello4</url-pattern> </servlet-mapping>注册路径为/hello3的servlet<servlet> <servlet-name>hello3</servlet-name> <servlet-class>com.cheng.servlet.ServletDemon03</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello3</servlet-name> <url-pattern>/hello3</url-pattern> </servlet-mapping>启动Tomcat查看转发结果==注:转发是在Web服务器内部完成的,对浏览器来说,它只发出了一个HTTP请求,浏览器的地址栏路径仍然是/hello4,浏览器并不知道该请求在Web服务器内部实际上做了一次转发。==读取资源文件类路径:即发布到Tomcat服务器后的ClassPath路径,在classes目录下Properties可以用来保存属性集(类似Map, 以键值的形式保存数据,不同的是Properties都是String类型的)。这个类的优势是可以从流中获得属性集,或者把属性集报错到流中。获取配置文件的信息username=root password=123456实现类package com.cheng.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class ServletDemon05 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // “ / ”代表了当前工程的根目录 InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/jdbc.properties"); Properties prop = new Properties(); prop.load(is);//下载文件流 String user = prop.getProperty("username");//通过键获取属性 String pwd = prop.getProperty("password"); resp.getWriter().println(user); resp.getWriter().println(pwd); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }注册servlet<servlet> <servlet-name>hello5</servlet-name> <servlet-class>com.cheng.servlet.ServletDemon05</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello5</servlet-name> <url-pattern>/hello5</url-pattern> </servlet-mapping>实现
2022年11月04日
46 阅读
0 评论
3 点赞
1
...
5
6
7
...
10