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.重复登录

 

posted @ 2020-02-24 10:36  赵广陆  阅读(65)  评论(0编辑  收藏  举报