目录
Cookie/session:
过滤器(Filter)、监听器(listener)
Cookie简介
HTTP不能保存各种状态,简而言之他是一次性的。
像我们做网站,登录的时候,点击保存密码,自动登录等,是要一直或者一段时间内存在的,但也不能一直存在,他也需要有一个失效期,要不然计算机储存的数据会越来越多。这个时候就需要cookie
Cookie是一些数据,储存于你电脑上的文本文件中。保存HTTP状态,以键值对的形式存储在浏览器中。当下一次用户访问该网页的时候,可以在cookie里获取到之前储存的值(访问记录)
使用cookie的步骤:
1.创建cookie
Cookie cookie = new Cookie("name","admin");
2.设置最大时效
cookie.setMaxAge(1000);
3.把cookie放到响应头中
resp.addCookie(cookie);
那怎么使用cookie呢:
cookie是用于客户端浏览器的,那肯定是需要用servlet
我们根据真实情况来写一个使用cookie的实例:
首先肯定是在servlet里:doGet/doPost方法
获取网页传来的cookie:
Cookie[] cookies = req.getCookies();
判断这个cookie到底有没有值,有值得话就代表访问过,没有就代表没有
if(Objects.nonNull(cookies) && cookies.length>0){
//有
}else{
//没有cookie
}
代码:如果有获取key和value,如果没有就发一个
//1.获取cookie
Cookie[] cookies = req.getCookies();
if(Objects.nonNull(cookies) && cookies.length>0){
//有cookie的情况(之前登陆过)
System.out.println("发现了");
for (Cookie cookie : cookies) {
System.out.println(cookie.getName()+"->"+cookie.getValue())
}
}else{
//没有登陆过
System.out.println("没有发现cookie");
//创建cookie
Cookie cookie = new Cookie("name", "admin");
//设置最大时效
cookie.setMaxAge(8000);
//把cookie放到响应头中
resp.addCookie(cookie);
}
那我们做一个自动登录的例子:
继承HttpServlet
@WebServlet("/cookie.do")
public class cookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
if(Objects.equals(username,"admin") && Objects.equals(password,"123456")){
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(1000*24*60);
resp.addCookie(cookie);
}else{
username=null;
Cookie[] cookies = req.getCookies();
if(Objects.nonNull(cookies) && cookies.length>0){
for (Cookie cookie : cookies) {
String name =cookie.getName();
if("username".equals(name)){
String va=cookie.getValue();
username=va;
}
}
}
}
if(Objects.nonNull(username)){
resp.sendRedirect("success.html");
}else{
resp.sendRedirect("cookie.html");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="cookie.do" method="post">
账户:<input type="text" name="username">
密码:<input type="text" name="password">
<input type="submit" value="走你">
</form>
</body>
</html>
session会话
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
session和cookie的区别:
- Cookie是把用户的数据写给用户的浏览器。
- Session技术把用户的数据写到用户独占的session中(后台)。
- Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
session使用
获取session会话
HttpSession session = req.getSession();
把username放入session中
session.setAttribute("username",username);
让session销毁
session.invalidate();
设置session过期时间
session.setMaxInactiveInterval(3000);
根据key的值删除对应的属性
session.removeAttribute("");
session中的数据什么时候会失效:
- 过期了
- 关闭浏览器(并不能完全的销毁session,JSESSIONID,根据JSESSIONID找到之前的session的)
- 调用session销毁的方法
Filter是什么?
1、JavaWEB的一个重要组件,可以对发送到servlet的请求进行拦截过滤,也可以对响应进行拦截。
2、Filter是实现了Filter接口的Java类
3、Filter需要在web.xml中进行注册,也可以通过注解来注册。
怎么创建一个Filter一只需要创建的一个类,实现Filter接口并重写方法即可。
@WebServlet("/uu.do")----对那个进行拦截如果要对所有进行拦截:("/*")
@WebServlet("/uu.do")
public class Hello implements Filter {
//初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
//主要过滤请求的方法
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
//销毁
@Override
public void destroy() {
Filter.super.destroy();
}
}
这就是一个生命周期:初始化/过滤请求/销毁
在xml里注册filter
<filter>
<filter-name>u</filter-name>
<filter-class>UserNameFilter</filter-class>
</filter>
<!-- 配置过滤器过滤拦截什么请求-->
<filter-mapping>
<filter-name>u</filter-name>
<!-- //对什么请求进行过滤-->
<url-pattern>/uu.do</url-pattern>
</filter-mapping>
初始化:
在创建Filter对象的时候,在servlet容器里(tomcat),加载当前web应用(当前工程)被调用只执行一次,当前Filter的初始化请求。Filter和servlet都是单例的。FilterConfig类似于ServletConfig,获取初始化参数
主要过滤请求的方法:(核心)
真正Filter要处理的逻辑代码需要写在此方法里,每次拦截都会调用这个方法。
ServletRequest:实际上当请求来的时候,实例化的还是HTTPServletRequest
ServletResponse:实际上当请求来的时候,实例化的还是HTTPServletResponse
FilterChain:过滤器链,一个项目中可以有多个过滤器,既然有多个,就会产生顺序,有顺序,就形成了链,把当前请求传给下一个
Filter顺序: 跟web.xml里的filter-mapping的顺序有关
过滤请求已经通过方法捕获到了,但是不能说,捕获到就不走了,我们是要进行判定等操作,如果条件允许,我们还是会让他通过的:
我们看到doFilter方法里,有三个参数,前两个咱们都认识,那第三个呢,欸,我们传输就用第三个参数:
filterChain.doFilter(servletRequest,servletResponse);
这就是传输给下一位,我的理解就是给他个通行证,让方法放行。
监听器 listener
专门用于对其他对象身上发生的事件或状态改变进行监听和相应的处理
主要监听作用域的对象的改变
监听器监听的是域对象,不是监听对象的某个地址
JavaEE(servlet)三大件
servlet、filter、listener
监听器的分类
监听域对象自身的创建和销毁
public class HelloListener implements HttpSessionListener, ServletRequestListener, ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContextListener.super.contextInitialized(sce);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
ServletContextListener.super.contextDestroyed(sce);
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
ServletRequestListener.super.requestDestroyed(sre);
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
ServletRequestListener.super.requestInitialized(sre);
}
@Override
public void sessionCreated(HttpSessionEvent se) {
HttpSessionListener.super.sessionCreated(se);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
HttpSessionListener.super.sessionDestroyed(se);
}
}
监听域对象中属性的增加和删除
@WebListener
public class HelloAttributeListener implements ServletContextAttributeListener, ServletRequestAttributeListener, HttpSessionAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
ServletContextAttributeListener.super.attributeAdded(scae);
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
ServletContextAttributeListener.super.attributeRemoved(scae);
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
ServletContextAttributeListener.super.attributeReplaced(scae);
}
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
ServletRequestAttributeListener.super.attributeAdded(srae);
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
ServletRequestAttributeListener.super.attributeRemoved(srae);
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
ServletRequestAttributeListener.super.attributeReplaced(srae);
}
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
HttpSessionAttributeListener.super.attributeAdded(se);
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
HttpSessionAttributeListener.super.attributeRemoved(se);
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
HttpSessionAttributeListener.super.attributeReplaced(se);
}
}
监听绑定到session中的某个对象的状态的事件监听
public class HelloSessionListener implements HttpSessionActivationListener {
//在钝化之前被调用
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
HttpSessionActivationListener.super.sessionWillPassivate(se);
}
//在活化之后被调用
@Override
public void sessionDidActivate(HttpSessionEvent se) {
HttpSessionActivationListener.super.sessionDidActivate(se);
}
}
活化:从磁盘中读取session对象
钝化:向磁盘中写入session对象
@WebListener注解加上以后才可以监听域对象
配置监听器
注解:@WebListener
xml配置:
<listener>
<listener-class>afternoon.listener.HelloListener</listener-class>
</listener>
总结
今天学习了cookie/session了解了浏览器数据分别保存 客户端、服务的,session的能将数据更好的保存。Filter/listener分别是 过滤器、监听器,过滤掉不符合要求的数据。使用session和Filter结合可以更好的处理数据