大部分来自柏码和韩顺平
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(主要用这个)
这个更常用,我们直接用request
和response
,不用强转
@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被创建了");
}
}