二十 Filter&自动登录功能

Filter过滤器

过滤器,其实就是对客户端发出来的请求进行过滤,浏览器发出,然后服务器用Servelt处理。在中间就可以过滤,起到的是拦截的作用。

不仅仅作用于客户端请求,而且过滤服务器响应

作用:

  • 对一些敏感词汇进行过滤
  • 统一设置编码
  • 自动登录

如何使用Filter?

  1. 新建一个类,实现Filter接口
  2. 注册过滤器,在web.xml中配置filter,url建议为/*
  3. chain.doFilter(request, response);//是否连接下一个过滤器,也就是说,过滤器3是否放行,让后续过滤器执行拦截功能
  4. init方法的参数FilterConfig可用于获取filter在注册的名字以及初始化参数(在web.xml配置),这里的功能设计的初衷与ServletConfig是一样的
  5. 如果想放行,在doFilter方法里面操作,让请求到达下一个目标
  6. url-pattern写法格式: 
    • 全路径匹配    /LoginServlet
    • 目录匹配 (/目录开始 , /*  结束)      /jsp/*
    • 以后缀名匹配,以*开始,以后缀名结束   *.jsp   *.html等
    • 针对dispatch设置:<dispatcher></dispatcher>
            • REQUEST  只要请求过来都拦截,默认是REQUEST
            • FORWARD 只要是转发都拦截
            • ERROR       页面出错跳转
            • INCLUDE     包含页面则拦截

 

Filter的生命周期:

创建:部署到服务器,则初始化,创建

销毁:服务器停止则销毁

Filter的执行顺序:

  1. 客户端发送请求,先经过过滤器,如果过滤器放行,那么才到Servlet。不仅仅作用域客户端请求,而且过滤服务器响应
  2. 如果有多个过滤器,那么他们会按照注册的映射顺序来

Filter实现自动登录功能:

  • 1.获取信息
  • 2.校验失败,原页面
  • 3.校验成功,跳转index.jsp
    • 1存储账号密码到cookie
    • 2发送Cookie给客户端
    • 3使用Session存起来储用户信息,session在关闭服务器或者超过默认时间才销毁
  • 4.过滤器:
    • 获取Cookie
    • 没有Cookie则表明没有登录,放行。
    • 有Cookie,找出曾经放的用户名和密码,执行登录的操作。
    • 使用Session存起来这个用户值,放行。

一、Servlet校验登录信息,保存Cookie

思路:

  1. 拿到用户名和密码进行校验,失败则重新返回登录页面
  2. 校验成功则用session存储用户信息跳转到首页,并判断是否勾选了自动登录
  3. 如果勾选了自动登录,那么将用户名和密码封装成Bean添加到Cookie保存,后续用于过滤器实现自动登录功能
public class LoginServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        try {
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String autologin = request.getParameter("autologin");//on
            System.out.println(username+":"+password+":"+autologin);
            //校验用户名密码
            UserBean user = new UserBean();
            user.setUsername(username);
            user.setPassword(password);
            UserDao dao = new UserDaoImpl();
            UserBean userBean = dao.Login(user);
            if(userBean!=null){
                //页面提交上来的时候是否选择了自动登录
                if("on".equals(autologin)){
                    Cookie cookie = new Cookie("auto_login", username+"#"+password );
                    cookie.setMaxAge(60*60*24*7);//7天有效期
                    cookie.setPath(request.getContextPath());//应用名字
                    response.addCookie(cookie);
                }
                //成功了,进入首页
                request.getSession().setAttribute("userBean", userBean);
                response.sendRedirect("index.jsp");
            }else{
                //登录失败
                request.getRequestDispatcher("login.jsp").forward(request, response);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

二、过滤器实现自动登录功能:

思路:

  1. 先判断本次请求中session是否有效,如果有效,则放行
  2. 如果session失效,则拿到cookie判断是否第一次登录
  3. cookie是空,第一次登录,放行,让用户先登录,登录时Servlet会添加Cookie保存此次登录的信息
  4. 如果cookie不为空,不是第一次登录,那么拿到cookie中的值,封装成Bean对象,保存到session中,方便下次未过期之前还能用
  5. 如果出现异常,也放行,防止用户页面空白
public class AutoLoginFilter implements Filter {

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        try {
            HttpServletRequest request = (HttpServletRequest) req;
            //先判断session中是否还有userBean,如果有,当前会话还是有效的
            UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");
            if(userBean!=null){
                //如果session有效,放行,此时页面有session信息,登录成功显示欢迎您,${userBean.username }
                chain.doFilter(request, response);
            }else{
                //此时session失效,比如说关闭浏览器,第二次打开,此时看Cookie
                //1 取出Cookie,
                Cookie[] cookies = request.getCookies();
                //2 找出需要的cookie
                Cookie cookie = CookieUtil.findCookie(cookies, "auto_login");
                if(cookie==null){
                    //表明第一次登录,放行
                    chain.doFilter(request, response);
                }else{
                    //表明不是第一次,取出Cookie中的值,完成登录
                    String value = cookie.getValue();
                    String username = value.split("#")[0];
                    String password = value.split("#")[1];
                    System.out.println(username+":"+password);
                    UserBean user = new UserBean();
                    user.setUsername(username);
                    user.setPassword(password);
                    UserDao dao = new UserDaoImpl();
                    userBean = dao.Login(user);

                    //使用Session存一下这个值,方便下一次未过期前还可以用
                    request.getSession().setAttribute("userBean", userBean);

                    chain.doFilter(request, response);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            //出现异常,也放行
            chain.doFilter(req, response);
        }
    }

    public void init(FilterConfig fConfig) throws ServletException {
       System.out.println("Filter初始化了");
    }

}

三、登录成功页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>Insert title here</title>
</head>
<body>
这是首页,
<c:if test="${not empty userBean }">
欢迎您,${userBean.username }
</c:if>
<c:if test="${ empty userBean }">
您好,请登录!
</c:if>

</body>
</html>

一、

原文地址:https://www.cnblogs.com/ltfxy/p/10257642.html

时间: 2024-08-10 14:59:14

二十 Filter&自动登录功能的相关文章

Android实战简易教程-第六十六枪(结合SharedPreferenced实现自动登录功能)

我们使用的一般应用都有记住密码.自动登录功能,这样不用用户每次都要点击登录按钮,提升用户体验,下面我们通过一个实例研究一下如何通过android的sharedpreferenced实现自动登录功能.本实例有三个界面-登录界面,跳转界面,登录成功界面. 1.登录界面: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.andr

自己Cookie写的自动登录功能

sql表 username  password字段 User类 有 id username password等字段 Service有一函数 1 @Override 2 3 public User findUser(String username) 4 { 5 return userDao.findUser(username); 6 } 实现 1 @Override 2 public User findUser(String username) { 3 try { 4 return qr.quer

java代码实现自动登录功能

通常我们登录某网站,会有选择保存几天,或者是几个星期不用登录,之后输入该网站地址无需登录直接进入主页面,那么这就叫做自动登录,怎么实现呢,下面我以一个小例子来演示一下 登录页面:login.jsp Html代码   <SPAN style="FONT-SIZE: medium"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"

Android开发之自动登录功能的实现

在我们平时使用的手机应用都可以实现只需要登陆一次账号后,第二次进入应用直接跳转到效果界面的效果,还有QQ的登陆框是如何记忆我们的隐身登陆,保存账号选项的呢,这些都是通过使用SharedPreferences共享参数效果实现的,而无须使用数据库来存储.以下我们直接看详细代码分析. package com.example.account.login; import java.util.HashMap; import java.util.Map; import com.android.dao.MySQ

Java Web总结二十Filter、装饰设计模式

一.Filter的部署--注册Filter <filter> <filter-name>testFitler</filter-name> <filter-class>org.test.TestFiter</filter-class> <init-param> <param-name>word_file</param-name> <param-value>/WEB-INF/word.txt</p

(转)业务系统实现记住密码和自动登录功能

公司的业务系统本来是受域控的,用户不需要登录可以直接访问系统.当然,虽然不用人工登录,系统本身会读取电脑的用户名为登录标识,对系统操作权限和记录也是以电脑名.近段时间,由于系统要牵到云端,也就是不受域控了,那就需要每人手头上都有账号和密码了,这个和一般的业务系统没什么区别.但是由于用户之前的习惯是不用登录的,而且每天打开关闭的次数较多.OK,一般的系统登录都会有个记住密码的功能,但是,这还满足不了用户的需求,那么我们给用户增加多一个自动登录功能,类似QQ那样,我上次访问勾选了自动登录功能,然后再

C#如何实现记住密码,自动登录功能?【转载】

如何实现记住密码和自动登录功能? 记住密码功能我是这样实现的:将用户名存入xml文件中,在窗体加载时读取并加入combobox的Items中,然后再在选择items中的某一项时,用combobox.Text做为条件从数据库读取密码(这样做是为了省去为xml文件加密,但不会影响速度!)!这是我自己实验过的,方法有点笨!namespace address_list{    public partial class Addresslist : Form    {        public Addre

基于SSM框架的博客系统(二)博主登录功能

一.        准备 1.数据库 创建表db_blogger: 1 DROP TABLE IF EXISTS `t_blogger`; 2 3 CREATE TABLE `t_blogger` ( 4 5 `id` INT(11) NOT NULL AUTO_INCREMENT, 6 7 `userName` VARCHAR(50) DEFAULT NULL, 8 9 `password` VARCHAR(100) DEFAULT NULL, 10 11 `profile` TEXT, 12

网站自动登录功能的设计[转]

网站的自动登录一直都是有利于提高用户体验的功能,如果设计不好,也非常容易泄漏用户的账户信息. 比较常见的功能实现方案是将用户的登录信息保存在浏览器的Cookie中.看到一些设计有缺陷的网站会将用户的用户名和密码信息保存在Cookie中,这种做法是相当危险的.虽然这样的设计比较简单,功能比较容易实现,但是却大大提高了泄露用户账户信息的几率,即使保存的用户密码等信息都是经过加密的,但也是不可取的,毕竟现在弱一点的密码加密后也是可以解密的. 当然自动登录的功能设计必须要在浏览器的Cookie中保留账户