Servlet----登录(cookie实现三天免登录)

一:

  1.Servlet流程总结

    (1)浏览器发起请求到服务器(请求)

    (2)服务器接收浏览器的请求,进行解析,创建Request对象存储请求数据

    (3)服务器调用对应的servlet进行请求处理,并将Request对象作为实参传递给Servlet方法

    (4)Servlet调用方法进行请求处理

        ①设置请求编码

          req.setCharacterEncoding("utf-8");

        ②设置响应编码

          resp.setContentType("text/html;charset=utf-8");

        ③获取请求信息

          String xxx = req.getParameter("");

        ④处理请求信息

        ⑤响应处理结果

二.数据流转 

  浏览器----->服务器------>数据库   
  浏览器<-----服务器<------数据库
三.具体实现
  1.包.接口.类
    Servlet(浏览器访问服务器数据接收处理并响应)
      ①CookieServlet 用户访问服务器的servlet
      ②LoginServlet 处理登录请求
      ③PageServlet  返回登录页面
      ④MainServlet  登录成功后返回主界面
    Service(服务层)
      LoginService接口(定义服务的接口)
      impl包
        LoginServiceImpl类(实现LoginService接口并实现)
    dao  (具体实现业务)
      LoginDao接口(定义实现方法的接口)
      impl包
        LoginDaoImpl类(具体实现LoginDao方法)
    pojo  (定义和使用的一些类)
      User类(用于存储用户信息)
  2.
    (1)用户访问定义的首页 此次项目中将/ck 作为首页
        逻辑:
          CookieServlet
          ①用户发送请求,CookieServlet接收后,将请求中的Cookie信息存入Cookie数组中
          ②如果用户之前正确登录过,在请求信息中会附带由uid信息,通过foreach循环遍历Cookie数组,并获得uid信息
            (如果Cookie获取后为null则直接使用请求转发技术转到登录页面)
          ③检验获取的uid是否为空字符,如果为空则请求转发至登录页面.
           通过UID检验用户登录信息是否符合,检验正确则使用重定向至MainServlet,否则请求转发至page
package com.bjsxt.servlet.login;

import com.bjsxt.pojo.User;
import com.bjsxt.service.LoginService;
import com.bjsxt.service.impl.LoginServiceImpl;

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;

/**
 * Cookie信息校验
 *      判断请求中是否携带正确的Cookie信息
 *      如果有则校验Cookie信息是否正确'
 *          如果校验正确则直接响应主页面给用户
 *          如果校验不正确则响应登录页面给用户
 *      没有则请求转发给登录页面.
 *
 */
@WebServlet(name = "CookieServlet")
public class CookieServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码格式
        req.setCharacterEncoding("utf-8");
        //设置响应编码格式
        resp.setContentType("text/html;charset=utf-8");
        //获取请求信息
            //获取Cookie信息
        Cookie cks[] = req.getCookies();
        //处理请求信息
            if(cks!=null){
                //使用uid反向去查数据库,存在即返回用户主页面,否则返回登录页面
                    //遍历Cookie信息
                    String uid = "";
                for (Cookie c:cks) {
                    if("uid".equals(c.getName())){
                        uid = c.getValue();
                    }
                }
                //校验uid是否存在
                if("".equals(uid)){
                    //请求转发
                    req.getRequestDispatcher("page").forward(req,resp);
                    return;
                }else{
                    //校验UID用户信息
                        //获取业务层对象
                    LoginService ls = new LoginServiceImpl();
                    User u = ls.checkUidService(uid);
                    if(u!=null){
                        //重定向
                        resp.sendRedirect("main");
                        return;
                    }else{
                        //请求转发
                        req.getRequestDispatcher("page").forward(req,resp);
                    }
                }
            }else{
                //响应处理结果
                    //请求转发
                    req.getRequestDispatcher("page").forward(req,resp);
            }
    }
}

          
          PageServlet
          ①将网页响应给浏览器,Html中会保存请求发送路径(到LoginServlet)
package com.bjsxt.servlet.login;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class PageServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应编码格式
        resp.setContentType("text/html;charset=utf-8");
        //获取请求信息
        //处理请求
        //响应处理结果
            //获取request作用域数据
        String str = (String) req.getAttribute("str");
        //也可以使用三目运算代替判断
//        str = (String) req.getAttribute("str")==null? "":(String) req.getAttribute("str");
        resp.getWriter().write("<html>");
        resp.getWriter().write("<head>");
        resp.getWriter().write("</head>");
        resp.getWriter().write("<body>");
        if(str!=null){
            resp.getWriter().write("<font color='red' size = '20px'>"+str+"</font>");
        }
        resp.getWriter().write("<form action='login' method = 'get'>");
        resp.getWriter().write("用户名:<input type='text' name='uname' value=''/><br/>");
        resp.getWriter().write("密码:<input type='password' name='pwd' value=''/><br/>");
        resp.getWriter().write("<input type='submit'value='登录'/><br/>");
        resp.getWriter().write("</form>");
        resp.getWriter().write("</body>");
        resp.getWriter().write("</html>");
        System.out.println("返回登录页面成功");
    }
}

          LoginServlet
          ①获取请求中的uname和pwd信息,在数据库中查找是否符合,符合即返回主界面,不符合则请求转发至PageServlet
          
package com.bjsxt.servlet.login;

import com.bjsxt.pojo.User;
import com.bjsxt.service.LoginService;
import com.bjsxt.service.impl.LoginServiceImpl;

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

/**
 * 处理用户请求的登录页面
 * 解决中文乱码问题
 *  ①.使用String.getBytes()方法
 *  ②.直接使用公共配置
 *      get方式:步骤一:req.setCharacterEncoding("utf-8");
 *              步骤二:在tomcat的目录下的conf目录中修改server.xml文件;
 *      post方法:
 *              步骤一:req.setCharacterEncoding("utf-8");
 * Servlet流程总结:
 *          浏览器发起请求到服务器(请求)
 *          服务器接收浏览器的请求,进行解析,创建request对象存储请求数据
 *          服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
 *          servlet的方法执行进行请求处理
 *                  //设置请求编码
 *                  //设置响应编码格式
 *                  //获取请求信息
 *                  //处理请求信息
 *                      //创建业务层对象
 *                      //调用业务层对象的方法
 *                  //响应处理结果
 * 请求转发学习:
 *      作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确.
 *          请求转发使用多个servlet来响应请求,让servlet功能明确.
 *          解决了一次请求内的不同Servlet的数据(请求数据+其他数据)共享问题
 *      使用:req.getRequestDispatcher("servlet别名").forward(req,resp);
 *      特点: 一次请求,请求转发后直接return 结束即可.
 *      作用域:基于请求转发,一次请求中的所有Servlet共享
 *      注意: 使用request对象进行数据流转,数据只在一次请求内有效.
 *      特点:
 *          一次请求.
 *          服务器创建
 *          每次请求都会创建
 *          生命周期一次请求
 * 重定向
 *      解决了表单重复提交的问题,以及但钱servlet无法处理的请求的问题
 *      使用:
 *          resp.sendRedirect(String uri);
 *      示例:
 *          resp.sendRedirect("/login/main");
 *      使用:
 *          response.sendRedirect("路径");
 *          本地路径为:uri
 *          网络路径为:定向资源的URL信息.
 *      特点:
 *          两次请求
 *          浏览器地址栏信息改变
 *          两个request对象
 *      时机:
 *          如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向
 *          如果请求被Servlet接收后,无法处理,建议使用重定向定位到可以处理的资源.
 * servlet的使用流程:
 *          设置请求编码格式
 *          设置响应编码格式
 *          获取请求信息
 *          处理请求信息
 *          响应处理结果
 *数据流转流程
 *          浏览器----->服务器------>数据库
 *          浏览器<-----服务器<------数据库
 *
 */
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码格式
        req.setCharacterEncoding("utf-8");
        //设置响应编码格式
        resp.setContentType("text/html;charset=utf-8");
        //获取请求信息
        String uname = req.getParameter("uname");
//        uname = new String(uname.getBytes("iso8859-1"),"utf-8");
        String pwd = req.getParameter("pwd");
        System.out.println(uname+":"+pwd);
        //处理请求信息
        //获取业务层对象
        LoginService ls = new LoginServiceImpl();
        User u = ls.checkLoginService(uname,pwd);
        //响应处理结果
        if(u!=null){
            //创建Cookie信息实现三天免登录.
                Cookie c = new Cookie("uid",u.getUid()+"");
                //设置Cookie的有效期
                c.setMaxAge(3*24*3600);
                //设置路径
                c.setPath("ck");
                //添加Cookie信息
                resp.addCookie(c);
            //请求转发
                  //req.getRequestDispatcher("main").forward(req,resp);
            //重定向
            resp.sendRedirect("/jdbc_war_exploded/main");
            return;
        }else{
              //使用request对象是实现不同servlet的数据流转,
              req.setAttribute("str","用户名或密码错误");
              //使用请求转发将当前的请求转发给其他servlet
              req.getRequestDispatcher("page").forward(req,resp);
              return;
        }
    }
}

 


         
posted @ 2020-09-13 10:46  relo  阅读(1017)  评论(0)    收藏  举报