登录注册修改密码回显信息cookie设置免登陆

注册登录整理

把day37中的登录和注册的Servlet统一合并到StudentServlet中

使用action来区分登录和注册

public class StudentServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        String action = request.getParameter("action");
        switch (action){
            case "login":
                login(request,response);
                break;
            case "register":
                register(request,response);
                break;
        }
    }

    private void register(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //2.获取表单数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String sex = request.getParameter("sex");
        String[] hobby = request.getParameterValues("hobby");
        String addrs = request.getParameter("addrs");
        //3.进行数据判断,判断用户名是否存在
        List<Student> list = DBCenter.list;
        for (Student stu: list) {
            if(stu.getUsername().equals(username)){
                response.getWriter().write("用户名已存在,3秒后回到注册页面,或点击<a href='register.html'>注册页面<a/>");
                //设置响应头,使页面3秒后跳转到指定路径
                response.setHeader("refresh","3;url=register.html");
                return;
            }
        }
        //4.创建实体对象,并且存进数据库
        Student student = new Student(username, password, sex, hobby, addrs);
        list.add(student);
        response.getWriter().write("注册成功,3秒后跳转到登录页面,或点击<a href='login.jsp'>登录页面</a>");
        response.setHeader("refresh","3;url=login.jsp");
    }

    private void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //2.获取表单数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //验证码判断
        //前端输入的验证码
        String code = request.getParameter("code");


        //存放在session中--可行
        String code1 = (String)request.getSession().getAttribute("code");
        if(!code1.equals(code)){
            request.setAttribute("msg","验证码错误");
            request.getRequestDispatcher("login.jsp").forward(request,response);
            return;
        }



        //3.判断用户名和密码是否正确
        List<Student> list = DBCenter.list;
        for (Student stu:list){
            if(stu.getUsername().equals(username) && stu.getPassword().equals(password)){
                //登录成功
                response.getWriter().write("登录成功,3秒后跳转到首页;或者点击<a href='index.html'>首页</a>");
                response.setHeader("refresh","3;url=index.html");
                return;
            }
        }


        //1.request(把数据存放在请求中)+转发--可行
        request.setAttribute("msg","用户名或密码错误");
        request.getRequestDispatcher("login.jsp").forward(request,response);
    }
}

  • 前端使用不同的提交方式会有所不同
    • get请求方式提交会覆盖Servlet?后面的数据,必须要把action的属性值放在表单中,隐藏起来
	<form action="StudentServlet?">
        <input type="hidden" name="action" value="login" />
        用户名:<input type="text" name="username"/><br/>
        密码:<input type="text" name="password"/><br/>
        <img src="CheckServlet" alt="验证码出错"><input type="text" name="code"/><br/>
        <input type="submit" value="登录"/>
    </form>
  • post方式直接写在Servlet?后面就可以
<form action="StudentServlet?action=register" method="post">
        用户名:<input type="text" name="username"/><br/>
        密码:<input type="text" name="password"/><br/>
        性别:<input type="radio" name="sex" value="man"/><input type="radio" name="sex" value="women"/><br/>
        爱好<input type="checkbox" name="hobby" value="java"/>敲代码
            <input type="checkbox" name="hobby" value="sleep"/>睡觉
            <input type="checkbox" name="hobby" value="SeeMovie"/>看电影
            <br/>
        地址:<select name="addrs">
                <option value="guandong">广东</option>
                <option value="guanxi">广西</option>
                <option value="jiangxi">江西</option>
            </select><br/>
        <input type="submit" value="注册"/>
    </form>

cookie设置免登陆功能

登录页面提供免登录按钮

免登录:<input type="checkbox" name="remember">

后台根据前端是否勾选免登录来判断是否需要保存cookie,

		//3.判断用户名和密码是否正确
        for (Student stu:list){
            if(stu.getUsername().equals(username) && stu.getPassword().equals(password)){
                //用户登录成功后,判断是否有勾选免登录,cookie设置
                String remember = request.getParameter("remember");
                if(remember != null){
                    //把账号信息设置到cookie中,第一个参数是key,第二个参数是设置value的编码,防止存储中文出错
                    Cookie cookie = new Cookie("username",
                            URLEncoder.encode(username,"utf-8"));
                    //设置cookie的有效时间--单位是秒
                    cookie.setMaxAge(60*60);
                    response.addCookie(cookie);
                }
                //把登录信息(用户名)存储到session中当做用户登录凭证
                request.getSession().setAttribute("username",username);

                response.sendRedirect("index.html");
                return;
            }
        }

登录页面加载页面之前先获取cookie对象数组,判断是否存在登录的对象,存在则直接跳转到首页,记得判断cookies != null,如果不判断直接遍历可能会出现空指针异常

//获取cookie对象数组
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for (Cookie cookie :cookies){
                if("username".equals(cookie.getName())){
                    response.sendRedirect("index.html");
                    break;
                }
            }
        }

基本信息修改

要修改信息要先把后台的信息回显到前端
先到服务器获取数据–使用登录凭证(就是上面登录时设置到session中的username)获取对应对象的数据
响应回前端,并且展示出来

private void toModifyInit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //从session中获取登录凭证
        String username = (String)request.getSession().getAttribute("username");
        Student student = null;
        for (Student stu:list) {
            if (stu.getUsername().equals(username)){
                student = stu;
            }
        }
        if(student != null){
            //把Hobby数组对象处理成字符串形式
            student.setStrHobby(Arrays.toString(student.getHobby()));
            //把对象存储到请求中
            request.setAttribute("student",student);
            //转发
            request.getRequestDispatcher("studentInfo.jsp").forward(request,response);
        }

    }

先在服务器中把Hobby数组转化成strHobby字符串
页面显示:

<%@ page import="com.qf.entity.Student" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2019/2/20 0020
  Time: 上午 11:17
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
      //从请求中获取student对象
      Student stu = (Student)request.getAttribute("student");
    %>
    <form action="StudentServlet?action=modify" method="post">
        用户名:<%= stu.getUsername()%><br/>
        性别:<input type="radio" name="sex" value="man" <%= stu.getSex().equals("man")?"checked='checked'":""%>/>男
        <input type="radio" name="sex" value="women" <%= stu.getSex().equals("women")?"checked='checked'":""%>/>女<br/>
        爱好<input type="checkbox" name="hobby" value="java" <%=stu.getStrHobby().contains("java")?"checked='checked'":""%> />敲代码
        <input type="checkbox" name="hobby" value="sleep" <%=stu.getStrHobby().contains("sleep")?"checked='checked'":""%> />睡觉
        <input type="checkbox" name="hobby" value="SeeMovie" <%=stu.getStrHobby().contains("SeeMovie")?"checked='checked'":""%> />看电影
        <br/>
        地址:<select name="addrs">
                <option value="guandong" <%= stu.getAddrs().equals("guandong")?"selected='selected'":""%>>广东</option>
                <option value="guanxi" <%= stu.getAddrs().equals("guanxi")?"selected='selected'":""%> >广西</option>
                <option value="jiangxi" <%= stu.getAddrs().equals("jiangxi")?"selected='selected'":""%> >江西</option>
            </select><br/>
        <input type="submit" value="修改"/>
    </form>

</body>
</html>

修改和密码重置

修改需要从session中获取username

private void toModify(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1.获取表单信息
//      String username = request.getParameter("username");
        String username = (String)request.getSession().getAttribute("username");
        String sex = request.getParameter("sex");
        String[] hobbies = request.getParameterValues("hobby");
        String addrs = request.getParameter("addrs");
        //2.修改对应的对象信息
        for (Student stu: list) {
            //找到对应的对象--通过useranme进行判断
            if(stu.getUsername().equals(username)){
                stu.setSex(sex);
                stu.setAddrs(addrs);
                stu.setHobby(hobbies);
                break;
            }
        }
        response.sendRedirect("index.html");
    }
密码重置完后需要清除登录状态,跳转到登录页面

5.注销
清除cookie中的username
清除session中的username
跳转到login.jsp

猜你喜欢

转载自blog.csdn.net/qq_36901488/article/details/87776526
今日推荐