Web会话层

1.会话概述

用户打开浏览器,点击了很多个url,访问了多个web资源,关闭浏览器,这个过程就是会话

1.1网站怎么证明你来过

  • Cookie服务端会给客户端发一个信件 客户端下次再访问服务端携带信件即可
  • Session服务端对客户端做标记,下次客户端再访问,通过标记即可匹配

1.2Cookie和session区别

  • Cookie把数据写给用户的浏览器保存(可保存多个)
  • Session把数据写给用户自己独有的SessionId
  • Server保存(保存重要的信息,减少Server资源浪费),Session由服务器创建
  • Cookie的构造器只能携带String类型参数,而Session可携带Object类型参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//1.传给客户端一个cookie
Cookie cookie = new Cookie("name", "携带参数");
//设置cookie有效期 单位/s
cookie.setMaxAge(600);
resp.addCookie(cookie);

//2.从客户端获取cookie
Cookie[] cookies = req.getCookies();

//3.获取客户端cookie里携带的参数
PrintWriter out = resp.getWriter();
if (cookies != null){
out.write(cookie.getValue());
}else {
out.write("cookie 不存在");
}
//需要强制停止cookie时候,只需新建一个实现了servlet的类
//再响应一个setMaxAge为0的cookie到客户端即可
//两个cookie的构造器形参要相同

3.Session

session创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//获取一个session
HttpSession session = req.getSession();
//session可以携带Object类型
session.setAttribute("name",new JavaBean("李华",29));

//每个session都有自己唯一的sessionID
String id = session.getId();
PrintWriter writer = resp.getWriter();

//通过inNew()判断此session的新旧
if (session.isNew()){
writer.print("create success!"+id);
}else {
writer.print("session is already!"+id);
}

获取session

1
2
3
4
5
HttpSession session = req.getSession();
session.getAttribute("name");
//把获取的数据响应到前端页面
PrintWriter out = resp.getWriter();
out.print(name)

停止session

1
2
3
4
5
6
7
//1.手动停止(新建一个类调用invalidate方法)
HttpSession session = req.getSession();
//移除session参数
session.removeAttribute("name");
session.invalidate();
PrintWriter out = resp.getWriter();
out.print("<H1>session remove success please refresh</H1>");
1
2
3
4
5
//2.通过xml
<session-config>
<!--设置session的失效时间 单位/min-->
<session-timeout>1</session-timeout>
</session-config>

4.Filter

  • 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理。
  • 通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理
  • 应用场景:自动登录,统一设置编码格式,访问权限控制,敏感字符过滤等

4.1统一编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//一个类实现了Filter且实现它的方法就成了一个过滤器
public class FilterBasic implements Filter {
@Override
public void init(FilterConfig filterConfig){
//会在服务器启动的同时触发
System.out.println("web server init");
}

//主要是对request和response进行一些处理
//然后交给下一个过滤器或Servlet处理
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain fc){
//解决乱码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//后面可能会有其他的过滤器,保过滤器继续同行
fc.doFilter(req,resp);
}

//当服务器关闭过滤器即销毁
@Override
public void destroy() {
System.out.println("filter destroyed");
}
}
//此类需要在web.xml中进行注册
//<filter>和<filter-Mapping>标签
//<url-patterns>下写需要过滤的路径

5.MVC整体结构

MVC架构图


Web会话层
http://example.com/2022/07/12/JavaWeb/会话层面/
Author
John Doe
Posted on
July 12, 2022
Licensed under