JavaWeb——day36 jsp,刷新,会话技术,cookie,编码解码,Session

登录注册不是很清楚

jsp

Java Server Pages Java服务器端页面

概念

一种既可以写html,css,javascrpt,又可以写java代码的动态网页开发技术

功能

简化书写

原理

本质上就是servalert
服务器查找jsp,如果存在,又jsp转化引擎转换为.java的类文件(定义的是Servlet),调用javac,编异成字节码文件,然后就可以使用对外提供服务

jsp脚本

勇于初识java代码
<%%>定义在servlet方法中
<%!%>定义在成员变量中
<%=%>定义在Servlet输出方法中

  <%--定义在成员变量中--%>
  <%!
   
  int b=200;
  %>

  <%--定义在Servlet的方法中--%>
  <%
   
  int a=100;
  
  %>
  <%--直接定义在输出语句中--%>
  <%="aaa"%>
定时刷新refresh
  • 响应头的格式
    refresh:秒数;url=跳转的路径
  • 设置响应头
    response.setHeader(String key,String value);设置字符串形式的响应头
    response.addHeader(String key,String value);追加响应头, 若之前设置设置过这个头,则追加;若没有设置过,则设置
  • 设置 定时刷新
    respinse.setHeader(“refresh”,“3;url=/login.html”)
package jsp20190906;

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 java.io.IOException;

/**
 * @Description:刷新技术
 * @Author:@李小白
 * @Date:2019/9/6 21:27
 */
@WebServlet(name = "ServletDemo01")
public class ServletDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置撒刷新技术
        //防止响应乱码
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("3秒后重新跳回登录页面");
        response.setHeader("refresh","3;url=/login.html");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

会话技术

概念:

在一次会话中共享数据.浏览器和服务器的一次通信,包含多次请求,多次响应.在这次会话中共享数据

分类
  • 客户端会话技术(cookie):可减轻服务端压力,数据不安全
  • 服务端会话技术(Session):
客户端会话技术
原理
  1. 客户端发送一个资源,服务端做出响应,会发送set-cookie头,共享数据,客户端接收到响应后,就会把数据存储到客户端的浏览器中
  2. 客户端再次请求的时候,会通过set-cookie头进行携带数据,服务端接收到请求会解析获取的数据

java实现cookie

甜点,曲奇饼

  • 发送Cookie
    //创建Cookie对象
    Cookie c = new Cookie(“username”,“zhangsan”);
    //发送Cookie对象
    respinse.addCookie©;
  • 接收Cookie
    //获取所有的cookie
    Cookie[] cs = request.getCookie();
    //遍历
    if(sc!=null){
    for(Cookie c:cs){
    String name = c.getName();
    if(“msg”.equals(name)){
    String value = c.getValue();
    }
    }
    }
package jsp20190906;

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 java.io.IOException;

/**
 * @Description:TODO
 * @Author:@李小白
 * @Date:2019/9/6 22:14
 */
@WebServlet(name = "ServletDemo02")
public class ServletDemo02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //用Cookie实现java

        //第一次请求的时候
        //创建一个Cookie对象
        Cookie username = new Cookie("usernam", "zhangsan");
        Cookie password = new Cookie("password", "123456");
        //设置保存时间
        username.setMaxAge(60*60*7);
        password.setMaxAge(60*60*7);
        //响应Cookie
        response.addCookie(username);
        response.addCookie(password);

        //第二次请求的时候,取出Cookie
        Cookie[] cookies = request.getCookies();
        //遍历取出来的Cookie数字
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("username")){
                String value = cookie.getValue();
                System.out.println(value);
            }
            if (cookie.getName().equals("password")) {
                String value = cookie.getValue();
                System.out.println(value);
            }
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

  • 案例:记住用户名和密码
    只更改登陆成功后和页面上显示的部分
    两处都用Cookie会话来处理
    加入德鲁伊和MySql的资源,和德鲁伊的配置
package denglu;

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 java.io.IOException;
import java.util.Set;

/**
 * @Author: ShenMouMou
 * @CreateTime: 2019-09-04 14:47
 * @Description:西部开源教育科技有限公司
 */
@WebServlet(name = "LoginServlet", value = "/login")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //System.out.println("收到请求了");
        //处理post请求和响应的乱码
        try {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            //获取请求参数的值
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            //对username和password做二次校验
            String regx = "[a-zA-Z]{6,16}";
            String regx2 = "[0-9]{6,16}";
            if (username.matches(regx) && password.matches(regx2)) {
                //查询数据库,比对用户名和密码
                boolean b = JDBCUtils.login(username, password);
                if (b) {


                    //判断登录成功之后记住密码
                    //判断是否记记住
                    String rember = request.getParameter("rember");
                    //建立Cookie对象
                    Cookie username1 = new Cookie("username", "lisi");
                    Cookie password1 = new Cookie("password", "123456");
                    //设置保存时间
                    username1.setMaxAge(60*60*7);
                    password1.setMaxAge(60*60*7);
                    //响应Cookie
                    response.addCookie(username1);
                    response.addCookie(password1);


                    //我们可以跳转到主页
                    request.setAttribute("username", username);
                    request.getRequestDispatcher("/WEB-INF/home.jsp").forward(request, response);

                } else {
                    //给出提示
                    request.setAttribute("msg", "用户名或密码输入错误,请重新输入");

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

                }


            } else {
                response.getWriter().write("<h1 style='color:red'>呵呵!哥们,有经验</h1>");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

<%--
  Created by IntelliJ IDEA.
  User: ShenMouMou
  Date: 2019/9/4
  Time: 14:48
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--密码显示在网页上--%>
<%
    //第二次请求
    Cookie[] cookies = request.getCookies();
//    开始遍历cookie中的数据,在响应不为空的情况下
    if (cookies!=null) {
        for (Cookie cookie : cookies) {
            if(cookie.getName().equals("username")){
                String value = cookie.getValue();
                System.out.println(value);
            }
            if (cookie.getValue().equals("password")) {
                String value = cookie.getValue();
                System.out.println(value);
            }
        }
    }



%>

<center>
    <form action="${pageContext.request.contextPath}/login" method="post" onsubmit="return checkAll()">
        用户名: <input type="text" name="username" placeholder="请输入用户名6-16位字母" value="<%=username%>"/>
        <br>

        密码: <input type="password" name="password" placeholder="请输入密码6-16位数字" value="<%=password%>"/>
        <br>

        记住密码:<input type="radio" name="rember" value="7" /> 记住一周
        <input type="radio" name="rember" value="30" /> 记住一月
        <br>
        <input type="submit" value="登录">


    </form>
    <div style="color:red">
        <%--在页面上取出域中的数据--%>
        <%=request.getAttribute("msg") == null ? "" : request.getAttribute("msg")%>
    </div>
</center>
<script>
    function checkAll() {
        return true;
    }
</script>
</body>
</html>

JDBC部分

package denglu;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

/**
 * @Author: ShenMouMou
 * @CreateTime: 2019-09-04 15:02
 * @Description:西部开源教育科技有限公司
 */
public class JDBCUtils {
    public static boolean login(String username,String password) throws Exception {
        //德鲁伊连接池
        Properties properties = new Properties();
        InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
        properties.load(in);
        DataSource dataSource = new DruidDataSourceFactory().createDataSource(properties);
        Connection connection = dataSource.getConnection();
        //QueryRunner runner = new QueryRunner(dataSource);
        //runner.query("select * from users where username=? and password=?",new BeanHandler<>(),username,password);
        PreparedStatement preparedStatement = connection.prepareStatement("select * from user where username=? and password=?");
        preparedStatement.setString(1,username);
        preparedStatement.setString(2,password);
        ResultSet resultSet = preparedStatement.executeQuery();


        return resultSet.next();
    }


}

Cook细节
1.持久化

默认存储在浏览器的内存中,关闭浏览器的话就会释放内存,Cookie消失

  • 解决:
    设置保存时间
    request.setMaxAge(int second):
    正数:放在硬盘上
    负数:默认值为-1,存储在浏览器的内存中
    0:删除Cookie中的数据
2.不垮浏览器
3.不支持中文,cookie可以直接存储中文,不需要编码解码了
  • 注意Tomcat8.5及以上支持中文cookie,Tomcat7.0不支持中文cookie
  • 解决不可用中文编码的情况:
package jsp20190906;

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 java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;

/**
 * @Description:Cookie
 * @Author:@李小白
 * @Date:2019/9/6 22:14
 */
@WebServlet(name = "ServletDemo02")
public class ServletDemo02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //用Cookie实现java

        //第一次请求的时候
        //创建一个Cookie对象
       //先进行编码
        Cookie username = new Cookie("username",URLDecoder.decode("王五","utf-8"));
        //设置保存时间
        username.setMaxAge(60*60*7);

        //响应Cookie
        response.addCookie(username);


        //第二次请求的时候,取出Cookie
        Cookie[] cookies = request.getCookies();
        //遍历取出来的Cookie数字
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("username")){
                String value = cookie.getValue();
//先进行解码,但是getParmmter不需要解码,getQueryString需要解码
                String decode = URLDecoder.decode(value, "utf-8");
                System.out.println(decode);

            }

        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

动态获取配置路径

${pangeContext.request.contextpath}

服务端会话技术Session

主菜,硬菜
将数据存储在服务器端

原理

Session依赖于Cookie的存在
浏览器和服务器在一次会话中共享数据

java实现Session

Session细节

  • 1.浏览器关闭了,session不一样了?
    Cookie没了。jsessionid没了。
    服务器关闭了,session一样吗?不一样。内存释放了。

  • 2.优化:虽然对象不一样了,但是session中存储的数据还是一样的
    钝化:服务器正常关闭后,session对象被写入硬盘的文件中
    活化:服务器开启后,将文件还原为内存的session对象

  • 3.Session生命周期
    创建:request.getSession()
    会根据jsessionind值查找是否存在session对象,如果没有找到的话就会自动创建一个

  • 销毁:
    1.服务器关闭
    2.session超时

    30

3.自杀 invalidate():session自杀了

  • 4.如果客户端禁用了 cookie,session该如何自处?
    * 客户端禁用了cookie,session将不一样。
    URL重写:
    http://localhost:8080/day09/s1;jsessionid=731DED0DC4F0AA06CDBB815733D4043E
    PrintWriter pw = response.getWriter();
    HttpSession session = request.getSession();
    String id = session.getId();

    String href = “/day09/s1”;
    href = response.encodeRedirectURL(href);
    System.out.println(href);
    pw.write(“s1”);

  • 5获取session:
    getSession():会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
    getSession(boolean flag):
    true:默认值,会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
    false:会根据jsessionid值查找是否存在sesison对象,如果没找到,则返回null

登录:

* 验证码
	* 分析数据使用几次?
		* 一次:request,转发
		* 一个用户多次 session,重定向
		* 所有用户共享: ServletContext 重定向
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值