第2章-第3节
一、知识点
Cookie、Session、Filter过滤器、Listener。
二、目标
-
理解Cookie和Session的区别。
-
掌握Cookie和Session的基本用法。
-
理解Filter过滤器的作用。
三、内容分析
-
重点
-
理解Cookie和Session的区别。
-
掌握Cookie和Session的基本用法。
-
理解Filter过滤器的作用。
-
-
难点
-
理解Cookie和Session的区别。
-
四、内容
1、Cookie
Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
1.1 工作原理
客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等较验。
1.2 使用步骤
-
创建cookie对象
new Cookie(String name, String value)
-
发送cookie对象
(默认cookie的有效时间是整个浏览器关闭后才会销毁,哪怕服务器重启也不会没掉)
response.addCookie(Cookie cookie)
-
获取cookie对象,拿到数据
Cookie[] cookies = request.getCookies()
-
设置Cookie时效(单位:秒)(哪怕浏览器关闭了、电脑关闭了,只要时间没到,cookie就不会销毁)
-
正数:cookie数据写入磁盘中,持久化存储 cookie.setMaxAge(60)。
cookie.setMaxAge(60)
-
- 负数:默认,当浏览器关闭的时候,cookie被销毁。
- 0:删除cookie信息。
2、Session
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。
2.1 工作原理
Session是依赖于Cookie的,当服务端创建session时,服务端在响应的时候会通知客户端把seesion id存储在cookie,后续的请求会在请求头里面会携带上cookie中的数据,服务端获取cookie携带的session id之后从session映射区里面获取对应的数据进行其他的操作。
2.2 使用步骤
-
获取session对象
HttpSession session = request.getSession();
-
设置数据
session.setAttribute(键, 值);
-
手动设置JSESSIONID,可以设置cookie时效性
Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setMaxAge(60 * 60); response.addCookie(cookie);
注意:
-
Session是依赖于Cookie。
-
当客户端关闭后,服务器不关闭,两次获取的sessionid默认是不一样的,如果需要相同,可以创建cookie,键为JSESSIONID。
-
客户端没关闭,服务器关闭后,两次获取的sessionid默认不一样。
2.3 cookie和session的区别
-
session用于存储一次会话的多次请求的数据,存在服务端。
-
session可以存储任意类型,任意大小的数据。
-
session数据存在服务端,cookie存在客户端。
-
session没有数据大小限制,cookie有(一般是2K)。
-
session数据安全,cookie相对不安全。
2.4 案例
场景:使用不同账号登录系统,返回的个人信息数据应该是不一样的。
打开两个不同的浏览器;
浏览器1:先调用http://localhost:8080/web/login?username=张三&password=123,再调用http://localhost:8080/web/userinfo,页面显示【张三】。
浏览器2:先调用http://localhost:8080/web/login?username=李四&password=123,再调用http://localhost:8080/web/userinfo,页面显示【李四】。
// 登录接口
@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);
}
}
3、Filter过滤器
访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊功能。比如可以用于完成通用的操作,如:登录验证、统一编码处理、敏感字符过滤等等。
3.1 使用步骤
-
定义一个类,实现接口javax.servlet.Filter。
-
重写方法。
-
doFilter方法实现通用操作。
-
配置拦截路径。
-
第一种: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("路径")
-
3.2 应用示例
统一处理请求编码格式代码如下:
@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() {
}
}
4、Listener
监听器用于监听web应用中某些对象、信息的创建、销毁、增加、修改、删除等动作的发生,然后作出响应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。
4.1 ServletContext对象监听器
监听web上下文的初始化(服务器已经准备好接收请求)与销毁,通常用来加载框架的配置文件。
-
注解
@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 } }
-
web.xml配置
<listener> <listener-class>com.test.web.MyListener</listener-class> </listener>
4.2 其他监听器
-
HttpSession对象监听器:监听session建立与销毁
-
HttpSessionAttributeListener:监听session属性的增加、移除、以及属性值得改变
-
ServletRequest对象监听器:监听request的创建于销毁
5、解决跨域问题
resp.setHeader("Access-Control-Allow-Origin", "*");
resp.setHeader("Access-Control-Allow-Methods", "*");
resp.setHeader("Access-Control-Max-Age", "3600");
resp.setHeader("Access-Control-Allow-Headers", "*");