任务目标
按照教材【任务:Filter在Cookie自动登录中的使用】中的实现步骤,完成Filter在Cookie自动登录中的使用代码的编写。完成过程写成实验报告,用word文档上传提交。
实现步骤
1.编写User类
package cn.itcast.chapter09.entity;
public class User {
private String username;
private String password;
public String getUsername(){
return username;
}
public void setUsername(String username){
this.username=username;
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password=password;
}
}
2.编写login.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %>
<html>
<head></head>
<center><h3>用户登录</h3></center>
<body style="text-align: center">
<form action="${pageContext.request.contextPath}/LoginServlet" method="post">
<table border="1" width="600px" cellpadding="0" cellspacing="0" align="center">
<tr>
<td height="30" align="center">用户名:</td>
<td> <input type="text" name="username" />${errerMsg}</td>
</tr>
<tr>
<td height="30" align="center">密 码:</td>
<td> <input type="password" name="password" /></td>
</tr>
<tr>
<td height="35" align="center">自动登录时间</td>
<td><input type="radio" name="autologin">
value="${60*60*24*31}"/>一个月
<input type="radio" name="autologin">
value="${60*60*24*31*3}"/>三个月
<input type="radio" name="autologin">
value="${60*60*24*31*6}"/>半年
<input type="radio" name="autologin">
value="${60*60*24*31*12}"/>一年
<input type="radio" name="autologin">
</td>
</tr>
<tr>
<td height="30" colspan="2" align="center">
<input type="submit" value="登录" />
<input type="reset" value="重置" />
</td>
</tr>
</table>
</form>
</body>
</html>
3.编写index.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>显示登录的用户信息</title>
</head>
<body>
` <br />
<center>
<h3>欢迎光临</h3>
</center>
<br />
<br />
<c:choose>
<c:when test="${sessionScope.user==null}">
<a href="${pageContext.request.contextPath}/login.jsp">用户登录</a>
</c:when>
<c:otherwise>
欢迎您,${sessionScope.user.username} !
<a href="${pageContext.request.contextPath}/LogoutServlet">注销</a>
</c:otherwise>
</c:choose>
<hr />
</body>
</html>
4.编写LoginServlet类
package cn.itcast.chapter09.filter;
import cn.itcast.chapter09.entity.User;
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;
@WebServlet(name = "LoginServlet",urlPatterns = "/LoginServlet")
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
// 获得用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
// 检查用户名和密码
if("itcast".equals(username) && "123456".equals(password)){
// 登录成功,将用户状态User对象存入Session域
User user = new User();
user.setUsername(username);
user.setPassword(password);
request.getSession().setAttribute("user", user);
// 发送自动登录的Session
String autoLogin = request.getParameter("autoLogin");
if (autoLogin != null) {
// 注意Cookie中的密码要加密
Cookie cookie = new Cookie("autologin", username + "-" + password);
cookie.setMaxAge(Integer.parseInt(autoLogin));
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
}
// 跳转至首页
response.sendRedirect(request.getContextPath()+"/index.jsp");
} else {
request.setAttribute("errerMsg", "用户名或密码错误");
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
5.编写LogoutServlet类
package cn.itcast.chapter09.filter;
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;
@WebServlet(name = "LogoutServlet",urlPatterns = "/LogoutServlet")
public class LogoutServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//用户注销
request.getSession().removeAttribute("user");
// 从客户端删除自动登录的Cookie
Cookie cookie = new Cookie("autologin", "msg");
cookie.setPath(request.getContextPath());
cookie.setMaxAge(0);
response.addCookie(cookie);
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
6.编写AutoLoginFilter类
package cn.itcast.chapter09.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import cn.itcast.chapter09.entity.User;
@WebFilter(filterName = "AutoLoginFilter",urlPatterns = "/*")
public class AutoLoginFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
// 获得一个名为autologin的Cookie
Cookie[] cookies = request.getCookies();
String autologin = null;
for (int i=0;cookies!=null && i<cookies.length;i++) {
if ("autologin".equals(cookies[i].getName())) {
// 找到了指定的Cookie
autologin = cookies[i].getValue();
break;
}
}
if (autologin != null) {
// 自动登录
String[] parts = autologin.split("-");
String username = parts[0];
String password = parts[1];
// 检查用户名和密码
if ("itcast".equals(username) && ("123456").equals(password)) {
// 登录成功
User user = new User();
user.setUsername(username);
user.setPassword(password);
request.getSession().setAttribute("user", user);
}
}
// 放行
chain.doFilter(request,response);
}
public void destroy(){
}
}