D14 Sping Boot 入门 Sping框架--Java Web之书城项目(五)

1、登录--显示用户登录名

  Ⅰ、在UserServlet.java里的登录方法里把用户信息保存到session域中

    req.getSession().setAttribute("user",loginUser);//保存用户信息到Sesion域中,为了登陆后显示用户名  

 1  /**
 2      * 处理登录功能
 3      */
 4     protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
 5 
 6 
 7         //1、获取请求的参数
 8         String username = req.getParameter("username");
 9         String password = req.getParameter("password");
10 
11 //        2、调用XXXService.xxx()处理业务/userService.log()登录
12         //判断用户名是否存在
13         if(userService.existUsername(username)){
14 //        userService.login(new User(null,username,password,null));
15             User loginUser = userService.login(new User(null,username,password,null));
16             //3、根据login()方法返回结果判断登录是否成功
17             if(loginUser != null) {
18 
19                 //Ⅰ、成功
20                 System.out.println("login success");
21 
22                 //保存用户信息到Sesion域中,为了登陆后显示用户名
23                 req.getSession().setAttribute("user",loginUser);
24 
25                 //跳到登录成功页面
26                 req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req,resp);
27             }else {
28 //
29 //          Ⅱ、失败
30                 System.out.println("login failed");
31                 //把错误信息和回显信息保存到Resquest域中
32                 req.setAttribute("loginError","用户名或密码错误");
33                 req.setAttribute("username",username);
34 //
35 //              跳回登录页面
36                 req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp);
37             }
38         }else{
39             System.out.println("用户名["+username+"]不存在,请先注册");
40             req.setAttribute("loginError","用户名不存在");
41             req.setAttribute("username",username);
42 //              跳回登录页面
43             req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp);
44         }
45 
46     }
UserServlet.java

  Ⅱ、前端用EL表达式获取用户信息

     "${sessionScope.user.username}" 

 1 <%--如果用户没有登陆,显示登录和注册--%>
 2         <c:if test="${empty sessionScope.user}">
 3             <a href="pages/user/login.jsp">登录</a> |
 4             <a href="pages/user/regist.jsp">注册</a>
 5         </c:if>
 6 
 7         <%--如果用户已经登陆,则显示登录成功之后的用户信息--%>
 8         <c:if test="${not empty sessionScope.user}">
 9             <span>欢迎<span class="um_span">${sessionScope.user.username}</span>光临书城</span>
10             <a href="pages/order/order.jsp">我的订单</a>
11             <a href="index.jsp">注销</a>&nbsp;&nbsp;
12         </c:if>
EL判断是否登录且显示信息

2、登出--用户注销

  1、销毁Session中用户的登录信息(或者销毁Session)

  2、重定向到首页或者登陆页面。

  Ⅰ、在UserServlet.java中添加用户注销方法logout();。

 1  /**
 2      * 处理注销功能
 3      */
 4     protected void logout(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
 5 
 6         //1、销毁Session中用户的登录信息(或者销毁Session)
 7         req.getSession().invalidate();
 8         //2、重定向到首页或者登陆页面。
 9         resp.sendRedirect(req.getContextPath());  //到首页
10 
11 
12     }

  Ⅱ、前端用 <a href="userServlet?action=logout">注销</a> 访问注销

3、表达重复提交之---验证码 

表单重复提交有三种常见的情况:

  一:提交完表单。服务器使用请求转来进行页面跳转。这个时候,用户按下功能键 F5,就会发起最后一次的请求。

    造成表单重复提交问题。解决方法:使用重定向来进行跳转

  二:用户正常提交服务器,但是由于网络延迟等原因,迟迟未收到服务器的响应,这个时候,用户以为提交失败,

    就会着急,然后多点了几次提交操作,也会造成表单重复提交。

  三:用户正常提交服务器。服务器也没有延迟,但是提交完成后,用户回退浏览器。重新提交。也会造成表单重复提交。

 

4、谷歌kaptcha图片验证码的使用

谷歌验证码 kaptcha 使用步骤如下:

  1、导入谷歌验证码的 jar 包

    kaptcha-2.3.2.jar

  2、在 web.xml 中去配置用于生成验证码的 Servlet 程序

1 <servlet>
2         <servlet-name>KaptchaServlet</servlet-name>
3         <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
4 </servlet>
5 
6 <servlet-mapping>
7         <servlet-name>KaptchaServlet</servlet-name>
8         <url-pattern>/kaptcha.jpg</url-pattern>
9 </servlet-mapping>

测试: http://localhost:8080/book/kaptcha.jpg 

  3、在表单中使用img标签去显示验证码并使用它

   新建kaptcha.jsp

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3 <head>
 4     <title>kaptcha</title>
 5 </head>
 6 <body>
 7 
 8 <form action="http://localhost:8080/book/testServlet" method="get">
 9     用户名:<input type="text" name="username" > <br>
10     验证码:<input type="text" style="width: 80px;" name="code">
11     <img src="http://localhost:8080/book/kaptcha.jpg" alt="" style="width: 100px; height: 28px;"> <br>
12     <input type="submit" value="登录"> </form>
13 </body>
14 </html>
kaptcha.jsp

  4、在服务器获取谷歌生成的验证码和客户端发过来的验证码比较使用

   新建TestServlet.java

 1 package com.gychen.web;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.http.HttpServlet;
 5 import javax.servlet.http.HttpServletRequest;
 6 import javax.servlet.http.HttpServletResponse;
 7 import java.io.IOException;
 8 
 9 import static com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY;
10 
11 public class TestServlet extends HttpServlet {
12     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
13 
14         //获取Session中的验证码
15         String token = (String) request.getSession().getAttribute(KAPTCHA_SESSION_KEY);
16 
17         request.getSession().invalidate();
18         //获取验证码
19         String code = request.getParameter("code");
20 
21         //获取用户名
22         String username = request.getParameter("username");
23 
24         if (token != null && token.equalsIgnoreCase(code)){
25             System.out.println("保存到数据库"+username);
26             response.sendRedirect(request.getContextPath()+"/pages/test/ok.jsp");
27         }else {
28 
29             if (token != null && !token.equalsIgnoreCase(code)){
30                 System.out.println("验证码错误");
31             }
32 
33             else {
34                 System.out.println("请不要重复提交表单");
35             }
36         }
37     }
38 
39 
40 }
TestServlet.java

  5、以图书项目为例:

 1 /**
 2      * 处理注册功能
 3      */
 4     protected void regist(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
 5 
 6         //获取Session中的验证码
 7         String token = (String) req.getSession().getAttribute(KAPTCHA_SESSION_KEY);
 8         //删除Session中的验证码,或者销毁
 9         req.getSession().removeAttribute(KAPTCHA_SESSION_KEY);
10 
11         //        1、获取请求参数
12         String username = req.getParameter("username");
13         String password = req.getParameter("password");
14 //        String repwd = req.getParameter("repwd");
15         String email = req.getParameter("email");
16         String verification_code = req.getParameter("verification_code");
17 
18         //使用BeanUtils注入参数
19 //        try {
20 //            User user = new User();
21 //            System.out.println("参数注入前:"+user);
22 //            /**
23 //             * 把所有请求的参数都注入到user对象中
24 //             */
25 //            BeanUtils.populate(user,req.getParameterMap());
26 //            System.out.println("参数注入之后:"+user);
27 //        } catch (Exception e) {
28 //            e.printStackTrace();
29 //        }
30 
31         //使用封装好的bean工具类来注入参数
32 //        //法一
33 //        User user = new User();
34 //        WebUtils.copyParamToBean(req.getParameterMap(),user);
35 //        //法二
36 //        User user = (User) WebUtils.copyParamToBean(req.getParameterMap(),new User());
37 
38         //法三
39         User user =  WebUtils.copyParamToBean(req.getParameterMap(),new User());
40 
41 //        2、检查验证码是否正确
42         if (token != null && token.equalsIgnoreCase(verification_code)){
43 
44 //          Ⅰ、正确
45 
46 //              3、检查用户名是否可用
47             if(userService.existUsername(username)){
48 //                  ①、不可用
49 //                      跳回注册页面
50                 System.out.println("用户名["+username+"]已存在");
51                 //把错误信息和回显保存到Request域中
52                 req.setAttribute("registError","用户名已存在");
53                 req.setAttribute("username",username);
54                 req.setAttribute("email",email);
55                 req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp);
56             }else{
57 //                  ②、可用
58                 System.out.println("用户名["+username+"]可用");
59 //                      调用Service保存到数据库
60                 userService.registUser(new User(null,username,password,email));
61 //                      跳到注册成功页面
62                 req.getRequestDispatcher("/pages/user/regist_success.jsp").forward(req,resp);
63             }
64 
65         }else if (token != null && !token.equalsIgnoreCase(verification_code)){
66 //          Ⅱ、错误
67 //              跳回注册页面
68             System.out.println("验证码错误["+verification_code+"]错误");
69             //把错误信息和回显保存到Request域中
70             req.setAttribute("registError","验证码错误");
71             req.setAttribute("username",username);
72             req.setAttribute("email",email);
73             req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp);
74         }else if (token ==null){
75 
76             //Ⅲ、重复提交
77             //跳回注册页面
78             System.out.println("表单重复提交");
79             //把错误信息和回显保存到Request域中
80             req.setAttribute("registError","表单重复提交");
81             req.setAttribute("username",username);
82             req.setAttribute("email",email);
83             req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp);
84         }
85     }
regist();
1 <label>验证码:</label>
2 <input class="itxt" type="text" name="verification_code" style="width: 100px;" id="code"/>
3 <img alt="" src="kaptcha.jpg" style="float: right; margin-right: 40px;width: 110px;height: 30px;">
4 <br />

   6、点击验证码图片刷新验证码 

 1         <script type="text/javascript">
 2             // 页面加载完成之后
 3             $(function () {
 4 
 5                 /**
 6                  * 给验证码图片添加单击事件
 7                  */
 8                 $("#code_img").click(function () {
 9                     //this.src表示img标签的src属性,可读可写
10                     //加时间戳是为了兼容IE和火狐点击不重新访问的问题。有缓存,请求参数一样的话会先从缓存里找
11                     this.src = "${pageScope.basePath}kaptcha.jpg?=" + new Date();
12                 });
13 
14             });
15 
16         </script>
click刷新事件

 

posted @ 2020-04-11 15:22  nuister  阅读(225)  评论(0编辑  收藏  举报