session登录优化和访问次数记录

简介: session登录优化和访问次数记录

1.创建登录页面同时判断session是否为空

public class LoginServlet extends HttpServlet {
  @Override
  protected void service(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    //设置请求编码格式
      req.setCharacterEncoding("utf-8");
    //设置响应编码格式
      resp.setContentType("text/html;charset=utf-8");
    //获取Session中的数据
      HttpSession session = req.getSession();
      String str=(session.getAttribute("flag")==null?"":"用户名或密码错误");
      //销毁session
      session.invalidate();
    //获取请求信息
    //处理请求信息
    //响应处理结果
      //直接响应
      resp.getWriter().write("<html>");
      resp.getWriter().write("<head>");
      resp.getWriter().write("</head>");
      resp.getWriter().write("<body>");
      resp.getWriter().write("<form action='user' method='get'>");
      resp.getWriter().write("<font color='red'>"+str+"</font>");
      resp.getWriter().write(" 用户名:<input type='text' name='uname' value=''/><br />");
      resp.getWriter().write(" 密码:<input type='password' name='pwd' value=''/><br />");
      resp.getWriter().write("<input type='submit'  value='登录'/><br />");
      resp.getWriter().write("</form>");
      resp.getWriter().write("</body>");
      resp.getWriter().write("</html>");
  }
}

2.创建用户登录判断的serverlet看用户名密码是否错误,同时成功后计数

import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * 处理用户登录
 * @author 赵广陆
 */
public class UserServlet extends HttpServlet {
  @Override
  protected void service(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    //设置请求编码格式
    req.setCharacterEncoding("utf-8");
    //设置响应编码格式
    resp.setContentType("text/html;charset=utf-8");
    //获取请求信息
      String uname=req.getParameter("uname");
      String pwd=req.getParameter("pwd");
    //处理请求信息
      //校验用户信息
      if("zhangsan".equals(uname) && "123".equals(pwd)){
        //登录成功
            //获取ServletContext对象
            ServletContext sc=this.getServletContext();
          //获取计数器
            Object obj=sc.getAttribute("nums");
          //判断
            if(obj!=null){
              //计数器数据自增
              int nums=(int) obj;
              nums=nums+1;
              //存储计数器数据到ServletContext对象
              sc.setAttribute("nums", nums);
            }else{
              sc.setAttribute("nums",1);
            }
          //创建Session对象
          HttpSession hs=req.getSession();
          //存储数据
          hs.setAttribute("uname",uname);
        //响应处理结果(重定向到登录成功的Servlet)
          resp.sendRedirect("main");
      }else{
        //登录失败
        //创建Session并增加登录失败标记
        HttpSession session = req.getSession();
        session.setAttribute("flag","loginFalse");
        //响应处理结果(重定向到登录页面)
        resp.sendRedirect("login");
      }
  }
}

3.计数功能

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
/**
 * 1、在服务器关闭的时候将ServletContext中的计数器数据存储到nums.txt中
 * 2、在服务器启动的时候将nums.txt中的数据存储到ServletContext中
 * 
 * 
 * 
 * 
 * @author MyPC
 *
 */
public class NumServlet extends HttpServlet {
  //在服务器启动的时候将nums.txt中的数据存储到ServletContext中
  @Override
  public void init() throws ServletException {
    //获取ServletContext对象
    ServletContext sc=this.getServletContext();
    //获取nums.txt中存储的浏览器次数
      //获取nums.txt的绝对路径(动态获取)
      String path=sc.getRealPath("num/nums.txt");
      //创建File对象
      File f=new File(path);
      //读取nums.txt中的数据
        //获取资源流对象
        BufferedReader br=null;
        InputStreamReader is=null;
        FileInputStream fs=null;
        try {
          fs=new FileInputStream(f);
          is=new InputStreamReader(fs);
          br=new BufferedReader(is);
          //读取
          String nums=br.readLine();
          //将数据存储到ServletContext中
          sc.setAttribute("nums",Integer.parseInt(nums));
        } catch (Exception e) {
          e.printStackTrace();
        }finally{
          //关闭流资源
          try {
            fs.close();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          try {
            is.close();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          try {
            br.close();
          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
  }
  //在服务器关闭的时候将ServletContext中的计数器数据存储到nums.txt中
  @Override
  public void destroy() {
    //获取ServletContext对象
      ServletContext sc=this.getServletContext();
    //获取计数器数据
      int nums=(int) sc.getAttribute("nums");
    //将计数器数据存储到nums.txt文件中
      //获取nums.txt文件的绝对路径(动态获取)
      String path=sc.getRealPath("num/nums.txt");
      //获取nums.txt的File对象
      File f=new File(path);
      //获取资源的流对象
      BufferedWriter bw=null;
      OutputStreamWriter ow=null;
      FileOutputStream fs=null;
      try {
        //获取nums.txt的流对象
        fs=new FileOutputStream(f);
        ow=new OutputStreamWriter(fs);
        bw=new BufferedWriter(ow);
        //将数据写入到nums.txt中
        bw.write(nums+"");
        //刷新
        bw.flush();
      } catch (Exception e) {
        e.printStackTrace();
      }finally{
        //关闭流资源
        try {
          fs.close();
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        try {
          ow.close();
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        try {
          bw.close();
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
  }
}

4.登录成功后重定向到成功Severlet

import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MainServlet extends HttpServlet {
  @Override
  protected void service(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    //设置请求编码格式
    req.setCharacterEncoding("utf-8");
    //设置响应编码格式
    resp.setContentType("text/html;charset=utf-8");
    //获取请求信息
      //获取ServletContext对象
      ServletContext sc=this.getServletContext();
      //获取计数器数据
        int nums=(int) sc.getAttribute("nums");
    //处理请求信息
    //响应处理结果
      //直接响应
      resp.getWriter().write("<html>");
      resp.getWriter().write("<head>");
      resp.getWriter().write("</head>");
      resp.getWriter().write("<body>");
      resp.getWriter().write("<h3>欢迎"+req.getSession().getAttribute("uname")+"访问我的主页</h3>");
      resp.getWriter().write("<hr />");
      resp.getWriter().write("当前网页浏览器次数为:"+nums);
      resp.getWriter().write("</body>");
      resp.getWriter().write("</html>");
  }
}

运行效果:

1.错误登录

2.正确登录

3.重复登录

目录
相关文章
|
数据库 数据安全/隐私保护
国产化DM达梦数据库 - 用户状态查询、锁定与解锁,“登录失败次数超过限制”问题解决
国产化DM达梦数据库 - 用户状态查询、锁定与解锁,“登录失败次数超过限制”问题解决
1755 0
国产化DM达梦数据库 - 用户状态查询、锁定与解锁,“登录失败次数超过限制”问题解决
|
1月前
|
弹性计算 运维 Shell
统计每个远程IP访问次数
【4月更文挑战第29天】
25 1
|
1月前
|
监控 Linux Shell
Linux脚本的作用是监控IP登录失败次数
Linux脚本的作用是监控IP登录失败次数
30 1
|
缓存 数据安全/隐私保护
Cookie和Session案例(记住上次访问时间和登录案例)
Cookie和Session案例(记住上次访问时间和登录案例)
Cookie和Session案例(记住上次访问时间和登录案例)
|
Java
【javaweb】【Session】记录用户访问时间
【javaweb】【Session】记录用户访问时间
127 0
【javaweb】【Session】记录用户访问时间
使用cookie来记录用户登录次数,为何次数不更新
使用cookie来记录用户登录次数,为何次数不更新
|
测试技术 数据库
LeetCode(数据库)- 每次访问的交易次数
LeetCode(数据库)- 每次访问的交易次数
191 0