1.会话概述
用户打开浏览器,点击了很多个url,访问了多个web资源,关闭浏览器,这个过程就是会话
1.1网站怎么证明你来过
- Cookie服务端会给客户端发一个
信件
客户端下次再访问服务端携带信件
即可 - Session服务端对客户端做标记,下次客户端再访问,通过标记即可匹配
1.2Cookie和session区别
- Cookie把数据写给用户的浏览器保存(可保存多个)
- Session把数据写给用户自己独有的SessionId
- Server保存(保存重要的信息,减少Server资源浪费),Session由服务器创建
- Cookie的构造器只能携带String类型参数,而Session可携带Object类型参数
2.Cookie
//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创建
//获取一个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
HttpSession session = req.getSession();
session.getAttribute("name");
//把获取的数据响应到前端页面
PrintWriter out = resp.getWriter();
out.print(name)
停止session
//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>");
//2.通过xml
<session-config>
<!--设置session的失效时间 单位/min-->
<session-timeout>1</session-timeout>
</session-config>
4.Filter
- 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理。
- 通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理
- 应用场景:自动登录,统一设置编码格式,访问权限控制,敏感字符过滤等
4.1统一编码
//一个类实现了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>下写需要过滤的路径