过滤器第一篇【介绍、入门、简单应用】(四)

简介: 过滤器是Servlet的高级特性之一,也别把它想得那么高深,只不过是实现Filter接口的Java类罢了!

禁止浏览器缓存所有动态页面

   public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //让Web资源不缓存,很简单,设置http中response的请求头即可了!
        //我们使用的是http协议,ServletResponse并没有能够设置请求头的方法,所以要强转成HttpServletRequest
        //一般我们写Filter都会把他俩强转成Http类型的
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        response.setDateHeader("Expires", -1);
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        //放行目标资源的response已经设置成不缓存的了
        chain.doFilter(request, response);
    }

没有过滤之前,响应头是这样的:56.jpg

过滤之后,响应头是这样的:

57.jpg

实现自动登陆

开发实体、集合模拟数据库、Dao

  • 实体:
   private String username ;
    private String password;
    public User() {
    }
    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
    //各种setter和getter

集合模拟数据库

  public class UserDB {
        private static List<User> users = new ArrayList<>();
        static {
            users.add(new User("aaa", "123"));
            users.add(new User("bbb", "123"));
            users.add(new User("ccc", "123"));
        }
        public static List<User> getUsers() {
            return users;
        }
        public static void setUsers(List<User> users) {
            UserDB.users = users;
        }
    }

开发dao

   public User find(String username, String password) {
        List<User> userList = UserDB.getUsers();
        //遍历List集合,看看有没有对应的username和password
        for (User user : userList) {
            if (user.getUsername().equals(username) && user.getPassword().equals(password)) {
                return user;
            }
        }
        return null;
    }

登陆界面

<form action="${pageContext.request.contextPath}/LoginServlet">
    用户名<input type="text" name="username">
    <br>
    密码<input type="password" name="password">
    <br>
    <input type="radio" name="time" value="10">10分钟
    <input type="radio" name="time" value="30">30分钟
    <input type="radio" name="time" value="60">1小时
    <br>
    <input type="submit" value="登陆">
</form>

处理登陆的Servlet

  //得到客户端发送过来的数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        UserDao userDao = new UserDao();
        User user = userDao.find(username, password);
        if (user == null) {
            request.setAttribute("message", "用户名或密码是错的!");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
        }
        //如果不是为空,那么在session中保存一个属性
        request.getSession().setAttribute("user", user);
        request.setAttribute("message", "恭喜你,已经登陆了!");
        //如果想要用户关闭了浏览器,还能登陆,就必须要用到Cookie技术了
        Cookie cookie = new Cookie("autoLogin", user.getUsername() + "." + user.getPassword());
        //设置Cookie的最大声明周期为用户指定的
        cookie.setMaxAge(Integer.parseInt(request.getParameter("time")) * 60);
        //把Cookie返回给浏览器
        response.addCookie(cookie);
        //跳转到提示页面
        request.getRequestDispatcher("/message.jsp").forward(request, response);

过滤器

 HttpServletResponse response = (HttpServletResponse) resp;
        HttpServletRequest request = (HttpServletRequest) req;
        //如果用户没有关闭浏览器,就不需要Cookie做拼接登陆了
        if (request.getSession().getAttribute("user") != null) {
            chain.doFilter(request, response);
            return;
        }
        //用户关闭了浏览器,session的值就获取不到了。所以要通过Cookie来自动登陆
        Cookie[] cookies = request.getCookies();
        String value = null;
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            if (cookies[i].getName().equals("autoLogin")) {
                value = cookies[i].getValue();
            }
        }
        //得到Cookie的用户名和密码
        if (value != null) {
            String username = value.split("\\.")[0];
            String password = value.split("\\.")[1];
            UserDao userDao = new UserDao();
            User user = userDao.find(username, password);
            if (user != null) {
                request.getSession().setAttribute("user", user);
            }
        }
        chain.doFilter(request, response);

效果:6.gif

改良

我们直接把用户名和密码都放在了Cookie中,这是明文的。懂点编程的人就会知道你的账号了。

于是乎,我们要对密码进行加密!

Cookiecookie=newCookie("autoLogin",user.getUsername()+"."+md5.md5(user.getPassword()));

  • 在过滤器中,加密后的密码就不是数据库中的密码的。所以,我们得在Dao添加一个功能【根据用户名,找到用户】
   public User find(String username) {
        List<User> userList = UserDB.getUsers();
        //遍历List集合,看看有没有对应的username和password
        for (User user : userList) {
            if (user.getUsername().equals(username)) {
                return user;
            }
        }
        return null;
    }

在过滤器中,比较Cookie带过来的md5密码和在数据库中获得的密码(也经过md5)是否相同

   //得到Cookie的用户名和密码
        if (value != null) {
            String username = value.split("\\.")[0];
            String password = value.split("\\.")[1];
            //在Cookie拿到的密码是md5加密过的,不能直接与数据库中的密码比较
            UserDao userDao = new UserDao();
            User user = userDao.find(username);
            //通过用户名获得用户信息,得到用户的密码,用户的密码也md5一把
            String dbPassword = md5.md5(user.getPassword());
            //如果两个密码匹配了,就是正确的密码了
            if (password.equals(dbPassword)) {
                request.getSession().setAttribute("user", user);
            }
        }

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章的同学,可以关注微信公众号:Java3y

目录
相关文章
|
1月前
|
设计模式
深入浅出过滤器模式
深入浅出过滤器模式
32 0
|
28天前
|
安全 Java 数据安全/隐私保护
SpringSecurity6从入门到实战之引言和基本概念
《SpringSecurity6从入门到实战》介绍了Spring Security这一强大的Java安全框架,主要用于保护Spring应用程序的安全。它提供认证和授权功能,支持多种认证方式,并具备高度可定制性。文章阐述了权限管理的重要性,包括用户认证(验证用户身份)和用户授权(控制用户访问权限)。相较于其他如Shiro和Sa-Token的安全框架,Spring Security因与Spring生态的深度整合及对OAuth2的支持,常成为微服务项目的选择。
|
1月前
|
编译器 程序员 Linux
【C++入门(上篇)】C++入门学习
【C++入门(上篇)】C++入门学习
|
10月前
|
前端开发
前端学习笔记202303学习笔记第五天-声明和使用过滤器
前端学习笔记202303学习笔记第五天-声明和使用过滤器
43 0
|
11月前
JavaWeb第十二章课后题 过滤器Filter详解
JavaWeb第十二章课后题 过滤器Filter详解
167 0
|
1月前
|
消息中间件 存储 分布式计算
学习笔记:StructuredStreaming入门(十二)
学习笔记:StructuredStreaming入门(十二)
53 0
|
设计模式 缓存 负载均衡
|
XML JSON 前端开发
过滤器知识点20160907
过滤器知识点20160907
79 0
|
Java 容器
过滤器第一篇【介绍、入门、简单应用】(二)
过滤器是Servlet的高级特性之一,也别把它想得那么高深,只不过是实现Filter接口的Java类罢了!
115 0
过滤器第一篇【介绍、入门、简单应用】(二)