JavaWeb 笔记总结

Posted IT_Holmes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb 笔记总结相关的知识,希望对你有一定的参考价值。

1.Cookie 饼干


  • Cookie 是服务器通知客户端保存键值对的一种技术。
  • cookie是servlet发送到Web浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器。cookie的值可以唯一地标识客户端,因此cookie常用语会话管理。
  • 户端有了cookie后,每次请求都会把cookie发送给服务器端。
  • 每个cookie的大小不能超过4kb。

会话:一次会话中包含多次请求和响应。

客户端会话技术:Cookie

服务端会话技术:session

2. Cookie 使用


概念: 客户端会话技术,将数据保存到客户端。

Cookie是键值对形式存在,通常存储请求头中。

使用步骤:

  • 服务器端创建Cookie对象,指定数据。

    • Cookie cookie = new Cookie(String name , String value);//创建Cookie
  • 服务器端发送Cookie对象,给客户端。

    • response.addCookie(cookie);//发送Cookie给客户端。
  • 客户端发送数据时,也发送Cookie,给服务器端。

    • Cookie[] cookieArr = request.getCookies();//获得cookie数组

例如:

创建一个CookieDemo1,用来发送cookie给客户端。

package com.cookie;

import java.io.IOException;
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("/cookieDemo1")
public class CookieDemo1 extends HttpServlet
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		//1.创建Cookie对象
		Cookie cookie = new Cookie("msg","hello");
		//2.发送Cookie
		resp.addCookie(cookie);
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		// TODO Auto-generated method stub
		this.doGet(req, resp);
	

在创建一个CookieDemo2,用来测试接受客户端发送过来的cookie。

package com.cookie;

import java.io.IOException;
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("/cookieDemo2")
public class CookieDemo2 extends HttpServlet
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		//3.获取Cookie
		Cookie[] cookies = req.getCookies();
		
		//根据数据,遍历Cookies
		if(cookies != null) 
			for(Cookie c:cookies) 
				String name = c.getName();
				String value = c.getValue();
				System.out.println(name+":"+value);
			
		
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		// TODO Auto-generated method stub
		this.doGet(req, resp);
	

我们访问/cookieDemo1,再访问/cookieDemo2,就发现内容已经被打印,返回了cookie名和值,因为处在同一会话中,客户端已经存储了cookie值。

3. Cookie 原理分析


服务器端向客户端发送cookie,通过响应头的set-cookie:key=value来发送。

客户端向服务端发送cookie,通过请求头的cookie:key=value来发送。

4. cookie的细节处理

4.1 一次发送多个cookie


发送多个cookie,那就多调动addCookie方法来呗。

package com.cookie;

import java.io.IOException;

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("/cookieDemo1")
public class CookieDemo1 extends HttpServlet
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		
		Cookie cookie1 = new Cookie("msg","hello");
		Cookie cookie2 = new Cookie("name","zhangsan");
		
		//可以发送多个cookie
		resp.addCookie(cookie1);
		resp.addCookie(cookie2);
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		// TODO Auto-generated method stub
		this.doGet(req, resp);
	

4.2 Cookie 存活时间


默认情况下,当浏览器关闭后,Cookie数据被销毁。

当然,我们可以持久化存储cookie: 通过setMaxAge(int seconds) 方法。

setMaxAge(int seconds):

  • 正数:将Cookie数据写到硬盘的文件中。持久化存储。cookie存活时间。
  • 负数:负数就代表默认值。
  • 零:服务器端想要删除客户端的cookie信息,就定义为零,就删除cookie信息。
package com.cookie;

import java.io.IOException;

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("/cookieDemo1")
public class CookieDemo1 extends HttpServlet
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		
		Cookie cookie1 = new Cookie("msg","hello");
		
		//将Cookie数据写到硬盘的文件中,30秒之内会删除cookie
		//cookie1.setMaxAge(30);
		
		//默认
		//cookie1.setMaxAge(-1);
		
		//删除cookie信息
		cookie1.setMaxAge(0);
		resp.addCookie(cookie1);

	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		// TODO Auto-generated method stub
		this.doGet(req, resp);
	

4.3 cookie 能不能存储中文?


tomcat 8之前,cookie是不能支持存储中文数据的。

  • 那么tomcat 8之前,我们一般采用url编码或base64编码来存储中文进行发送。

tomcat 8之后,cookie支持中文数据。

4.4 cookie 的范围


一个tomcat服务器,部署了多个web项目,那么这些web项目中的cookie能不能共享?

默认情况下,cookie是不能共享的。

setPath(String path): 设置cookie的范围取值。默认情况下,设置当前的虚拟目录。

如果要共享,则可以将path设置为" / "(范围大一点),就是http://localhost:8080/ ,以后的路径,都可以共享这个cookie。


不同的tomcat服务器cookie共享问题?

setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享。

setDomain(".baidu.com") , 那么tieba.baidu.com和new.baidu.com中cookie可以共享。

5. Cookie的特点和作用


cookie的特点:

  • cookie存储数据在客户端浏览器。
  • 浏览器对于单个cookie的大小有限制(4kb)以及对同一个域名下的总cookie数量也有限制(一般20个)。

cookie的作用:

  • cookie一般用于存储少量的不太敏感的数据。
  • 在不登录的情况下,完成服务器对客户端的身份识别。

6. Session 会话


Session就是一个接口(HttpSession)。

Session就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。

每个客户端都有自己的一个Session会话。

Session会话中,我们经常用来保存用户登录之后的信息,是在服务器端的。

7.如何创建Session?


在Servlet中,我们有request这样的api参数。

因此,我们直接可以使用request.getSession()方法来创建。

主要注意第一次调用是:创建Session会话,以后调用便是获取第一次创建的Session会话了。

如果我们想要判断当前的Session是不是刚刚创建出来的,官方给出了一个isNew()的方法,来判断是不是刚刚创建出来的Session。


每个Session会话都有一个id值,这个id是唯一的!

通过getId()方法来得到Session的会话id值。

package com.test.day02;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet(value="/session1")
public class HttpSessionTest extends HttpServlet
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		// TODO Auto-generated method stub
		
		//创建session会话,一个会话只会创建一次,往后调用都只调用该会话一次。
		HttpSession session = req.getSession();
		
		//session.isNew()方法:判断是不是刚刚创建的session会话
		boolean new1 = session.isNew();
		System.out.println(new1);
		
		String id = session.getId();
		System.out.println(id);
		
		System.out.println();
		
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		// TODO Auto-generated method stub
		this.doGet(req, resp);
	


8. Session 域对象存储数据


既然存域对象数据,肯定调用setAttribute()方法啥的。

package com.test.day02;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet(value="/session1")
public class HttpSessionTest extends HttpServlet
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		// TODO Auto-generated method stub
		
		//创建session会话,一个会话只会创建一次,往后调用都只调用该会话一次。
		HttpSession session = req.getSession();
		
		session.setAttribute("key1", "value1");
		
		Object attribute = session.getAttribute("key1");
		
		System.out.println();
		
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		// TODO Auto-generated method stub
		this.doGet(req, resp);
	

9. Session 生命周期控制


设置Session的超时时长,超过指定的时长,Session就会被销毁。这里是以秒为单位的

session.setMaxInactiveInterval(1000);

获取Session的超时时长,如果设置超时时长它是有默认时长的(默认时长为1800秒,也就是30分钟,这个是可以修改的可以去tomcat服务器web.xml去配置默认时长)。

int maxInactiveInterval = session.getMaxInactiveInterval();

tomcat默认session超时时长的web.xml配置:

在服务端,如果session在规定的超时时间内,还没有接受到该session的请求,一旦超时它就会被删除。

如果在超时时间内接受到请求了,那么超时时长就会重新计时,原理就这么简单。

再就是如果超时时长设置为负数,那么它就永远不超时。


还有一个invalidate()方法,该方法作用就是让当前session会话马上超时无效。

package com.test.day02;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet(value="/session1")
public class HttpSessionTest extends HttpServlet
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		// TODO Auto-generated method stub
		
		//创建session会话,一个会话只会创建一次,往后调用都只调用该会话一次。
		HttpSession session = req.getSession();
		
		//session.isNew()方法:判断是不是刚刚创建的session会话
		boolean new1 = session.isNew();
		System.out.println(new1);
		
		String id = session.getId();
		System.out.println(id);
		
		session.setAttribute("key1", "value1");
		
		Object attribute = session.getAttribute("key1");
		
		//设置Session的超时时长,超过指定的时长,Session就会被销毁。这里是以秒为单位的
		//session.setMaxInactiveInterval(1000);
		
		//获取Session的超时时长,如果设置超时时长它是有默认时长的(默认时长为1800秒,也就是30分钟,这个是可以修改的可以去tomcat服务器web.xml去配置默认时长)。
		int maxInactiveInterval = session.getMaxInactiveInterval();
		
		//让session会话,立刻超时!
		session.invalidate();
		resp.getWriter().write("session已经被设置为超时了");
		
		System.out.println();
		
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		// TODO Auto-generated method stub
		this.doGet(req, resp);
	


10. Session 和 浏览器 之间有什么关联



其实,服务器端第一次创建session对象时,它会创建一个cookie对象,对象的键为:JSESSIONID,值为:新创建出来的Session的id值。

换句话说,session技术,底层其实是基于cookie技术来实现的。

11. Filter 过滤器


Filter过滤器是JavaWeb的三大组件之一。

Filter过滤器它是JavaEE的规范,也就是接口。

Filter过滤器的作用就是: 拦截请求,过滤响应。

常见操作:

  • 自动登录
  • 统一设置编码格式
  • 访问权限控制
  • 敏感字符过滤等。

12. Filter 的使用


步骤:

  • 1.定义一个类,实现接口Filter(javax.servlet.Filter下的)。
  • 2.重写方法。
  • 3.配置拦截路径。

一次请求中,要经过两次过滤拦截,进来时,过滤一次;发送响应数据过滤一次。

简单注解使用:

package com.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

//注解用法 , " /* "访问所有资源都要执行该过滤器。
@WebFilter("/*") 
public class FilterDemo01 implements Filter 

	@Override
	public void init(FilterConfig filterConfig) throws ServletException 
	

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException 

		System.out.println("Filter被执行了")JavaWeb学习笔记总结 目录篇

JavaWeb笔记总结

[硬核]卷起来!两万六千字总结的JavaWeb核心技术学习笔记

JavaWeb 笔记总结

JavaWeb Servlet 学习笔记总结( 一 )

JavaWeb 学习笔记总结( 二 )