Cookie
Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问Cookie基本使用
发送Cookie
1.创建Cookie对象,设置数据
Cookie cookie=new Cookie(“key”,“value”);
2.发送Cookie到客户端:使用response对象
response.addCookie(cookie);
获取Cookie
1.获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies = request.getCookies();
2.遍历数组,获取每一个Cookie对象: for
3.使用Cookie对象方法获取数据
cookie.getName();
cookie.getValue();
Cookie原理
Cookie的实现是基于HTTP协议的
响应头: set-cookie
请求头: cookie
Cookie使用细节
Cookie存活时间
默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁
setMaxAge(int seconds):设置Cookie存活时间
1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
2.负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
3.零:删除对应Cookie
Cookie存储中文
Cookie不能直接存储中文
如需要存储,则需要进行转码:URL编码
编码:String value=“张三”;
value = URLEncoder.encode(value, “utf-8”);
解码:value=URLDecoder.decode(value,“utf-8”);
案例
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Objects;
// 用当前这个servlet当做我的主页
@WebServlet(name = "IndexServlet", value = "/index.do")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.获取Cookie
Cookie[] cookies = request.getCookies();
if(Objects.nonNull(cookies) && cookies.length > 0){
System.out.println("发现了cookie...");
// 有cookie的情况
for (Cookie cookie : cookies) {
if(cookie.getName().equals("username")){
response.sendRedirect("success.html");
}
}
} else {
System.out.println("没有发现cookie,创建cookie。。。");
// 创建cookie
String username = request.getParameter("username");
String password = request.getParameter("password");
if(Objects.equals(username,"admin") && Objects.equals(password,"123456")){
Cookie cookie = new Cookie("username",username);
// 设置cookie的最大时效
// cookie.setMaxAge(5000);
// 把cookie放入到响应中
response.addCookie(cookie);
response.sendRedirect("success.html");
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
Session
服务端会话跟踪技术:将数据保存到服务端
JavaEE提供 HttpSession接口,来实现一次会话的多次请求间数据共享功能
使用:
1.获取Session对象
HttpSession session = request.getSession();
2.Session对象功能:
void setAttribute(String name, Object o):存储数据到session域中
Object getAttribute(String name):根据key,获取值
void emoveAttribute(String name):根据key,删除该键值对
Session使用细节
Session钝化、活化:
服务器重启后,Session中的数据是否还在?
钝化:在服务器正常关闭后, Tomcat会自动将Session数据写入硬盘的文件中
活化:再次启动服务器后,从文件中加载数据到Session中
Seesion销毁:
默认情况下,无操作,30分钟自动销毁
<session-config>
<session-timeout>30</session-timeout>
</session-config>
调用Session对象的invalidate()方法
小结
Cookie和Session 都是来完成一次会话内多次请求间数据共享的
区别:
存储位置:Cookie是将数据存储在客户端,Session将数据存储在服务端
安全性:Cookie不安全,Session安全
数据大小: Cookie最大3KB,Session无大小限制
存储时间:Cookie可以长期存储,Session默认30分钟
服务器性能: Cookie不占服务器资源,Session占用服务器资源
Filter 过滤器
- Filter 过滤器它是 JavaWeb 的三大组件之一。
三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器 - Filter 过滤器它是 JavaEE 的规范。也就是接口
- Filter 过滤器它的作用是:拦截请求,过滤响应。
要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源(html 页面、jpg 图片、jsp 文件…等等)都必须是用户登录之后才允许访问。
思考:根据之前我们学过内容。我们知道,用户登录之后都会把用户登录的信息保存到 Session 域中。所以要检查用户是否登录,可以判断 Session 中否包含有用户登录的信息,即可!!!
初始化
在创建Filter对象,在servlet容器(tomcat)加载当前web应用(当前工程)被调用
只执行一次。当前Filter的初始化操作,Filter和Servlet都是单例的。
FilterConfig类似于ServletConfig,获取初始化参数。
import javax.servlet.*;
import java.io.IOException;
public class HelloFilter implements Filter {
/*
初始化
在创建Filter对象,在servlet容器(tomcat)加载当前web应用(当前工程)被调用
只执行一次。当前Filter的初始化操作,Filter和Servlet都是单例的。
FilterConfig类似于ServletConfig,获取初始化参数。
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/*
主要过滤请求的方法(核心方法)
真正Filter要处理的逻辑代码需要写在此方法里,每次拦截都会调用这个方法。
ServletRequest:实际上当请求来的时候,实例化的还是HttpServletRequest
ServletResponse:实际上当请求来的时候,实例化的还是HttpServletResponse
FilterChain:过滤器链,一个项目中是可以有多个过滤器的,会形成一个链,当前过滤器把请求传递给下一个过滤器
Filter的执行顺序:
filter-mapping的上下顺序有关
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("HelloFilter....");
// 放行请求
filterChain.doFilter(servletRequest,servletResponse);
}
/*销毁*/
@Override
public void destroy() {
// System.out.println("Filter's destroy....");
}
}
监听器 listener
监听器:
专门用于对其他对象身上发生的事件或状态改变进行监听和相应的处理
分类:
1、监听域对象自身的创建和销毁
2、监听域对象中属性的增加和删除
3、监听绑定到session中的某个对象的状态的事件监听
JavaEE(servlet)三大件:
servlet filter listener