案例要求
NOTE:1.当用户登录时可以选择自动登录时长
2.登陆失败(账号/密码错误)要返回登录页且在登录页显示(账号或密码错误)
3.登陆成功后若关闭浏览器再打开该页面仍保持已登录状态
4.当用户选择退出登录(注销)时,退出用户登录
2.登陆失败(账号/密码错误)要返回登录页且在登录页显示(账号或密码错误)
3.登陆成功后若关闭浏览器再打开该页面仍保持已登录状态
4.当用户选择退出登录(注销)时,退出用户登录
代码实例
新建类User
package Bean;
public class User {
private String name;
private String password;
public User (String name, String password){
this.name = name;
this.password = password;
}
public User(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
登录页”login.jsp”
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2021/4/13
Time: 14:37
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head></head>
<center><h3>用户登录</h3></center>
<body style="text-align: center;">
<form action="/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" /></td>
</tr>
<%
//获取LoginServlet中32行error的值并赋值给变量"a".
String a=(String) session.getAttribute("error");
//实现消除主页面一直提示为"null"情况:
//判断变量"a"返回值是否为空[如果为空则证明登陆成功,不为空则登陆失败].
if (a!=null){ //如果不为空
out.print(a); //输出变量"a"的值.
}
else{ //反之输出"",[即为空,什么都没有]
out.print("");
}
%>
<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 }" />一年
</td>
</tr>
<tr>
<td height="30" colspan="2" align="center">
<input type="submit" value="登录" />
<input type="reset" value="重置" />
</td>
</tr>
</table>
</form>
</body>
<html>
编写首页(登陆成功页)index.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2021/4/13
Time: 15:25
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>
<c:choose>
<c:when test="${user==null}">
<a href="/login.jsp">请登录</a>
</c:when>
<c:otherwise>
${user.name}欢迎您!
<a href="/LogOutServlet">注销</a>
</c:otherwise>
</c:choose>
</body>
</html>
创建登录处理服务器:LoginServlet
package Servlet;
import Bean.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");//设置编码格式,否则输出为乱码或"???"
PrintWriter out=response.getWriter();
request.setCharacterEncoding("utf-8");
//获取参数值
String name=request.getParameter("username");
String password=request.getParameter("password");
//验证信息是否正确,admin 123
//信息正确,将数据存入域中,跳转至后台页面index.jsp
if (name.equals("admin")&&password.equals("123")){
User user=new User(name,password);
request.getSession().setAttribute("user",user);
String logintime=request.getParameter("autologin");//获取自动登录时间
//创建cookie,存储自动登录的状态
Cookie cookie=new Cookie("autolog",name+"-"+password);//admin-123
cookie.setMaxAge(Integer.parseInt(logintime));//设置cookie生存时长,将自动登录的时间的字符串表示转换成int
cookie.setPath("/");//设置cookie路径
response.addCookie(cookie);//将cookie带回浏览器
//重定向至后台页面
response.sendRedirect("/index.jsp");
}
//信息不正确,将错误提示存入域中,跳转回登录页面login.jsp
else{
HttpSession session=request.getSession();
// request.getSession().setAttribute("error","用户名或密码错误!");
session.setAttribute("error","用户名或密码错误!");
Cookie c=new Cookie("JSESSIONID",session.getId());
c.setPath(request.getContextPath());
c.setMaxAge(3);//生存时间,以秒为单位.
response.addCookie(c);//将变量"c"添加到浏览器请求头
response.sendRedirect("http://localhost:8080/login.jsp");//重定向至URL:"http://localhost:8080"
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
创建登录过滤器:LoginFilter
package Filter;
import Bean.User;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter("/*")
//拦截所有请求响应
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//是否能获取存储自动登录状态的cookie-----name:autolog
HttpServletRequest request=(HttpServletRequest)req;
Cookie cookies[]=request.getCookies();
String value=null;
for (int i=0;cookies!=null&&i<cookies.length;i++){
if (cookies[i].getName().equals("autolog")){//如果找到名为"autolog"的cookie
value=cookies[i].getValue();//获取该cookie的值(name-passowrd)
break;
}
}
if (value!=null){
String str[]= value.split("-");//{name,password}
String username=str[0];
String password=str[1];
if (username.equals("admin")&&password.equals("123")){
User user=new User(username,password);
request.getSession().setAttribute("user",user);
}
}
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
注意事项
NOTE:该项目有需待优化项(所属密码错误时登录页显示信息代码块),待优化完毕后会重新上传,已购买用户无需再次付费!
NOTE:该项目需要jar包,如有需要请在前几篇文章中查找,或在专属板块:Admin生态圈->专业类Software中查找”JavaWeb-Jar包”
项目下载



