JSP简介、会话技术(Cookie、Session)

一、JSP简介

Java Server Page服务端页面

1.概念

一种既可以定义HTML,CSS,JS,又可以定义Java代码的页面。
功能:用来简化页面的书写

2.原理

本质:就是一个Servlet。
当浏览器请求jsp页面时,服务器会查找是否存在。如果存在服务器,内置的JSP转换引擎会将.jsp转换成.java。然后调用javac编译成.class文件,然后使用。

3.jsp脚本:用来标识Java代码

1.注释脚本

<%--      --%>注释脚本(这是jsp页面上的注释)
标记语言注释<!--      -->
		缺点:会发送到客户端,不能注释Java代码
jsp注释<%--      --%>
		优点:不会发送到客户端,能注释Java代码

2.生成的Java代码在成员位置

<%!
  int a=100;
%>

3.生成的Java代码在service()方法中

<%
  int b=200;
%>

4.生成的Java代码在print(“abc”)里面,在页面上写东西

<%="abc"%>

二、响应头—refresh定时刷新

  1. 响应头的格式
refresh:秒数;url=跳转的页面
  1. 设置相应头
response.setHeader(String key,String value);设置字符串形式的响应头
response.addHeader(String key,String value);追加响应头, 若之前设置设置过这个头,则追加;若没有设置过,则设置
  1. 设置定时刷新
//响应一个刷新头refresh  值:"3;url=/login.jsp"
        response.setHeader("refresh","3;url=/login.jsp");

相应的案例:登录失败时,提示“用户名与密码不匹配”,3秒后自动跳转到登录页面。

三、会话技术

1.Web中的会话:指的就是,浏览器跟服务器建立一次的通信,这次通信中,可以包含多次请求和响应,并且可以在这个多次请求和响应间进行数据的共享。
2.会话技术:解决客户端和服务端数据的共享问题;
HTTP是一种无状态协议,所以我们要通过会话技术,来解决多次请求时数据的共享。

  • 客户端会话技术Cookie:将数据保存在客户端(浏览器)(能够减轻服务端的压力,但是数据不安全)
  • 服务端会话技术Session:将数据保存在服务端(数据有安全保证,但是会增加服务器的压力)
1.客户端会话技术Cookie

原理:客户端请求一个资源,服务器做出响应时,会发送set-cookie头,共享数据;客户端接收到响应,会将数据保存在客户端浏览器中;客户端再一次请求服务器时,会通过cookie头携带该数据;服务端接收到请求,会来解析获取数据。

//1.创建cookie
        Cookie cookie = new Cookie("name","zhangsan");
//2.响应cookie
        response.addCookie(cookie);
//3.当浏览器二次请求时,取出
        Cookie[] cookies = request.getCookies();
        //遍历cookies
        if(cookies!=null){
            for (Cookie cookie : cookies) {
                //获取Cookie的名字来判断
                String name = cookie.getName();
                if(name.equals("name")){
                    String value = cookie.getValue();
                    System.out.println(value);
                }
            }
        }    
//4.消除Cookie   把存活时间设置为0  
			cookie.setMaxAge(60*60*24*7);
Cookie应该注意的几个问题
  • 1.持久化问题
    默认情况下,cookie中的数据是保存在浏览器的内存中。浏览器一关闭,内存一释放,Cookie中的数据就没了。
        //设置Cookie的保存时间,浏览器会将数据保存在本地磁盘中
        cookie.setMaxAge(60*60*24*7);//一周后清除
        //正数:存在硬盘上
        //负数:默认值-1,存在浏览器内存中
        //0:删除cookie
  • 2.解决中文存储
    tomcat7.0以前,Cookie不支持中文,使用URL编码解码。
    现在tomcat8.5及以上支持中文cookie。
    (1)Cookie中的中文存储乱码问题
String encode = URLEncoder.encode("张三", "utf-8");//编码
String decode = URLDecoder.decode(encode, "utf-8");//解码
//1.创建cookie
        Cookie cookie = new Cookie("name", URLEncoder.encode("张三", "utf-8"));//编码
//设置保存时间
        cookie.setMaxAge(60*60*24*7);
//2.响应cookie
        response.addCookie(cookie);
//3.当浏览器二次请求时,取出
        Cookie[] cookies = request.getCookies();
        if(cookies!=null){
            for (Cookie cookie1 : cookies) {
                if(cookie1.getName().equals("name")){
                    String value = cookie1.getValue();
                    String decode = URLDecoder.decode(value, "utf-8");//解码
                    System.out.println(decode);
                }
            }
        }

(2)获取请求参数的中文乱码问题
get请求不用处理中文乱码

//getParameter获取请求参数,自动解码
		String username = request.getParameter("username");
        System.out.println(username);
//getQueryString获取请求参数,需要自己截取,自己解码
        String queryString = request.getQueryString();
        String[] split = queryString.split("=");
        String decode = URLDecoder.decode(split[1], "utf-8");
        System.out.println(decode);
2.服务端会话技术Session

1.Session会话域:它所代表的范围是一次会话,浏览器与服务器建立的一次链接,在这次链接中可以有多次请求和响应
2.Session可以在多次请求和响应间共享数据
3.Session由服务器创建,我们只需获取使用

  • 存取数据
HttpSession session = request.getSession();
        session.setAttribute("num","100");

HttpSession session = request.getSession();
        Object num = session.getAttribute("num");
        System.out.println(num);
  • 原理:服务端会话技术Session要依赖于Cookie
//请求转发与重定向 都可以关系数据
response.sendRedirect(request.getContextPath()+"/demo2");
request.getRequestDispatcher("/demo2").forward(request,response);
  • Session注意的细节
    1.关闭浏览器后,再次请求。两次请求的jsessionid不一样,因为再次打开是一个新的会话,服务器会创建一个新的session对象,这个新的seesion对象里面你没有存任何数据,取得就是null。
    2.关闭服务器后:
    钝化:服务器正常关闭后,session对象会被存入硬盘中
    活化:服务器再次开启后,将文件还原为内存session中
Session生命周期
  • 1.创建
HttpSession session = request.getSession();
  • 2.销毁
a.服务器关闭时
b.Session超时
				可以在web.xml中配置Session的超时时间
				<session-config>
    					<session-timeout>30</session-timeout>
				</session-config>
c.自杀      session.invalidate();
  • 3.安全退出
    清除Cookie,销毁Session
消除Cookie,把存活时间设为0
销毁Session,  session.removeAttribute();
客户端禁用了Cookie,Session如何自处
第一种方法:手动拼接
		URL重写:http:localhost:8080/...;jsessionid="  ";
第二种方法:调方法
		String href="/demo2";
        href=response.encodeRedirectURL(href);
获取session
getSession():会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
getSession(boolean flag):
		true:默认值,会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
		false:会根据jsessionid值查找是否存在sesison对象,如果没找到,则返回null

四、小案例

1.(登陆) 记住用户名和密码
//登陆成功后,判断是否勾选了记住密码
                    String rember = request.getParameter("rember");
                    if(rember!=null){
                        //勾选了,保存用户名和密码
                        Cookie cookie1 = new Cookie("username", username);
                        Cookie cookie2 = new Cookie("password", password);   
                             
                        cookie1.setMaxAge(60*60*24*Integer.parseInt(rember));                      
                        cookie2.setMaxAge(60*60*24*Integer.parseInt(rember));//设置保存时间
                        response.addCookie(cookie1);
                        response.addCookie(cookie2);//发送到客户端
                    }
//如果勾选了,客户端取出数据,填写在表单中
<%
        Cookie[] cookies = request.getCookies();
        String uname ="";
        String pword ="";
        if(cookies!=null){
            for (Cookie cookie : cookies) {
                if(cookie.getName().equals("username")){
                    uname = cookie.getValue();
                }
                if(cookie.getName().equals("password")){
                    pword = cookie.getValue();
                }
            }
        }
    %>
用户名:<input type="text" name="username" placeholder="请输入用户名" value="<%=uname%>"/>
    <br>
密码:<input type="password" name="password" placeholder="请输入密码" value="<%=pword%>"/>
2.(注册) 校验验证码
//将后台随机生成的验证码,存入session域对象中
String str="abcdefgABCDEFG1234567890";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 1; i <= 4; i++) {
            int index = random.nextInt(str.length());
            char ch = str.charAt(index);
            sb.append(ch);
            g.drawString(ch+"",width/5*i,height/2);
        }
        //验证码设为session域对象
        HttpSession session = request.getSession();
        session.setAttribute("checkCode",sb.toString());//转换为字符串不要忘
//拿到用户输入的验证码
String code = request.getParameter("code");
//获取服务端生成的验证码
HttpSession session = request.getSession();
String checkCode = (String) session.getAttribute("checkCode");
//然后进行比对是否相同

//注意验证码只能使用一次
session.removeAttribute("checkCode");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值