使用Filter实现自动登录

来源:互联网 发布:淘宝是p2p技术 编辑:程序博客网 时间:2024/05/10 13:24

参考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>
原创粉丝点击