Cookie、Session、Filter过滤器
01 Cookie
/*
概念:客户端(前端)记录的服务器(后端)发来的数据,在请求头中
特点:Cookie通过在客户端记录信息确定用户身份,而Session通过在服务器端记录信息确定用户身份
优点:客户端可以保存一些运行信息
*/
//使用步骤
//1. 创建cookie对象
new Cookie(String name, String value)
//2. 发送cookie对象
response.addCookie(Cookie cookie)
//3. 获取cookie对象,拿到数据
Cookie[] cookies = request.getCookies()
//4. 设置Cookie时效
cookie.setMaxAge(60 * 60);//(一小时)
/* 设置Cookie时效中的数字,单位为毫秒
正数:cookie数据写入磁盘中,持久化存储 cookie.setMaxAge(60)。
负数:默认,当浏览器关闭的时候,cookie被销毁。
0:删除cookie信息。
*/
02 Session
/*
概念:Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器中
器上
特点:每一台浏览器都是独立的客户端,即使是同一电脑
优点:更安全,客户端信息泄露风险高
Session是依赖于Cookie的,当服务端创建session时,服务端在响应的时候会通知客户端把seesion id存储在cookie,后续的请求会在请求头里面会携带上cookie中的数据,服务端获取cookie携带的session id之后从session映射区里面获取对应的数据进行其他的操作
*/
//使用步骤
//1. 获取session对象
HttpSession session = request.getSession();
//设置数据
session.setAttribute(键, 值);
//3. 手动设置JSESSIONID,可以设置cookie时效性
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
/*注意:
1. Session是依赖于Cookie
2. 当客户端关闭后,服务器不关闭,两次获取的sessionid默认是不一样的,如果需要相同,可以创建cookie,键为JSESSIONID。
3. 客户端没关闭,服务器关闭后,两次获取的sessionid默认不一样
*/
cookie和session的区别:
/*
1. session用于存储一次会话的多次请求的数据,存在服务端。
2. session可以存储任意类型,任意大小的数据。
3. session数据存在服务端,cookie存在客户端。
4. session没有数据大小限制,cookie有。
5. session数据安全,cookie相对不安全。
*/
/*场景:使用不同账号登录系统,返回的个人信息数据应该是不一样的。
打开两个不同的浏览器
*/
// 登录接口
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
HttpSession session = req.getSession();
session.setAttribute("username", username);
resp.setContentType("text/plain;charset=utf8");
// 这里假设账号密码没有问题,直接返回登录成功
resp.getWriter().write("登录成功");
}
}
// 获取用户信息
@WebServlet("/userinfo")
public class UserInfoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
HttpSession session = req.getSession();
String username = (String)session.getAttribute("username");
resp.setContentType("text/plain;charset=utf8");
resp.getWriter().write(username);
}
}
03 Filter过滤器
/*使用步骤
1. 定义一个类,实现接口javax.servlet.Filter。
2. 重写方法。
3. doFilter方法实现通用操作。
4. 配置拦截路径。
*/
//第一种:web.xml配置
<filter>
<filter-name>demo</filter-name>
<filter-class>com.test.web</filter-class>
</filter>
<filter-mapping>
<filter-name>demo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
//第二种:使用注解
@WebFilter("路径")
/*统一处理请求编码格式代码如下:*/
@WebFilter("/*")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {//初始化化文件过滤器
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 统一设置请求编码格式
servletRequest.setCharacterEncoding("utf8");
// 放行,不然就卡在这里了
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy()
{//销毁文件过滤器
}
}
04 Listener
/*
概念:监听器用于监听web应用中某些对象、信息的创建、销毁、增加、修改、删除等动作的发生,然后作出响应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法
特点:一定被标记的事件出现程序自动执行
优点:减少重复代码,自动检索
*/
/*ServletContext对象监听器
监听web上下文的初始化(服务器已经准备好接收请求)与销毁,通常用来加载框架的配置文件。
*/
//1.注解
@WebListener
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub,待办事项自动生成的方法存根,系统自动生成,无特殊意义的注解
// 用来加载框架xml配置文件
System.out.println("Servlet初始化");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
}
//2.web.xml配置
<listener>
<listener-class>com.test.web.MyListener</listener-class>
</listener>
/*其他监听器
1. HttpSession对象监听器:监听session建立于销毁
2. HttpSessionAttributeListener:监听session属性的增加、移除、以及属性值得改变
3. ServletRequest对象监听器:监听request的创建于销毁
*/监听器仅做介绍,后续深入学习