目录
5.3: 实现用户的一周免登录(将4.2.2的包和类全考过来)
6.1: Servlet系列之Session(给服务端的基本的存储)
5
5.1: Servlet系列之Cookie
(相当于:浏览器的历史信息、5天内自动登录等等)
添加文件:
web.xml文件:
<servlet>
<servlet-name>CookieServlet</servlet-name>
<servlet-class>com.mashibing.CookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieServlet</servlet-name>
<url-pattern>/cookie</url-pattern>
</servlet-mapping>
<servlet>
Java文件:CookieServlet(Cookie程序)
public class CookieServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("gbk");
//response.getWriter().write("学习cookie");
//创建Cookie对象(两个Cookie对象)
Cookie cookie = new Cookie("00001","beijing");
Cookie cookie1 = new Cookie("0002","shanghai");
//给cookie对象添加时间有效期,单位是s
cookie.setMaxAge(3*24*3600); //浏览器重启后候数据还在
//给cookie修改固定路径值
cookie1.setPath("/cookie/abc");
//将cookie设置到response(响应)对象中
response.addCookie(cookie);
response.addCookie(cookie1);
response.getWriter().write("学习cookie");
}
}
给cookie对象添加时间有效期,单位是秒:
随便填入一个地址,进去检查(上次的信息仍然保留)
如果重新启动浏览器:(上次的信息就死掉了)
给cookie修改固定路径值:
调试:
在……/cookie/abc地址中打开:(地址已修改)
cookie:用来处理客户端发送不同请求的时候使用相同的参数信息
cookie的使用:
* Cookie cookie = new Cookie("00001","beijing");
* response.addCookie(cookie);
* 设置cookie的参数
* cookie.setMaxAge( int seconds)
* cookie.setPath(String url)
* 获取cookie对象
* Cookie[] cookies = request.getCookies()
* 特点:
* 1、cookie是保存在浏览器端的数据名称
* 2、cookie分类:
临时cookie,默认是存储在内存中的,所以当浏览器关闭的时候,cookie自动失效
持久化cookie,保存在浏览器的某个存储目录,当时间过期之后,才会失效
* 3、每一个cookie对象中保存一个key-value键值对的数据,想要存储多个k-v数据,需要创建多个Cookie对象 //两个Cookie对象
5.2:
web.xml文件:
<servlet-name>GetCookieServlet</servlet-name>
<servlet-class>com.mashibing.GetCookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetCookieServlet</servlet-name>
<url-pattern>/getcookie</url-pattern>
</servlet-mapping>
java文件:GetCookieServlet(获取Cookie程序)
public class GetCookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("gbk");
//获取cookie对象
Cookie[] cookies = request.getCookies();
//写if是防止页面发生一次500,导致数据永久消失
if(cookies.length>0){
for (Cookie c: cookies) {
String key = c.getName();
String value = c.getValue();
System.out.println(key+":"+value); //为00001 : beijing
}
}
}
}
5.3: 实现用户的一周免登录(将4.2.2的包和类全考过来)
用户免登录实现:
1、用户发送验证cookie信息的请求,编写对应的servlet进行处理
2、如果包含cookie,直接跳转到成功页面
3、如果不包含cookie信息,直接跳转到登录页面
web.xml文件:
<servlet>
<servlet-name>PageServlet</servlet-name>
<servlet-class>com.cookie.control.PageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PageServlet</servlet-name>
<url-pattern>/page</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.cookie.control.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.cookie.control.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
web.xml文件:
<servlet>
<servlet-name>CookieProjectServlet</servlet-name>
<servlet-class>com.cookie.control.CookieProjectServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieProjectServlet</servlet-name>
<url-pattern>/ck</url-pattern>
</servlet-mapping>
java文件:CookieProjectServlet(Cookie项目程序)
public class CookieProjectServlet extends HttpServlet {
//引入”用户服务”的类
UserService userService = new UserServiceImpl();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("gbk");
//获取cookie对象
Cookie[] cookies = request.getCookies();
//如果cookies如果为null,直接跳转到登录页面进行登录请求
if(cookies!=null){
for (Cookie c: cookies) {
String key = c.getName(); //id(名字)
if("uid".equals(key)){
String value = c.getValue();
User u = userService.getUserById(Integer.valueOf(value));
//如果u如果不为null,那么有值,直接跳转
if(u!=null){
response.sendRedirect("hello");//跳转后的地址
}else{
response.sendRedirect("page"); //跳转后的地址
}
}else{
response.sendRedirect("page"); //跳转后的地址
}
}
}else{
//跳转到登录页面
response.sendRedirect("page"); //跳转后的地址
}
}
}
java文件:LoginServlet(登录程序)
修改成:
java文件:UserService(用户服务)
添加:
java文件:UserServiceImpl(用户服务)
添加:
java文件:UserDao(用户访问)
添加:
java文件:UserDaoImpl(用户访问)
添加:
public class UserDaoImpl implements UserDao {
@Override
public User checkUser(User user) {
//定义连接的对象
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
User u = null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/login","root","123456");
//获取预处理块
pstmt = conn.prepareStatement("select * from user where name = ? and pwd =?");
//给?赋值
pstmt.setString(1,user.getName());
pstmt.setString(2,user.getPwd());
//执行sql语句
rs = pstmt.executeQuery();
//从resultset中获取结果值
while (rs.next()){
u = new User(rs.getInt("id"),rs.getString("name"),rs.getString("pwd"));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
rs.close();
pstmt.close();
conn.close();
} catch (SQLException e) {e.printStackTrace();}
}
return u;
}
===================== 复制上面,只修改黄色部分 =====================
@Override
public User getUserById(int id) {
//定义连接的对象
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
User u = null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/login","root","123456");
//获取预处理块
pstmt = conn.prepareStatement("select * from user where id = ?");
//给?赋值
pstmt.setInt(1,id);
//执行sql语句
rs = pstmt.executeQuery();
//从resultset中获取结果值
while (rs.next()){
u = new User(rs.getInt("id"),rs.getString("name"),rs.getString("pwd"));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
rs.close();
pstmt.close();
conn.close();
} catch (SQLException e) {e.printStackTrace();}
}
return u;
}
①调试:
退出浏览器,重启
②直接进入该链接:
6
6.1: Servlet系列之Session(给服务端的基本的存储)
cookie与session区别:
cookie | 一个用户发送多次相同请求的处理需要使用相同的数据 |
Session | 一个用户发送不同请求的处理需要使用相同的数据(比如下面,报错500,也能有响应头下的cookie) |
Session:解决一个用户发送不同请求时的数据共享问题(比如进入淘宝的某个商品地址不用输密码)
在处理过程中会给用户创建一个 session 对象,用来存储用户请求处理相关的公共数据,并将此 session 对象的 JSESSIONID 以 sessoin 的形式保存在浏览器中(临时存储, 浏览器关闭即失效),与之前的cookie类似?
用户在发起第二次请求及后续请求时, 请求信息中会附带 JSESSIONID, 服务器在接收到请求后,调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其对应的 session 对象
1、由服务器进行创建session对象,存储共享的数据
2、session需要依赖cookie技术
3、每个用户对应一个独立的session对象
4、每个session对象的有效时长是30分钟
5、每次关闭浏览器的时候,重新请求都会开启一个新的session对象,因为返回的JSESSIONID保存在浏览器的内存中(临时cookie),所以关闭之后自然消失
1、创建sessoin对象
HttpSession session = request.getSession()
2、向Session对象中添加值
sessoin.setAttribute(String name,Object object)
3、获取Session中的值
session.getAttribute(String name)
4、设置sessoin属性
session.setMaxInactiveInterval(5) //设置存活时间,5秒
session.invalidate(); //session强制失效
web.xml文件:
<servlet>
<servlet-name>SessionServlet</servlet-name>
<servlet-class>com.mashibing.SessionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionServlet</servlet-name>
<url-pattern>/session</url-pattern>
</servlet-mapping>
java文件:SessionServlet(会话程序)
public class SessionServlet extends javax.servlet.http.HttpServlet {
@Override
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
this.doGet(request,response);
}
@Override
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
//将乱码换成中文
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
System.out.println("接受到请求get");
//图一:第一次开启浏览器,cookie在请求头下
//图三:第二次开启浏览器,cookie在响应头下(由之前保持下来了)
idea中显示:(是两次打开浏览器)不一样就表示数据没保存?
//获取session对象
HttpSession session = request.getSession();
//设置session的有效时长
//session.setMaxInactiveInterval(5); //5秒
//getid方法拿到JSESSIONID
System.out.println(session.getId());
//设置session强制失效
//session.invalidate();
//向session中设置参数
//session.setAttribute("111","zhangsan"); //这行是配合下面的java代码
response.getWriter().write("学习session");
}
}
当随便输入地址时:也出现Cookie(原因是留下的信息造成的)
6.2:
web.xml文件:
<servlet>
<servlet-name>SessionServlet2</servlet-name>
<servlet-class>com.mashibing.SessionServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionServlet2</servlet-name>
<url-pattern>/session2</url-pattern>
</servlet-mapping>
java文件:SessionServlet2(会话程序)
public class SessionServlet2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取session对象
HttpSession session= request.getSession();
//获取session中的参数值
String str = (String) session.getAttribute("111");
System.out.println(str);
response.getWriter().write(str);
}
}
//图一:第一次开启浏览器,cookie在请求头下
//图二:第二次开启浏览器,cookie在响应头下(有之前保持下来了)
(上面是第一次开启浏览器,下面第二次)
6.3:
例子:报错500
idea中显示: (登录成功)
熟悉之前的案例:
(数据库中有该用户 --> 登录成功)
跳转到hello:
和 “实现用户的一周免登录案例” 一样,也是将4.2.2的包和类拷过来:
(此时就有五个页面地址):
web.xml文件:
<servlet>
<servlet-name>PageServlet</servlet-name>
<servlet-class>com.session.PageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PageServlet</servlet-name>
<url-pattern>/page</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.session.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.session.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
java文件:LoginServlet(登录程序)
添加:
java文件:HelloServiet(Hello程序)
String name = request.getParameter("name");换成:
cookie与session区别:
cookie | 同一个用户发送多次相同请求的处理需要使用相同的数据 |
Session | 同一个用户发送不同请求的处理需要使用相同的数据(比如上面,报错500,也能有响应头下的cookie) |
Session:解决一个用户发送不同请求时的数据共享问题(比如进入淘宝的某个商品地址不用输密码)
在处理过程中会给用户创建一个 session 对象,用来存储用户请求处理相关的公共数据,并将此 session 对象的 JSESSIONID 以 sessoin 的形式保存在浏览器中(临时存储, 浏览器关闭即失效),与之前的cookie类似?
用户在发起第二次请求及后续请求时, 请求信息中会附带 JSESSIONID, 服务器在接收到请求后,调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其对应的 session 对象