项目四阶段搭建
- 项目搭建
- v3 -> v4
保持登录状态
- 需求
- 登录成功之后,在login_success.html、index.html页面,显示用户信息。
- 分析
- ServeltRequest:登录成功之后,使用的是重定向,而重定向是新的请求
- ServletContext : 登录成功之后,所有人都可以拿到你的个人的用户信息
- Cookie:登录成功之后,将个人信息存储到浏览器的缓存文件,存在一定的安全问题
- Session:登录成功之后,将个人信息存储到服务器
- 代码实现
public void login(HttpServletRequest request, HttpServletResponse response) {
//处理请求
String username = request.getParameter("username");
String password = request.getParameter("password");
UserService userService = new UserServiceImpl();
try {
User user = userService.login(username, password);
//调度页面
if (null != user) {
//登录成功 ,将用户信息存储到session, 跳转到login_success.html (重定向)
request.getSession().setAttribute("existUser", user);
response.sendRedirect(request.getContextPath() + "/user?method=toLoginSuccessPage");
} else {
//登录失败 , 跳转回login.html (请求转发)
String errorMsg = "账户或密码错误!";
request.setAttribute("errorMsg", errorMsg);
toLoginPage(request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//index.html
<!-- 登录前风格-->
<div class="topbar-right" th:if="${null == session.existUser}">
<a th:href="@{/user(method=toLoginPage)}" class="login">登录</a>
<a th:href="@{/user(method=toRegistPage)}" class="register">注册</a>
<a
href="pages/cart/cart.html"
class="cart iconfont icon-gouwuche">
购物车
<div class="cart-num">3</div>
</a>
<a th:href="@{/manager.html}" class="admin">后台管理</a>
</div>
<!-- 登录后风格-->
<div class="topbar-right" th:if="${null != session.existUser}">
<span>欢迎你<b th:text="${session.existUser.userName}">张总</b></span>
<a href="#" class="register">注销</a>
<a
href="pages/cart/cart.jsp"
class="cart iconfont icon-gouwuche
">
购物车
<div class="cart-num">3</div>
</a>
<a href="pages/manager/book_manager.html" class="admin">后台管理</a>
</div>
注销登录功能
- 需求
- 在index.html、login_success.html页面,点击注销按钮,完成注销功能,回到index.html
- 代码实现
/**
* 注销登录功能
* @param request
* @param response
*/
public void logout(HttpServletRequest request,HttpServletResponse response){
//将保存在session的用户信息移除
request.getSession().removeAttribute(BookstoreConstant.SESSION_KEY_USER);
//移除成功之后
try {
response.sendRedirect(request.getContextPath() + "/index.html");
} catch (IOException e) {
e.printStackTrace();
}
}
<a th:href="@{/user(method=logout)}">注销</a>
图片验证码Kaptcha
- 概述
- 通过让用户填写验证码并在服务器端检查,防止浏览器端使用程序恶意访问。
- 开发步骤
- ①引入Kaptcha的相关jar包
- ②配置一个KaptchaServlet
- 用于生成一个图片验证码 , 该图片验证码的内容存储到了Session中(KAPTCHA_SESSION_KEY)
- ③测试匹配图片验证码
- ①引入Kaptcha的相关jar包
- ②配置一个KaptchaServlet
<!--图片验证码-->
<servlet>
<servlet-name>KaptchaServlet</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>KaptchaServlet</servlet-name>
<url-pattern>/kaptcha</url-pattern>
</servlet-mapping>
③测试匹配图片验证码
@WebServlet("/demo01")
public class Demo01Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取用户输入的验证码
String inputCode = req.getParameter("code");
//获取图片验证码的内容
Object existCode = req.getSession().getAttribute("KAPTCHA_SESSION_KEY");
//两个验证码匹配
System.out.println(inputCode.equals(existCode) ? "验证码正确!" :"验证码错误!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Kaptcha相关配置
- 代码实现
<!--图片验证码-->
<servlet>
<servlet-name>KaptchaServlet</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
<!--设置边框-->
<init-param>
<param-name>kaptcha.border</param-name>
<param-value>yes</param-value>
</init-param>
<!--设置边框颜色-->
<init-param>
<param-name>kaptcha.border.color</param-name>
<param-value>red</param-value>
</init-param>
<!--设置边框粗细-->
<init-param>
<param-name>kaptcha.border.thickness</param-name>
<param-value>10</param-value>
</init-param>
<!--设置内容-->
<init-param>
<param-name>kaptcha.textproducer.char.string</param-name>
<param-value>0123456789</param-value>
</init-param>
<!--设置验证码长度-->
<init-param>
<param-name>kaptcha.textproducer.char.length</param-name>
<param-value>4</param-value>
</init-param>
<!--设置字体样式-->
<init-param>