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>

一、

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

  1. yii2.0自动登录功能的实现方法

    参考地址:http://www.kuitao8.com/20150518/3747.shtml 自动登录的原理很简单.主要就是利用cookie来实现的在第一次登录的时候,如果登录成功并且选中了下次自动 ...

  2. 自己Cookie写的自动登录功能 包含BASE64 和MD5的使用

    sql表 username  password字段 User类 有 id username password等字段 Service有一函数 @Override public User findUser ...

  3. spring security实现记住我下次自动登录功能

    目录 spring security实现记住我下次自动登录功能 一.原理分析 二.实现方式 2.1 简单实现方式 2.2 数据库实现方式 三.区分是密码登录还是rememberme登录 spring ...

  4. Vue+Vuex 实现自动登录功能

    刚刚实现了Vue+Vuex的自动登录功能,在实现的时候遇到了一些问题,这里记录一下: 因为这个还不够完善,在写完下列代码后,又进行了补充,可以从https://www.cnblogs.com/xiao ...

  5. cookie理解与实践【实现简单登录以及自动登录功能】

    cookie理解 Cookie是由W3C组织提出,最早由netscape社区发展的一种机制 http是无状态协议.当某次连接中数据提交完,连接会关闭,再次访问时,浏览器与服务器需要重新建立新的连接: ...

  6. 使用token实现在有效期内APP自动登录功能

    实现此功能的场景是在当下用户对手机APP体验要求高,并且相对安全前提的推动下诞生:当你下载了一个QQ,微信第一次进行了账号和密码的登录,你从此以后打开应用免去了你每日打开应用都要输入账号跟密码的痛苦过 ...

  7. java代码实现自动登录功能

    通常我们登录某网站,会有选择保存几天,或者是几个星期不用登录,之后输入该网站地址无需登录直接进入主页面,那么这就叫做自动登录,怎么实现呢,下面我以一个小例子来演示一下 登录页面:login.jsp & ...

  8. Filter自动登录

    Dao层略过 Domain略过 Service层过 Web层 Select逻辑 获取表单数据,Web-service--Dao返回用户信息 如果返回不为null否则,重定向到登录页面.则判断用户是否勾 ...

  9. cookies session filter 自动登录

    webxml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...

随机推荐

  1. 软件版本 Alpha、Beta、Rc

    软件版本的周期 α.β.γ 表示软件测试中的三个阶段 α :第一阶段,内部测试使用 β: 第二阶段,消除了大部分不完善的地方,仍可能存在漏洞,一般提供给特定的用户使用 γ: 第三阶段,产品成熟,个别地 ...

  2. TomcatJVM参数优化降低内存使用率(重点)!

    JVM是jdk最底层的支柱 做JVM参数优化主要是为了改善服务器性能以及内存使用率 JAVA堆分为三大部分:(新生代.老年代.永久代) ================================ ...

  3. Es查询结果集默认是10000,更新设置

    Es查询结果集默认是10000,结果集大小是int,最大为21亿左右 PUT _all/_settings?preserve_existing=true { "index.max_resul ...

  4. 使用maven搭建web项目

    在pom.xml中添加java ee相关的三个依赖包:<scope> jar的有效范围 provided 表示编译期生效,不会打包发布到 tomcat 中 <properties&g ...

  5. How2J学习java-1、环境配置

    JDK环境变量配置分下载,配置,验证三个步骤. 一.首先需要到JDK下载网站下载所需的JDK版本可根据更新来定.主流的开发工具Idear下载. 1.首先看配置成功后的效果 点WIN键->运行(或 ...

  6. 设计模式课程 设计模式精讲 3-4 依赖倒置原则讲解+coding

    1 课程讲解 1.1 定义 1.2 优点 1.3 细节描述 2 代码演练 2.0 代码展示优点 2.1 非面向接口编程 2.2 面向接口编程1 传参 2.3 面向接口编程2 构造函数 2.4 面向接口 ...

  7. Navicat Premium 12安装及激活

    一.安装 百度云下载地址:https://pan.baidu.com/s/1T5BjpBqLtwCy26szcKSdKw 提取码:ujzx 二.激活步骤 ①将navicat-keygen-for-x6 ...

  8. php 微信小程序支付

    php 微信小程序支付 直接贴代码: 前端测试按钮wxml: <view class="container"> <text class="name&qu ...

  9. MySQL之关系

    目录 关系 多对多的关系,如何通过mysql来表示 一对一关系 关系 多对多的关系,如何通过mysql来表示 站在老师的角度 一个老师可以教多个学生, 一个老师也可以教一个学生. 站在学生的角度 一个 ...

  10. git push的时候报错: Out of memory, malloc failed (tried to allocate 82037333 bytes)

    原因:上传的文件过大,这里我上传的文件有10G+所以报了上面的错误 解决方法:依次运行:git config --global pack.threads 1 git,git config --glob ...