java cookie 和session 实例_JavaWeb--Cookie和Session小练习(示例代码)

一、前言

1、当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到浏览器,浏览器将cookie保存到了用户的硬盘上。第二次登录时,(如果该Cookie尚未到期)浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。

2、通常我们在浏览网站时,有些页面是需要我们登陆之后才能浏览到的,其实这就用到了session

二、需求

现在通过一个简单的小例子来模拟这两个需求。

1、现有一个登陆页面,然后有两个可供浏览的页面,这两个页面的都是需要登陆之后才能访问;

2、在提交登陆请求后需要进行身份验证,验证通过后跳到指定页面;如果未通过则重新回到登录页面,并显示错误信息“用户名或密码输入错误!”;

3、在第一次登录时需要输入用户名和密码,但是第一次之后则不用输入用户名;

4、如果用户想要直接使用供浏览页面的url来访问这两个页面,则跳转到登录页面,并提示“请先登录!”。

三、需求分析

(一)其流程图大概如下:

20200418112856102797.png

(二)其各部分功能如下

login.jsp:

1、提供登录表单

2、表单提交至loginServlet

3、如果身份验证失败,需要显示错误信息

4、如果是因为直接访问从而跳转到登录页面,也需要显示错误信息

5、第一次登录之后不需要输入用户名

loginServlet:

1、需要处理乱码问题

2、获取用户信息

3、对用户信息进行验证

4、如果验证成功:

a、在cookie中保存用户信息

b、在session域保存用户信息,并且显示指定页面

5、如果验证失败:

a、在request域中设置错误信息,并且跳转到登录页面

succ1.jsp:

1、判断用户是否登录

a、如果已经登录,则显示页面信息

b、如果没有登录,则在request中设置错误信息,并且跳转到登录页面

2、提供页面相关信息(succ2.jap的链接)

succ2.jsp:

1、判断用户是否登录

a、如果已经登录,则显示页面信息

b、如果没有登录,则在request中设置错误信息,并且跳转到登录页面

2、提供页面相关信息(succ1.jap的链接)

(三)该案例中使用request域和request的请求转发,以及session域和cookie的具体地方

20200418112856399653.png

注意:一定要尽可能的使用更小的域!

四、代码实现

(一)目录结构

20200418112856490468.png

(二)源代码

login.jsp:

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

My JSP ‘login.jsp‘ starting page

登录

String msg = "";

String str = (String)request.getAttribute("msg");

if(str != null){

msg = str;

}

%>

String userName="";

Cookie[] cs = request.getCookies();//遍历cookie所有cookie的值,查看是否有键为userName的cookie、

if(cs != null){

for(Cookie c:cs){

if("userName".equals(c.getName())){//有键为userName的cookie、

userName = URLDecoder.decode(c.getValue(), "utf-8");

break;

}

}

}

%>

用户名:

密 码:

loginServlet:

import java.io.IOException;

import java.net.URLEncoder;

import javax.servlet.ServletException;

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;

public class LoginServlet extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

/**

* 1、处理乱码问题

* 2、获取请求参数

* 3、进行用户信息校验

* 4、正确

* a、保存cookie,内容为用户名

* b、在session中加入用户信息,然后重定向到succ1.jsp

* 5、如果错误,则在request域中设置错误信息,然后转发到login.jsp重新登录,并显示错误信息

*/

request.setCharacterEncoding("UTF-8");

String userName = request.getParameter("userName");

String pwd = request.getParameter("pwd");

boolean noNull = (userName!=null)&(pwd!=null); //用户名和密码不为空

boolean flag1 = "张三".equals(userName); //用户名正确

boolean flag2 = "123456".equals(pwd);//密码正确

boolean coorect = flag1&flag2;

if(noNull&coorect){ //验证成功

//保存cookie

Cookie cookie = new Cookie("userName", URLEncoder.encode(userName, "utf-8"));

cookie.setMaxAge(60*60*24);

response.addCookie(cookie);

//获取session,然后添加用户信息

HttpSession session = request.getSession();

session.setAttribute("userName", userName);

//重定向到succ1

response.sendRedirect("/day11_3/session2/succ1.jsp");

}else{//验证失败

//在request域中添加错误信息

request.setAttribute("msg", "用户名或密码输入错误!");

//转发到login.jsp

request.getRequestDispatcher("/session2/login.jsp").forward(request, response);

}

}

}

succ1.jsp:

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

My JSP ‘succ1.jsp‘ starting page

String userName = (String)session.getAttribute("userName");

if(userName == null){//非登录状态,设置错误信息,并重定向到登录界面

request.setAttribute("msg", "请先登录!");

request.getRequestDispatcher("/session2/login.jsp").forward(request, response);

return;

}

%>

, 登录成功!

我是succ1页面

浏览succ2

succ2.jsp:和succ1.jsp只有最后两个h1标签不一样

我是succ2页面

浏览succ1

五、测试结果

1、在浏览器中输入:http://localhost:8080/day11_3/session2/login.jsp

20200418112856550034.png

2、登陆失败:

20200418112856615460.png

3、登陆成功后:

20200418112856668191.png

4、通过“浏览succ2链接”访问succ2:

20200418112856761935.png

5、尝试直接使用succ1的链接地址来访问:

20200418112856823454.png

6、第二次登陆:

20200418112856873256.png

六、需要注意的地方

(一)Cookie需要处理中文

Cookie使用Unicode字符时需要对Unicode字符进行编码。

设置Cookie时:

Cookie cookie = new Cookie("userName", URLEncoder.encode(userName, "utf-8"));

获取Cookie时:

userName = URLDecoder.decode(c.getValue(), "utf-8");

(二)在jsp中进行Cookie进行解码时,记得导包

七、Cookie和Session的基础知识

Java新手,若有错误,欢迎指正!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值