使用Filter实现自动登录

参考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>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值