写在前面:关于昨天的问题,在发完博客后捣鼓了俩小时搞好了。顺带着基本问题也解决了,是因为时区问题,c3p0默认时间为美国时间,而我们的电脑都是中国时间,时区不一致就没法用(咱也不知道为啥),至于数据库存储数据乱码问题,在连接数据库时写好连接的编码,并且在后台写好编码就可将问题解决。可以看到配置可真是个令人上头的玩意...
今日的学习:今天学习了会话技术Cookie&Session。通过这两个会话技术,可以解决很多业务上的基本问题,如验证码的校验,不同的用户显示不同的界面,如不同人的购物车不同,就可以通过设置session进行实现。
首先是会话技术的概念:从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话。可以看到会话的概念是比较广泛的。在会话技术中有两种:cookie和session,cookie存在于本地,session存在于服务器端,由此便可看出cookie是可以被本浏览器清除的(清理垃圾时候的选项),而session存在于服务端,也就加大了服务端的压力。
下面是关于cookie的创建和发送的demo:
package cookie;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class SendCookieServlet
*/
@WebServlet("/Send")
public class SendCookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public SendCookieServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建cookie对象
Cookie cookie = new Cookie("name", "liuge");
//1.1 为cookie设置持久化时间-----存放在磁盘上的时间
cookie.setMaxAge(60*10);//10分钟----时间设置为0代表删除cookie
//1.2 为cookie设置携带的路径
//cookie.setPath("/Day16/Send");//访问Send资源时才携带cookie
//cookie.setPath("/Day16");//访问Day16下的所有资源都携带cookie
//cookie.setPath("/");//访问目前tomcat下的所有的资源都携带cookie
//2.将cookie中存储的信息发送到客户端——头
response.addCookie(cookie);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
得到cookie的demo:
package cookie;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class GetCookieServlet
*/
@WebServlet("/GetCookieServlet")
public class GetCookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public GetCookieServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得客户端携带的cookie数据
Cookie[] cookies = request.getCookies();
//通过cookie的名称获得想要的cookie
for(Cookie cookie:cookies) {
//获得cookie的名称
String cookiename = cookie.getName();
if(cookie!=null) {
if(cookiename.equals("name")) {
//获得该cookie的值
String cookieValue = cookie.getValue();
System.out.println(cookieValue);
}
}
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
根据cookie的特性,做了一个显示上回访问时间的demo:
package lastaccesstime;
import java.io.IOException;
import java.util.Date;
import java.text.SimpleDateFormat;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mysql.fabric.xmlrpc.base.Data;
/**
* Servlet implementation class LastAccessTimeServlet
*/
@WebServlet("/LastAccessTime")
public class LastAccessTimeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LastAccessTimeServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得当前时间
Date date =new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss");
String currentTime = format.format(date);
//1.创建cookie 记录当前的最新的访问时间
Cookie cookie = new Cookie("lastAccessTime",currentTime);
cookie.setMaxAge(60*10*500);
response.addCookie(cookie);
//2.获得客户端携带的cookie ----lastAccessTime
String lastAccessTime = null;
Cookie[] cookies = request.getCookies();
if(cookies!=null) {
for(Cookie coo:cookies) {
if("lastAccessTime".equals(coo.getName())) {
lastAccessTime = coo.getValue();
}
}
}
response.setContentType("text/html;charset=UTF-8");
if(lastAccessTime==null) {
response.getWriter().write("您是第一次访问");
}
else {
response.getWriter().write("您上次访问时间是:"+lastAccessTime);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
需要注意的是,新版本的tomcat无法存储空格,cookie也无法存储中文。
之后是关于session的创建和发送demo:
package session;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class SessionServlet1
*/
@WebServlet("/SessionServlet1")
public class SessionServlet1 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public SessionServlet1() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建该客户端(会话)的私有session区域
/*request.getSession()方法内部会判断该客户端是否在服务器端已经存在session
* 如果该客户端在此服务器不存在session 那么就会创建一个新的session对象
* 如果该客户端在服务求已存在session 就会获得已经存在的该session返回
*/
HttpSession session = request.getSession();
session.setAttribute("name", "tom");
String id = session.getId();//该session对象的id
//手动创建一个存储JSESIONID的Cookie 为该cookie设置持久时间
Cookie cookie = new Cookie("JSESSIONID", id);
cookie.setPath("/Day16/");
cookie.setMaxAge(60*10);
response.addCookie(cookie);
response.getWriter().write("JSESSIONID:"+id);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
以及显示session的demo:
package session;
import java.io.IOException;
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 javax.servlet.http.HttpSession;
/**
* Servlet implementation class SessionServlet2
*/
@WebServlet("/Session2")
public class SessionServlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public SessionServlet2() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从session中获得存储的数据
HttpSession session = request.getSession();
String attribute = (String) session.getAttribute("name");
response.getWriter().write(attribute);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
最后,根据session实现了一个验证码校验功能:
package login;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Login
*/
@WebServlet("/Login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//验证码的校验
//获得页面输入的验证
request.setCharacterEncoding("UTF-8");
String checkCode_client = request.getParameter("checkCode");
//获得生成图片的文字的验证码
String checkCode_session = (String) request.getSession().getAttribute("checkcode_session");
//将二者进行比对
if(!checkCode_session.equals(checkCode_client)) {
request.setAttribute("loginInfo", "您的验证码不正确");
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
//获得页面的用户名和密码进行数据库的校验
//...
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
今日总结:可以看到,通过cookie和session的使用,可以实现一些很简单的业务流程。日后也可在自己的网站中实现。
来源:https://www.cnblogs.com/wushenjiang/p/12257753.html