JavaWeb网上图书商城完整项目--day02-21.退出功能的实现
1、当用户点击退出的时候,跳转到登陆页面
当用户点击退出的时候,需要将session中保存的登陆的用户销毁掉
当用户点击退出的时候,调用UserServlet的quit方法
退出按钮在top.jsp中,我们修改top.jsp页面的代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>top</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <style type="text/css"> body { background: #15B69A; margin: 0px; color: #ffffff; } a { text-transform:none; text-decoration:none; color: #ffffff; font-weight: 900; } a:hover { text-decoration:underline; } </style> </head> <body> <h1 style="text-align: center;">传智播客网上书城系统</h1> <div style="font-size: 10pt; line-height: 10px;"> <%--依据用户是否登陆显示不同的连接 --%> <c:choose> <c:when test="${empty sessionScope.sessionUser}"> <a href="<c:url value='/jsps/user/login.jsp'/>" target="_parent">传智会员登录</a> | <a href="<c:url value='/jsps/user/regist.jsp'/>" target="_parent">注册传智会员</a> </c:when> <c:otherwise> 传智会员:${sessionScope.sessionUser.loginname} | <a href="<c:url value='/jsps/cart/list.jsp'/>" target="body">我的购物车</a> | <a href="<c:url value='/jsps/order/list.jsp'/>" target="body">我的传智订单</a> | <a href="<c:url value='/jsps/user/pwd.jsp'/>" target="body">修改密码</a> | <a href="<c:url value='/UserServlet?method=quit'/>" target="_parent">退出</a> </c:otherwise> </c:choose> </div> </body> </html>
我们修改UserServlet的代码:
package com.weiyuan.goods.user.web.servlet; import java.io.IOException; import java.net.URLEncoder; import java.util.Map; 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 org.apache.commons.collections.map.HashedMap; import com.weiyuan.goods.user.domian.User; import com.weiyuan.goods.user.service.UserService; import cn.itcast.commons.CommonUtils; import cn.itcast.servlet.BaseServlet; /** * Servlet implementation class UserServlet */ @WebServlet("/UserServlet") public class UserServlet extends BaseServlet{ private static final long serialVersionUID = 1L; private UserService service = new UserService(); /* * 用户注册页面使用ajax校验/* * 用户注册页面使用ajax校验用户名会调用该方法 * *会调用该方法 * */ public String validateLoginname(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //首先获得用户上传的用户名 String loginName = request.getParameter("loginname"); boolean flag = service.ajaxValidateLoginName(loginName); response.getWriter().print(flag); return null; } /* * 用户注册页面使用ajax校验邮箱会调用该方法 * */ public String validateEmail(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //获得用户上传的emai String email = request.getParameter("email"); System.out.println("validateEmail is called"+email); boolean flag = service.ajaxValidateEmail(email); response.getWriter().print(flag); return null; } /* * 用户修改密码页面使用ajax校验原始的密码是否正确 * */ public String validateLoginpass(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //获得用户上传的emai String loginpass = request.getParameter("loginpass"); boolean flag = service.ajaxValidateLoginPass(loginpass); response.getWriter().print(flag); return null; } /* * 用户注册页面使用ajax校验验证码会调用该方法 * */ public String validateVerifyCode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //获得用户上传的verfycode String verifyCode = request.getParameter("verifyCode"); //获得session中保存的验证码 String sessionCode = (String) request.getSession().getAttribute("vCode"); //二者进行比较看是否相等 System.out.println("validateVerifyCode is called"+verifyCode+":"+sessionCode); boolean flag = sessionCode.equalsIgnoreCase(verifyCode); response.getWriter().print(flag); return null; } /* * 当用户从邮箱点击的激活的时候会调用该方法,并且把激活码传递过来 * * */ public String activation(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String activationCode = request.getParameter("activationCode"); System.out.println("email activationCode is :"+activationCode); try { service.activation(activationCode); //激活成功 request.setAttribute("code", "success"); //msg.jsp已经code的值来显示错误信息还是正确的信息 request.setAttribute("msg", "激活成功"); return "f:/jsps/msg.jsp"; } catch (Exception e) { //将业务操作的异常信息在msg.jsp中显示出来 String msg = e.getMessage(); request.setAttribute("code", "error"); //msg.jsp已经code的值来显示错误信息还是正确的信息 request.setAttribute("msg", msg); return "f:/jsps/msg.jsp"; } } /* * 当用户注册的时候会调用该方法 * * */ public String regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("activation is called"); //1、将请求的参数封装成User对象 User user = CommonUtils.toBean(request.getParameterMap(), User.class); //2 、对传递过来的参数进行校验,把错误的信息封装到一个hashMap中 Map errors = validateParams(user, request); if(errors.size() > 0){//说明参数错误,跳转到注册界面提示用户输入的参数有误 request.setAttribute("errors", errors); request.setAttribute("user", user); return "f:/jsps/user/regist.jsp"; } service.addUser(user); request.setAttribute("code", "success"); request.setAttribute("msg", "用户注册成功,请马上到邮箱进行激活"); return "f:/jsps/msg.jsp"; } /* * 当用户登录的时候会调用该方法 * * */ public String login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("activation is called"); /*1、第一步将用户提交的参数封装成javabean对象 * *2、对提交的参数的进行合法性的校验 * *3、通过用户名和密码去查找得到user对象 *如果user对象为null,说明用户名和密码不正确,重定向到login.jsp提示用户名和密码错误 *如果user对象不为null,查看当前用户的激活状态,如果当前用户没有被激活,提示当前用户没有被激活,重定向到login.jsp提示 *如果user对象不为null,并且当前用户处于激活状态,把当前用户保存到session中,显示当前用户是谁 *为了实现页面自定功能,需要把用户名保存到cookie中,主要cookie不支持中文,需要对 *中文进行有效性的处理。 * * * * */ User formUser = CommonUtils.toBean(request.getParameterMap(), User.class); //对参数进行合法性的校验 //2 、对传递过来的参数进行校验,把错误的信息封装到一个hashMap中 Map errors = validateLoginParams(formUser, request); if(errors.size() > 0){//说明参数错误,跳转到注册界面提示用户输入的参数有误 request.setAttribute("errors", errors); request.setAttribute("user", formUser); return "f:/jsps/user/login.jsp"; } User user =service.login(formUser); //判断用户是否为null if(user == null){ request.setAttribute("msg", "输入的用户名和密码不正确"); request.setAttribute("user", formUser); return "f:/jsps/user/login.jsp"; }else{ if(0 == user.getStatus()){ //没有激活 request.setAttribute("msg", "当前用户没有激活,请先激活该用户"); request.setAttribute("user", formUser); return "f:/jsps/user/login.jsp"; } //说明用户登录成功 request.getSession().setAttribute("sessionUser", user); //将用户名保存到cookie中,因为cookie不支持中文使用URL进行编码 Cookie cookie = new Cookie("cookieLoginName", URLEncoder.encode(user.getLoginname(), "utf-8")); cookie.setMaxAge(60*60*24);//cookie的有效期是一天 //添加cookie对象,把cookier对象返回给浏览器 response.addCookie(cookie); //登录成功之后客户端使用redict重新登录到index.jsp主页面 return "r:/index.jsp"; } } public Map validateParams(User user,HttpServletRequest request){ Map<String, String> map = new HashedMap(); //校验用户名 String loginName = user.getLoginname(); if(loginName == null || loginName.isEmpty()){ map.put("loginname", "用户名不能为空"); } if(loginName.length() < 3 || loginName.length() > 20){ map.put("loginname", "用户名长度应该在3到20之间"); } //校验用户名是否注册 if(service.ajaxValidateLoginName(loginName)){ map.put("loginname", "用户名已经被注册"); } //检查登陆密码 String loginpass = user.getLoginpass(); if(loginpass == null || loginpass.isEmpty()){ map.put("loginpass", "登陆密码不能为空"); } if(loginpass.length() < 3 || loginpass.length() > 20){ map.put("loginname", "登陆密码的长度应该在3到20之间"); } //检查确认密码的信息 //检查登陆密码 String reloginpass = user.getReloginpass(); if(reloginpass == null || reloginpass.isEmpty()){ map.put("reloginpass", "登陆密码不能为空"); } if(reloginpass.length() < 3 || reloginpass.length() > 20){ map.put("reloginpass", "登陆密码的长度应该在3到20之间"); } if(!reloginpass.equalsIgnoreCase(loginpass)){ map.put("reloginpass", "两次输入的密码不一样"); } //检查邮箱 String email = user.getEmail(); if(email == null || email.isEmpty()){ map.put("email", "登陆邮箱不能为空"); } //检查邮箱的格式是否正确 if(!email.matches("^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\\.[a-zA-Z0-9_-]{2,3}){1,2})$")){ map.put("email", "邮箱格式不正确"); } //检查验证码是否相等 String verifyCode = user.getVerifyCode(); //获得session中保存的验证码 String sessionCode =(String) request.getSession().getAttribute("vCode"); if(!verifyCode.equalsIgnoreCase(sessionCode)){ map.put("verifyCode", "验证码不正确"); } return map; } public Map validateLoginParams(User user,HttpServletRequest request){ Map<String, String> map = new HashedMap(); //校验用户名 String loginName = user.getLoginname(); if(loginName == null || loginName.isEmpty()){ map.put("loginname", "用户名不能为空"); } if(loginName.length() < 3 || loginName.length() > 20){ map.put("loginname", "用户名长度应该在3到20之间"); } //检查验证码是否相等 String verifyCode = user.getVerifyCode(); //获得session中保存的验证码 String sessionCode =(String) request.getSession().getAttribute("vCode"); if(!verifyCode.equalsIgnoreCase(sessionCode)){ map.put("verifyCode", "验证码不正确"); } return map; } /* * 当用户修改密码的时候会调用该方法 * */ public String updatePassword(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /*业务操作的流程 * 1、将请求的参数封装成javaBean对象 * 2、获得当前登录用户的uuid * 3、利用uuid和原始的密码去查找用户是否存在 * 3、利用uuid去修改新的密码 * * */ System.out.println("updatePassword is called"); User formUser = CommonUtils.toBean(request.getParameterMap(), User.class); //如果用户登录成功了,会在session中保存该用户 User loginUser = (User) request.getSession().getAttribute("sessionUser"); if(loginUser == null){//说明当前用户没有登录,到pwd.jsp显示异常信息 request.setAttribute("msg", "用户没有登录,请先登录在修改用户密码"); return "f:/jsps/user/login.jsp"; } try { service.updateUserPassword(loginUser.getUid(), loginUser.getLoginpass(), formUser.getNewpass()); //说明修改密码成功 request.setAttribute("code", "success"); request.setAttribute("msg", "用户修改密码成功,请重新登录"); return "f:/jsps/msg.jsp"; } catch (Exception e) { //修改密码失败 request.setAttribute("msg",e.getMessage()); return "f:/jsps/user/pwd.jsp"; } } /* * 当用户点击退出按钮的时候调用该放阿飞 * */ public String quit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //将session对象保存的user对象销毁 request.getSession().invalidate();//让session对象无效 return "r:/jsps/user/login.jsp"; } }
posted on 2017-05-16 10:19 luzhouxiaoshuai 阅读(1152) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!