zoukankan      html  css  js  c++  java
  • Session案例

    用户登入案例:

    按一般的网站登入实例,用户在页面登入页输入账号、密码,验证通过后,在首页显示其“欢迎回来,xxx”.

    首先完成登入页login.html

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>用户登入</title>
    </head>
    <body>
    	<form action="/CookieSession/LoginServlet" method="post">
    		<p>账号:<input type="text" name="userName"/></p>
    		<p>密码:<input type="password" name="password"/></p>	
    		<p><input type="submit" value="登入"/>
    		
    	</form>
    </body>
    </html>
    

     然后再是登入失败的页面,加上失败后返回首页的链接

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>登入失败</title>
    </head>
    <body>
    	<p>登入失败了,返回<a href="/CookieSession/login.html">登入</a>
    </body>
    </html>
    

     接下来就是完成servlet了,首先写一个LoginServlet来验证其正确性,同时若是正确,我们让其跳转到另外的一个indexservlet页面,同时在浏览器显示登入成功的页面,如下

    package com.gqx.SessionDemo;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class LoginServlet extends HttpServlet {
    
    	/**
    	 * 处理登录的逻辑
    	 */
    	private static final long serialVersionUID = 1L;
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		    request.setCharacterEncoding("utf-8");
    			String name=request.getParameter("userName");
    			String password=request.getParameter("password");
    			
    			if (name.equals("gqxing") && password.equals("123456")) {
    					//登入成功
    				/*
    				 *  context域对象:不合适,可能会覆盖数据。
    				 *  首先假设用上request域对象,来实现页面的跳转页面数据的共享
    				 */
    				request.setAttribute("userName", name);		//添加保存共享的数据															
    				 request.getRequestDispatcher("/IndexServlet").forward(request, response);  //请求的转发
    				  
    			}else {
    				//登入失败,重定向跳回原页面
    				response.sendRedirect(request.getContextPath()+"/fail.html");
    			}
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		this.doGet(request, response);
    	}
    
    }
    

      在再次就是登入成功的目标servlet

    package com.gqx.SessionDemo;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class IndexServlet extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter write=response.getWriter();
    		//获取属性
    		String name=(String) request.getAttribute("userName");
    		String html="<html><body>欢迎回来,"+name+"</body></html>";
    		write.write(html);
    	}
    
    	
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		this.doGet(request, response);
    	}
    
    }
    

      

    这个时候我们可以看到登入的效果如图

    这就是因为request域对象在这里要实现数据的共享,就要用到请求的转发,request对象和起初的那个loginServlet相关,一旦脱离,域对象里就没有数据了为null,这就要求我们这个网站全部都用到转发技术处理,显然这样是不切实际的。

    于是我们就换另一域对象——session来做实验,如下:

    package com.gqx.SessionDemo;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class LoginServlet extends HttpServlet {
    
    	/**
    	 * 处理登录的逻辑
    	 */
    	private static final long serialVersionUID = 1L;
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		String name=request.getParameter("userName");
    		String password=request.getParameter("password");
    
    		if (name.equals("gqxing") && password.equals("123456")) {
    			//登入成功
    			/*
    			 *  context域对象:不合适,可能会覆盖数据。
    			 *  首先假设用上request域对象,来实现页面的跳转页面数据的共享
    			 */
    			
    			
    			//				request.setAttribute("userName", name);		//添加保存共享的数据															
    			//				 request.getRequestDispatcher("/IndexServlet").forward(request, response);  //请求的转发
    
    			HttpSession session=request.getSession();
    			session.setAttribute("userName", name);
    			//这个时候可以用到重定向技术
    			System.out.println("验证成功");
    			response.sendRedirect(request.getContextPath()+"/IndexServlet");
    
    		}else {
    			//登入失败,重定向跳回原页面
    			response.sendRedirect(request.getContextPath()+"/fail.html");
    		}
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		this.doGet(request, response);
    	}
    
    }
    

      

    package com.gqx.SessionDemo;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class IndexServlet extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    	
    		PrintWriter write=response.getWriter();
    		//获取属性
    //		String name=(String) request.getAttribute("userName");
    		//获取session对象对象
    		HttpSession session=request.getSession(false);
    		if (session==null) {
    			//没有登入成功(第一次访问本页面,或是没有对应的JSESSIONID,),跳到登入页面去
    			response.sendRedirect(request.getContextPath()+"/login.html");
    			return ;
    		}
    		//取出会话数据
    		String name=(String) session.getAttribute("userName");
    		if (name==null) {
    			//当用户注销的时候,并没有将session删除,只删除了name(有可能其他必要的信息保存在了session中,故不可直接删除),
    			//这个时候,还需要在返回登入页验证
    			response.sendRedirect(request.getContextPath()+"/login.html");
    			return;
    		}
    		String html="<html><body>欢迎回来,"+name+"</body></html>";
    		write.write(html);
    	}
    
    	
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		this.doGet(request, response);
    	}
    
    }
    

      这个时候就没有我们前面遇到的问题了,

    我们可以在加一个功能,当用户想退出的时候,我们就需要另外设计注销的功能了,我们不能再用session销毁方法了,

    session.invalidate();  		//手动销毁
    

    因为,我们在服务器端保存的session对象中有时候不仅仅包含着我们的名字信息,有可能还有其他方面的信息,需要在下次登入的时候读取,我们可以采用移除属性的方法

    此时我们可以在indexServlet中添加一个安全退出连接

    String html="<html><body>欢迎回来,"+name+",<a href="+request.getContextPath()+"/LogoutServlet>注销登入</a></body></html>";
    

     在去添加一个LogoutServlet

    package com.gqx.SessionDemo;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class LogoutServlet extends HttpServlet {
    
    	/**
    	 * 移除名字属性,退出逻辑
    	 * 删除掉session对象中指定的userName属性即可!  
    	 */
    	private static final long serialVersionUID = 1L;
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		HttpSession session=request.getSession(false);
    		
    		//、删除session属性
    		if (session!=null) {
    			session.removeAttribute("userName");
    		}
    		//回到登入页面来
    		response.sendRedirect(request.getContextPath()+"/login.html");
    	}
    
    	
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		this.doGet(request, response);
    	}
    
    }
    

      效果如图

      

  • 相关阅读:
    读取XML类
    服务器每隔一段时间执行一次任务
    关于购物网站的支付接口(.NET)
    CentOS学习
    CentOS6.4 V1.0
    jquery选择器 选择器性能问题
    css选择器总结
    遮罩层,可拖动
    第四次作业结对编程
    C++中常用类型的转换总结
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/6036370.html
Copyright © 2011-2022 走看看