Cookie Session Filter Listener

大部分来自柏码和韩顺平

Cookie Session Filter Listener

Cookie

简介

  • Cookie浏览器端

在这里插入图片描述

常用方法

// 在Servlet的doGet或doPost方法中
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 创建一个Cookie对象
        Cookie myCookie = new Cookie("user", "JohnDoe"); // 设置name为"user",value为"JohnDoe"

        // 设置Cookie过期时间为24小时后
        myCookie.setMaxAge(60*60*24); // 24小时

        // 设置Cookie仅通过安全协议传输
        myCookie.setSecure(true); // 仅用于HTTPS

        // 设置Cookie的路径
        myCookie.setPath("/app"); // 只有/app路径下的页面可以访问这个Cookie

        // 设置Cookie的域
        myCookie.setDomain(".example.com"); // example.com及其所有子域名可以访问这个Cookie

        // 设置Cookie的注释
        myCookie.setComment("User identification cookie"); // 注释

        // 设置Cookie的版本
        myCookie.setVersion(1); // RFC 2109规范

        // 将Cookie添加到响应中
        response.addCookie(myCookie);

        // ... 其他响应处理代码 ...
        }

Session

简介

  • Session服务器端

在这里插入图片描述
在这里插入图片描述

常用方法

  • 获取会话
// 获取或创建一个新会话
HttpSession session = request.getSession();

// 获取会话,如果当前请求没有会话,则不创建新会话
HttpSession session = request.getSession(false);
  • 设置和获取会话属性
// 设置会话属性
session.setAttribute("username", "user1");

// 获取会话属性
String username = (String) session.getAttribute("username");

// 移除会话属性
session.removeAttribute("username");
  • 检查会话是否新建
// 检查会话是否是新的
boolean isNew = session.isNew();
  • 获取会话ID
// 获取会话ID
String sessionId = session.getId();
  • 设置会话的最大不活动间隔
// 设置会话在30分钟无活动后过期
session.setMaxInactiveInterval(30 * 60);
  • 获取会话的最大不活动间隔
// 获取会话的最大不活动时间间隔
int maxInactiveInterval = session.getMaxInactiveInterval();
  • 使会话无效
// 注销用户时使会话无效
session.invalidate();

session的时间配置

  • 通过web.xml配置,和<servlet>的等级一样
<session-config>
    <session-timeout>1</session-timeout>
</session-config>

Filter

@WebFilter("/*")   //路径的匹配规则和Servlet一致,这里表示匹配所有请求
public class TestFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        
    }
}

链式传递

在这里插入图片描述

HttpFilter(主要用这个)

这个更常用,我们直接用requestresponse,不用强转

@WebFilter("/*")
public class MainFilter extends HttpFilter {
    @Override
    protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
        String url = req.getRequestURL().toString();
        //判断是否为静态资源
        if(!url.endsWith(".js") && !url.endsWith(".css") && !url.endsWith(".png")){
            HttpSession session = req.getSession();
            User user = (User) session.getAttribute("user");
            //判断是否未登陆
            if(user == null && !url.endsWith("login")){
                res.sendRedirect("login");
                return;
            }
        }
        //交给过滤链处理
        chain.doFilter(req, res);
    }
}

Cookie +Session + Filter

在这个例子中,AuthFilter过滤器确保所有对/main的请求都经过验证。如果用户没有登录,他们会被重定向到登录页面。如果用户已经登录(在Session或Cookie中找到了用户信息),请求将继续进行。

LoginServlet.java

这个Servlet处理登录请求,设置Session和Cookie。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取用户输入的凭证
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 简单的登录验证逻辑(在实际应用中应该查询数据库)
        if ("admin".equals(username) && "password".equals(password)) {
            // 用户登录成功,创建Session
            HttpSession session = request.getSession();
            session.setAttribute("username", username);

            // 创建Cookie以记住用户登录状态
            Cookie loginCookie = new Cookie("user", username);
            // 设置Cookie的有效期为30天
            loginCookie.setMaxAge(30 * 24 * 60 * 60);
            response.addCookie(loginCookie);

            // 重定向到main页面
            response.sendRedirect("main");
        } else {
            // 登录失败,重定向回登录页面
            response.sendRedirect("login?error=true");
        }
    }
}

MainServlet.java

这个Servlet处理对main页面的访问,确保用户已经登录。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/main")
public class MainServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 检查Session或Cookie以确认登录状态
        HttpSession session = request.getSession(false);
        String user = null;
        if (session != null) {
            user = (String) session.getAttribute("username");
        } else {
            // 检查Cookie
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    if ("user".equals(cookie.getName())) {
                        user = cookie.getValue();
                        break;
                    }
                }
            }
        }

        if (user == null) {
            // 用户未登录,重定向到登录页面
            response.sendRedirect("login");
        } else {
            // 用户已登录,显示main页面
            response.setContentType("text/html");
            response.getWriter().println("<h1>Welcome to Main Page, " + user + "!</h1>");
        }
    }
}

AuthFilter.java

这是一个过滤器,它会拦截对main页面的请求,并检查用户是否已登录。

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebFilter("/main")
public class AuthFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        HttpSession session = request.getSession(false);
        String user = null;

        if (session != null && session.getAttribute("username") != null) {
            user = (String) session.getAttribute("username");
        } else {
            // 检查Cookie
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    if ("user".equals(cookie.getName())) {
                        user = cookie.getValue();
                        break;
                    }
                }
            }
        }

        if (user == null) {
            response.sendRedirect("login");
        } else {
            chain.doFilter(req, res); // 用户已登录,继续请求的处理
        }
    }
}

Listener(了解即可)

  • 监听器是一个对象,用于监听某个事件是否发生,如果这个事件发生了,监听器就会自动执行相应的方法。
@WebListener
public class TestListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("有一个Session被创建了");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值