【过滤器】(3)过滤器的应用案例:网站自动登录技术(Cookie记忆)

来源:互联网 发布:ttip数据什么意思 编辑:程序博客网 时间:2024/06/05 13:21

一、实现用户自动登录的解决方案

1、设置一个全站拦截的过虑器。

2、当选择自动登录时候利用Cookie记录当前用户的登录信息。

3、此过虑器中,读取用户带过来的Cookie信息,然后从中读取用户的用户名和密码,自动帮助用户登录。

4、即可实现自动登录功能。

5、如图:

第一次登录,输入用户信息:

这里写图片描述

登录成功后显示用户状态:

这里写图片描述

二、项目分层

这里写图片描述

1、index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>演示自动登录</title>  </head>  <body>    <h2>演示自动登录技术</h2>    <c:if test="${!empty sessionScope.pass}">        <font color="green">${pass}</font><br/>        <!-- 一定要将上一次的错误信息清除掉 -->        <c:remove var="pass" scope="session"/>    </c:if>    <c:if test="${!empty sessionScope.error}">        <font color="red">${error}</font><br/>        <!-- 一定要将上一次的错误信息清除掉 -->        <c:remove var="error" scope="session"/>    </c:if>    <c:if test="${empty sessionScope.name}" var="boo">        <form action="<c:url value='/LoginServlet'/>" method="post">            姓名:<input type="text" name="name"/><br/>            密码:<input type="password" name="pwd"/><br/>            自动登录:            <input type="radio" name="time" value="0"/>不自动登录            <input type="radio" name="time" value="1"/>1天            <input type="radio" name="time" value="7" checked="checked"/>7天<br/>            <input type="submit" value="登录"/>         </form>    </c:if>    <c:if test="${!boo}">        欢迎你,${sessionScope.name} <br/>        <a href="<c:url value='/CancelAutoLoginServlet'/>">取消自动登录</a><br/>        <a href="<c:url value='/jsps/safe/1.jsp'/>">会员页面1</a><br/>    </c:if>  </body></html>

2、LoginServlet.java:

package cn.hncu.servlets;import java.io.IOException;import java.net.URLEncoder;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        request.setCharacterEncoding("utf-8");        String name = request.getParameter("name");        String pwd = request.getParameter("pwd");        String time = request.getParameter("time");        //按理应该访问数据库的,但是这里模拟一下        if(name!=null && name.trim().startsWith("hncu")){            if(pwd!=null && pwd.length()>4){                /**为了实现自动登录成功,这里使用Cookie技术,利用Cookie技术存储当前用户登录的信息,                 * 当用户下一次点击自动登录的时候可以从Cookie中读取出信息,然后自动登录。                 */                //实现自动登录功能---利用Cookie存储信息                name = URLEncoder.encode(name, "utf-8");                pwd = URLEncoder.encode(pwd, "utf-8");                Cookie c = new  Cookie("autoLogin", name+"@#"+pwd);                c.setPath(request.getContextPath());//设置Cookie存储的位置                c.setMaxAge(24*60*60*Integer.parseInt(time));                response.addCookie(c);                request.getSession().setAttribute("name", name);                request.getSession().setAttribute("pass", "登录成功!");            }else{                request.getSession().setAttribute("error", "密码错误!");            }        }else{            request.getSession().setAttribute("error", "用户名不存在!");        }        response.sendRedirect(request.getContextPath()+"/index.jsp");    }}

3、自动登录过滤器:AutoLoginFilter.java:

package cn.hncu.filters;import java.io.IOException;import java.net.URLDecoder;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;/*** *  * 自动登录功能: *  * (1)浏览器每次登录的时候都是从Cookie中读取Cookie信息 (2)将读取出来的Cookie信息,设置到登录的地方 *  */public class AutoLoginFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        // 读取Cookie中的信息        HttpServletRequest req = (HttpServletRequest) request;        if (req.getSession().getAttribute("name") == null) {            Cookie[] cs = req.getCookies();            if (cs != null) {                for (Cookie c : cs) {                    if (c.getName().equals("autoLogin")) {                        System.out.println("找到自动登录的cookie");                        String val = c.getValue();                        String[] strs = val.split("@#");                        String name = URLDecoder.decode(strs[0], "utf-8");                        String pwd = URLDecoder.decode(strs[1], "utf-8");                        if (name != null && name.startsWith("hncu")                                && pwd != null && pwd.length() > 5) {                            req.getSession().setAttribute("name", name);                            break;                        }                    }                }            }        }        chain.doFilter(request, response);    }    @Override    public void destroy() {    }}

4、取消自动登录:CancelAutoLoginServlet.java:

package cn.hncu.servlets;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** * 取消自动登功能 * @author user * */public class CancelAutoLoginServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        ///删除autoLoginCookie        Cookie c = new  Cookie("autoLogin", "");        c.setPath(request.getContextPath());        c.setMaxAge(0);//过期时间为0即是删除        response.addCookie(c);        response.sendRedirect(request.getContextPath()+"/index.jsp");    }}

5、黑名单:

package cn.hncu.filters;import java.io.IOException;import java.util.HashSet;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class BlacklistFilter implements Filter{    HashSet<String> blackSet = new  HashSet<String>();    @Override    public void init(FilterConfig filterConfig) throws ServletException {        //按理应该在这里从数据库中读取出来,加入到blackSet集合中        blackSet.add("192.168.120.1");        //blackSet.add("127.0.0.1");    }    @Override    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        //获取客户端的IP地址        String ip = request.getRemoteAddr();        if(blackSet.contains(ip)){            response.setContentType("text/html;charset=utf-8");            response.getWriter().println("你已经被列入黑名单了");        }else{            chain.doFilter(request, response);        }    }    @Override    public void destroy() {    }}
阅读全文
0 0