参考CSDN的下次自动登录,使用Filter实现自动登录的操作。
过滤器:
*/
@WebFilter(value="/login.jsp")
public class AutoLoginFilter implements Filter {
/**
* Default constructor.
*/
public AutoLoginFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//强制转换为Http的请求和响应
HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse rep=(HttpServletResponse) response;
//验证是否登录
if(req.getSession().getAttribute("user")==null){
//从Cookie获取上次保存的账号和密码
Cookie[] cks=req.getCookies();
User user=null;
for(Cookie c:cks){
if(c.getName().equals("user")){
String[] us=c.getValue().split("@");
user=new User();
user.setUsername(us[0]);
user.setPass(us[1]);
break;
}
}
//如果存储Cookie,那么就实现自动登录
if(user!=null){//需要自动登录
// 登录校验
User user1 = DbHelper.querySingle("select * from tb_user where username=?", User.class, user.getUsername());
boolean res=true;
if (user1 != null) {
if (user.getPass().equals(user1.getPass())) {
req.getSession().setAttribute("user", user);
res=false;
rep.sendRedirect(req.getServletContext().getContextPath()+"/success.jsp");
}
}
if(res){//登录失败,之前的记录账号和密码错误
Cookie ck=new Cookie("user","");
ck.setPath("/");
ck.setMaxAge(0);
rep.addCookie(ck); rep.sendRedirect(req.getServletContext().getContextPath()+"/login.jsp");
}
}
else{//直接登录页面
chain.doFilter(request, response);
}
}
else{//如果已经登录,那么就直接放行
rep.sendRedirect("success.jsp");
}
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
登录的Servlet
@WebServlet("/userlogin")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("进行登录");
String msg = "账号或密码错误";
String u = request.getParameter("un");
String p = request.getParameter("pw");
String al = request.getParameter("autologin");
// 请求来自登录页面
if (StringUtils.checkEmpty(u, p)) {
// 登录校验
User user = DbHelper.querySingle("select * from tb_user where username=?", User.class, u);
if (user != null) {
if (p.equals(user.getPass())) {
//登录成功将用户信息存储到Session中
request.getSession().setAttribute("user", user);
// 如果选择了自动登录,那么需要添加到Cookie
if (al != null && al.equals("1")) {
Cookie cookie = new Cookie("user", u + "@" + p);
cookie.setPath("/");
cookie.setMaxAge(30 * 24 * 60 * 60);
response.addCookie(cookie);
}
msg = "";
}
}
}
if (msg.length() > 0) {
request.setAttribute("msg", msg);
request.getRequestDispatcher("login.jsp").forward(request, response);
} else {
response.sendRedirect("success.jsp");
}
}
}
注销的Servlet
@WebServlet("/loginout")
public class LoginOutServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginOutServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getSession().removeAttribute("user");
// 点击注销之后,默认取消自动登录
//点击注销,让Cookie失效
Cookie ck=new Cookie("user","");
ck.setPath("/");
ck.setMaxAge(0);
response.addCookie(ck);
response.sendRedirect("success.jsp");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
登录页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>账号登录</title>
<style type="text/css">
#dv1{
border: 1px solid #D5DCE5;
}
.t_1{
border: 1px solid #38A9D3;
width: 80%;
font-size: 20px;
}
.btn_1
{
background-color: #C90A16;
color: white;
width: 80%;
font-size: 25px;
}
</style>
</head>
<body>
<form action="userlogin" method="post">
<table width="90%" align="center">
<tr>
<td width="60%" align="right">
<img src="https://csdnimg.cn/passport/login-banner.png" style="margin-top: 40px;margin-right: 20px" height="400px"/>
</td>
<td><div id="dv1" style="margin-top: 40px;">
<table width="100%" height="400px" cellspacing="20px">
<tr><td align="center"><p style="color: red" >${msg }</p></td></tr>
<tr><td><h2>账号登录<h2></td></tr>
<tr><td align="center"><input name="un" class="t_1"/></td></tr>
<tr><td align="center"><input name="pw" type="password" class="t_1"/></td></tr>
<tr><td><input name="autologin" value="1" style="margin-left: 40px" type="checkbox"/>下次自动登录</td></tr>
<tr><td align="center"><input type="submit" class="btn_1" value="登录"/></td></tr>
</table>
</div>
</td>
</tr>
</table>
</form>
</body>
</html>
主页:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>恭喜你</title>
<style type="text/css">
body {
background: url("t.PNG");
}
</style>
</head>
<body>
<p style="margin-top: -5px"><a href="login.jsp">登录</a>|
欢迎:${user.username }|
<a href="loginout">注销</a></p>
</body>
</html>