Servlet中的存储作用域、过滤器,以及通过过滤器进行简单的增删改查登录注销案例

196 阅读3分钟

Servlet中的存储作用域、过滤器,以及通过过滤器进行简单的增删改查登录注销案例

一、Servlet中的村存储作用域

  • request

  1. request 请求范围,保存后再一次请求范围内能取到, 仅转发获取
  1. 结束时间:

    使用一次消失,换句话说只存在于一次请求范围, 请求结束,数据即消失

  • session 会话范围:

  1. 获取session对象HttpSession session = request.getSession();
  1. 响应数据: request.getSession().setAttribute("age",20);
  1. 可以通过getID()来获取session中的JSSIONID值
  2. 结束时间

当浏览器访问服务器地址,会话开始,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

  1. EL表达式取值的顺序: pageScope-->requestScope-->sessionScope-->applicationScope
  2. EL表达式就是在jsp页面中,写服务器发送来到数据,数据必须通过 ${} 进行包裹才能有效
  3. 结束时间: 服务器关闭,请求范围结束,或者通过 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);
        }
    }
}
  • 运行结果:

后台数据
登录成功
查找成功
注销成功

简单的增删改.gif

四、总结

  1. 销毁session的方式:自动销毁,指在规定时间之后一般为30分钟之后; 手动销毁:使用 req.getSession().invalidate(); 方法; 注意: 使用 req.getSession().removeAttribute("users"); 只是移除,并没有销毁;

    关闭浏览器并不能销毁session

  1. @WebFilter("/user") // 只能是地址,如果有些页面不想进入过滤,需要单独进行判断 使用过滤器的时候要注意: HttpServletRequest request = (HttpServletRequest) servletRequest; // 转一下类型

\