session和拦截器的使用

问题遇到的现象和发生背景

javaweb 登录注册后,设置Filter判断session过期,实现登录比如几秒后自动跳转到登录页面

用代码块功能插入代码,请勿粘贴截图

—数据保存

package javabean;

import java.util.HashMap;
import java.util.Map;

public class DBUtil {
    //首先创建一个Map集合,用来保存添加的用户
    private static Map<String,User> map=new HashMap<String, User>();
    //判断改用户名是否被注册过
    //boolean containsKey(Object value)    判断集合是否包含指定的值
    public Boolean addUser(String username,String password,int age,String sex) {
        if(map.containsKey(username)) {
            return false;
        }else {
            User user=new User(username, password, age, sex);
            map.put(username, user);
            return true;
        }

    }
    //判断改用户名和密码是否输入正确
    public static User LoginUser(String username,String password) {
        if(map.containsKey(username)) {
            User user=map.get(username);
            if (user.getPassword().equals(password)) {
                return user;
            }
            return null;
        }
        return null;
    }
}

—home.jsp登录页面

<%--
  Created by IntelliJ IDEA.
  User: yx
  Date: 2022/10/29
  Time: 14:12
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
html>
<html>
<head>
    <meta charset="utf-8" />
    <title>用户登录title>
    <script src="jquery-3.5.1.min.js" type="text/javascript">script>
    <script src="bootstrap.min.js">script>
    <link rel="stylesheet" href="bootstrap.min.css" />
    <link type="text/css" rel="stylesheet" href="css/style.css" />


head>
<body>
<%
    //对传入的数据进行接受并显示
    Object key=request.getAttribute("key");
    if(key!=null)
        out.println(key);
%>
<form action="logindo.jsp" method="post">
    <div class="mycenter">
        <div class="mysign">
            <div class="col-lg-11 text-center text-info">
                <h2>请登录h2>
            div>
            <div class="col-lg-10">
                <input type="text" class="form-control" name="username" placeholder="请输入账户名" required autofocus/>
            div>
            <div class="col-lg-10">div>
            <div class="col-lg-10">
                <input type="password" class="form-control" name="password" placeholder="请输入密码" required autofocus/>
            div>
            
            
            
            
            
            <div class="col-lg-10">
                <button type="submit" class="btn btn-success col-lg-12">登录button>
                <a href="zhuce.jsp" class="btn btn-success col">注册a>
            div>
        div>
    div>
form>

<style>

    .col-lg-10 .btn-success{
        width: 70px;
    }
    .col-lg-10 .col{
        /*padding-right: 20px;*/
        margin-top: 7px;
    }
    .col-lg-10 a{
        position: absolute;
        right: -8px;
        /*margin-right: 20px;*/
    }
style>
<script>

script>
body>
html>

—zhuce注册页面

<%@ page language="java" contentType="text/html; charset=utf-8"
         pageEncoding="utf-8"%>
html>
<html>
<head>
    <meta charset="utf-8">
    <title>Insert title heretitle>
head>
<body>
<%--action 将输入的数据传入注册处理页面--%>
<form action="zhucedo.jsp" method="post">
    用户名:<input type="text" name="username"><br>
    密 码:<input type="password" name="password"><br>
    年 龄:<input type="text" name="age"><br>
    性 别: 男<input type="radio" value="男" name="sex"><input type="radio" name="sex" value="女">
    <input type="submit" value="注册">
form>
body>
html>



—zhecudo注册判断

<%@page import="javabean.DBUtil"%>
<%@ page import="javabean.User" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
         pageEncoding="utf-8"%>



    "utf-8">
    Insert title here


<%
    //获取传递过来的数据
    String username=request.getParameter("username");
    String password=request.getParameter("password");
    //将request.getParameter();转换成为int型,使用Integer.parseInt()方法
    int age=Integer.parseInt(request.getParameter("age"));
//因为在运行是系统会用默认的编码格式对传入的数据进行编码而原本的iso-8859-1,而这编码格式没有中文因此会产生乱码问题
//通过系统默认的编码格式进行解码,在通过设置utf-8的编码
    String sex=new String(request.getParameter("sex").getBytes("iso-8859-1"),"utf-8");
//创建DBUtil类对注册的用户数据进行判断
    DBUtil util=new DBUtil();
    Boolean b=util.addUser(username, password, age, sex);
//    User user=DBUtil.LoginUser(username, password);
    User user=DBUtil.LoginUser(username, password);
    if(b==true){
//注册成功后用getRequestDispatcher将页面跳转到登录页面,setAttribute用来传递不同的参数
//在登录界面接收后呈现出不同的数据用于区分跳转的页面和直接登录页面
//        out.print("");
        HttpSession session1=request.getSession();
        session1.setMaxInactiveInterval(8);
        request.setAttribute("key", "注册成功,请登录!");
        session1.setAttribute("user",user);
        request.getRequestDispatcher("/home.jsp").forward(request, response);

    }
%>






—logindo

<%@page import="javabean.User"%>
<%@page import="javabean.DBUtil"%>
<%@ page import="java.io.PrintWriter" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
         pageEncoding="utf-8"%>
html>
<html>
<head>
    <meta charset="utf-8">
    <title>Insert title heretitle>
head>
<body>
<%
//    PrintWriter out = response.getWriter();
    String username=request.getParameter("username");
    String password=request.getParameter("password");
    User user=DBUtil.LoginUser(username, password);
    HttpSession session1 = request.getSession();
    //    User user=(User)request.getAttribute("user");

    //处理乱码
    if(user==null){
            request.getRequestDispatcher("home.jsp").forward(request, response);
    }else {
//        Cookie cookie=new Cookie("user",username);
//        cookie.setMaxAge(8);
//        response.addCookie(cookie);
//        HttpSession session1=request.getSession();
//        session1.setMaxInactiveInterval(8);
//        session1.setAttribute("user",user);
//        HttpSession session1 = request.getSession();
//        session1.setAttribute("user",user);
//        out.println("登录成功!");
//登录成功跳转到用户信息页面
        session1.setAttribute("user", user);
//        response.sendRedirect("/mvc/flower.jsp");
        request.getRequestDispatcher("flower.jsp").forward(request, response);
    }
 %>
body>
html>



—商品页面

<%--
  Created by IntelliJ IDEA.
  User: yx
  Date: 2022/11/6
  Time: 10:07
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Titletitle>
head>
<body>
<table>
    <tr>
        <td width="100px">td><td  width="100">鲜花名称td>  <td  width="100">鲜花单价td>
    tr>
    <form action="buycar.jsp" method="post">
        <tr>
            <td  width="150px"><img  style="height:100px" src="./ph/玫瑰花.jpg"  name="pic">td>
            <td>玫瑰花td>
            <td>$520td><td>
            <input type="submit" name="buy" value="加入购物车">td>
        tr>
        <%--在web开发过程中,对于在页面存储但不需要显示出来的值,我们通常使用上面的代码来存储。--%>
        <input type="hidden" name="flowername" value="玫瑰花">
        <input type="hidden" name="price" value="$520">
    form>

    <form action="buycar.jsp" method="post">
        <tr>
            <td  width="150px"><img  style="height:100px" src="./ph/五彩花.jpg"  name="pic"> td>
            <td>五彩花td>
            <td>$400td><td>
            <input type="submit" name="buy" value="加入购物车">td>
        tr>
        <%--        <input type="hidden" name="pic" value="img">--%>
        <input type="hidden" name="flowername" value="五彩花">
        <input type="hidden" name="price" value="$400">
    form>

    <form action="buycar.jsp" method="post">
        <tr>
            <td  width="150px"><img  style="height:100px" src="./ph/拜杰花.jpg"  name="pic">td>
            <td>拜杰花td>
            <td>$150td><td>
            <input type="submit" name="buy" value="加入购物车">td>
        tr>
        <input type="hidden" name="flowername" value="拜杰花">
        <input type="hidden" name="price" value="$150">
    form>

    <form action="buycar.jsp" method="post">
        <tr>
            <td width="150px"><img  style="height:100px" src="./ph/油头花.jpg" name="pic">td>
            <td>油头花td>
            <td>$230td><td>
            <input type="submit" name="buy" value="加入购物车">td>
        tr>
        <input type="hidden" name="flowername" value="油头花">
        <input type="hidden" name="price" value="$230">
    form>

    <form action="buycar.jsp" method="post">
        <tr>
            <td  width="150px"><img style="height:100px" src="./ph/紫罗兰.jpg" name="pic" >td>
            <td>紫罗兰td><td>$140td>
            <td><input type="submit" name="buy" value="加入购物车">td>
        tr>
        <input type="hidden" name="flowername" value="紫罗兰">
        <input type="hidden" name="price" value="$140">
    form>

table>
<a href="buycar.jsp">查看购物车a>
body>
html>



运行结果及报错内容

无法实现session设置时间后,无法跳转到登录页面,拦截器布置到设置哪一个页面

我想要达到的结果

javaweb 登录注册后,设置Filter判断session过期,实现登录比如几秒后自动跳转到登录页面

注册后跳转到哪里需要根据业务判断一下,一般不难。拦截器不是设置到哪个界面,拦截器是作用所有的请求,除了登录外都需要进拦截器,在拦截器中判断session有没有过期,没有过期就放行,否则重定向到登录页面。

你看看这个博文讲解的符合你的需求不【javaweb之session过期验证】:https://www.cnblogs.com/guokai870510826/p/5813571.html

  1. web.xml中添加
<filter><!-- 配置过滤器,用来检查session中是否存在用户登录账号信息 -->
    <filter-name>ChkSessionFilter</filter-name>
    <filter-class>com.um.core.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>ChkSessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  1. 编写LoginFilter.java
package com.um.core.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.um.core.controller.BaseController;

/**
 * 登录验证过滤器
 */
public class LoginFilter extends BaseController implements Filter {

    /**
     * 初始化
     */
    public void init(FilterConfig fc) throws ServletException {
        // FileUtil.createDir("d:/FH/topic/");
    }

    public void destroy() {

    }

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String[] notFilter = new String[] {"logindo.jsp","zhecudo.jsp","home.jsp","zhuce.jsp" };//将注册/登录等页面不健权
        String urlPath = request.getServletPath();
        Boolean flg = false;
        for (String url : notFilter) {
            if ((urlPath.contains(url))) {
                flg = true;
            }
        }
        if(flg){
            chain.doFilter(req, res);
        }else{
            HttpSession session = request.getSession();
            Object object = session.getAttribute("user"); 
            if (object == null) {
                logger.warn("用户登录超时或未登录,请重新登录!");
                java.io.PrintWriter out = response.getWriter();  
                out.println("<html>");  
                out.println("<script>");  
                out.println("window.open ('"+request.getContextPath()+"/home.jsp','_top')");  
                out.println("</script>");  
                out.println("</html>");  
                return;
                
            }else {
                chain.doFilter(req, res);
            }
        }
        
    }
}