Servlet中的存储作用域、过滤器,以及通过过滤器进行简单的增删改查登录注销案例
一、Servlet中的村存储作用域
-
request
- request 请求范围,保存后再一次请求范围内能取到, 仅转发获取
-
结束时间:
使用一次消失,换句话说只存在于一次请求范围, 请求结束,数据即消失
-
session 会话范围:
- 获取session对象HttpSession session = request.getSession();
- 响应数据: request.getSession().setAttribute("age",20);
- 可以通过getID()来获取session中的JSSIONID值
- 结束时间
当浏览器访问服务器地址,会话开始,30分钟之后或者关闭服务器之后会话结束,或者是30分钟之内浏览器关闭,那么会话范围也会结束
如何查看或者修改session会话的时间呢?
解答: 在tomcat 安装路径中: tomcat9\apache-tomcat-9.0.65-windows-x64\apache-tomcat-9.0.65\conf\web.xml
<session-config> <session-timeout>30</session-timeout> </session-config>可以进行查看或者修改
-
session底层是cookie机制
流程:用户第一次请求服务器,服务器检测到该请求没有cookie就会创建一个session对象,生成cookie JSSIONID写入到浏览器,用户之后的请求会带上该cookie,服务器通过识别该cookie来找到对应的session
区别:cookie保存在客户端,session保存在服务器
-
aplication
- EL表达式取值的顺序: pageScope-->requestScope-->sessionScope-->applicationScope
- EL表达式就是在jsp页面中,写服务器发送来到数据,数据必须通过 ${} 进行包裹才能有效
- 结束时间: 服务器关闭,请求范围结束,或者通过 invalidate() 方法将该请求关闭
二、过滤器的使用
作用:
- 执行地位在Servlet之前,客户端发送请求时,会先经过Filter,再到达目标Servlet中;响应时,会根据执行流程再次反向执行Filter
- 可以解决多个Servlet共性代码的冗余问题(例如:乱码处理、登录验证)
语法: 在类的上面写 @WebFilter(”地址“)地址不能重复,必须写
@WebFilter("/login")
public class UserServlet extends HttpServlet {}
编写过滤器:
Servlet API中提供了一个Filter接口,开发人员编写一个Java类实现了这个接口即可,这个Java类称之为过滤器(Filter)
实现过程:
- 编写Java类实现Filter接口
- 在doFilter方法中编写拦截逻辑
- 设置拦截路径
三、案例:做一个简单的登录验证
要求:
一个商品管理系统: 查找不用权限,增加、删除都需要登录后才能操作,不需要实现具体功能
代码:
- user.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- 登录、注册、增加、删除、查询
需要登录后才能进行删除、增加操作,未登录也能进行查询
empty users 相当于 users==null 的判断
--%>
<h3>登录状态 ${empty users ? "未登录":"登录"}</h3>
<a href="user?operate=login">登录</a>
<a href="user?operate=logout">注销</a>
<br>
<a href="user?operate=find">查询</a>
<a href="user?operate=delete">删除</a>
<a href="user?operate=add">增加</a>
<a href="user?operate=modify">修改</a>
${msg} <%--EL表达式 如果没有登录,打印msg信息--%>
</body>
</html>
- user服务器
package com.zking.UserServlet;
import com.zking.entity.Product;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/user")
public class User extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 后去操作事件
String operate = req.getParameter("operate");
switch (operate) {
case "login": login(req,resp);break;
case "logout": logout(req,resp);break;
case "add": add(req,resp);break;
case "delete": delete(req,resp);break;
case "modify": modify(req,resp);break;
case "find": find(req,resp);break;
}
}
private void login(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.getSession().setAttribute("users","admin"); //登录的时候通过session保存一个键users
resp.sendRedirect("user.jsp"); // 重定向到页面
System.out.println("login成功");
}
private void logout(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// req.getSession().removeAttribute("users"); 只删除一个属性
req.getSession().invalidate(); // 销毁,session对象
resp.sendRedirect("user.jsp");
System.out.println("logout成功");
}
private void add(HttpServletRequest req, HttpServletResponse resp) throws IOException {
System.out.println("add成功");
resp.sendRedirect("user.jsp");
}
private void delete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
System.out.println("delete成功");
resp.sendRedirect("user.jsp");
}
private void modify(HttpServletRequest req, HttpServletResponse resp) throws IOException {
System.out.println("modify成功");
resp.sendRedirect("user.jsp");
}
private void find(HttpServletRequest req, HttpServletResponse resp) throws IOException {
System.out.println("find成功");
resp.sendRedirect("user.jsp"); //重定向
}
}
- userFilter过滤器
package com.zking.Fitler;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter("/user") // 只能是地址,如果有些页面不想进入过滤,需要单独进行判断
public class UserFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest; // 转一下类型
String operate = request.getParameter("operate");
if(operate.startsWith("find")||operate.startsWith("login")) {
// 不需要进行过滤
filterChain.doFilter(request,servletResponse);
return;
}
Object u =request.getSession().getAttribute("users");
if(u==null) {
request.setAttribute("msg","请先登录后在进行操作");
request.getRequestDispatcher("user.jsp").forward(request,servletResponse);
}else {
filterChain.doFilter(request,servletResponse);
}
}
}
- 运行结果:
后台数据
登录成功
查找成功
注销成功
四、总结
-
销毁session的方式:自动销毁,指在规定时间之后一般为30分钟之后; 手动销毁:使用 req.getSession().invalidate(); 方法; 注意: 使用 req.getSession().removeAttribute("users"); 只是移除,并没有销毁;
关闭浏览器并不能销毁session
- @WebFilter("/user") // 只能是地址,如果有些页面不想进入过滤,需要单独进行判断 使用过滤器的时候要注意: HttpServletRequest request = (HttpServletRequest) servletRequest; // 转一下类型
\