1.过滤器Filter

1.1 我的理解

过滤器本质就是一个Sevlet,不过它把每个Servlet类中都要做的一些事情,集中到了它这里,执行一次就可以了

使用基本和Servlet完全相同,在写完对应的类后,也需要去web.xml中进行注册

filter在随着web服务器(tomcat)的启动而初始化

随着web服务器(tomcat)的关闭而销毁

1.2

Filter:过滤器 ,用来过滤网站的数据;

  • 处理中文乱码
  • 登录验证….

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lY6usA4Z-1586528671268)(…/img/1568424858708.png)]

Filter开发步骤:

  1. 导包

  2. 编写过滤器

    1. 导包不要错

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K2LCD7He-1586528671269)(…/img/1568425162525.png)]

      实现Filter接口,重写对应的方法即可

      public class CharacterEncodingFilter implements Filter {//初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!public void init(FilterConfig filterConfig) throws ServletException {System.out.println("CharacterEncodingFilter初始化");}//Chain : 链/*1. 过滤中的所有代码,在过滤特定请求的时候都会执行2. 必须要让过滤器继续同行chain.doFilter(request,response);*/public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");System.out.println("CharacterEncodingFilter执行前....");chain.doFilter(request,response); //让我们的请求继续走,如果不写,程序到这里就被拦截停止!System.out.println("CharacterEncodingFilter执行后....");}//销毁:web服务器关闭的时候,过滤会销毁public void destroy() {System.out.println("CharacterEncodingFilter销毁");}
      }
  3. 在web.xml中配置 Filter

    <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping><filter-name>CharacterEncodingFilter</filter-name><!--只要是 /servlet的任何请求,会经过这个过滤器--><url-pattern>/servlet/*</url-pattern><!--<url-pattern>/*</url-pattern>-->
    </filter-mapping>
    

2.监听器

2.1我的理解

  1. 关于getServletContext()

    Servlet三大域对象的应用 request、session、application(ServletContext)

    ServletContext是一个全局的储存信息的空间,服务器开始就存在,服务器关闭才释放。

    request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一个。所以,为了节省空间,提高效率,ServletContext中,要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。

    上面三个应用通过调用setAttribute()方法来给对象设置值,再通过getAttribute()方法来获取值,以实现值在不同页面间的传递

  2. 监听器现在用的不多,一般用来通过seesion获取在线人数

###2.2

1.实现一个监听器的接口;(有N种)

  1. 编写一个监听器

    实现监听器的接口…

    //统计网站在线人数 : 统计session
    public class OnlineCountListener implements HttpSessionListener {//创建session监听: 看你的一举一动//一旦创建Session就会触发一次这个事件!public void sessionCreated(HttpSessionEvent se) {ServletContext ctx = se.getSession().getServletContext();System.out.println(se.getSession().getId());Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");if (onlineCount==null){onlineCount = new Integer(1);}else {int count = onlineCount.intValue();onlineCount = new Integer(count+1);}ctx.setAttribute("OnlineCount",onlineCount);}//销毁session监听//一旦销毁Session就会触发一次这个事件!public void sessionDestroyed(HttpSessionEvent se) {ServletContext ctx = se.getSession().getServletContext();Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");if (onlineCount==null){onlineCount = new Integer(0);}else {int count = onlineCount.intValue();onlineCount = new Integer(count-1);}ctx.setAttribute("OnlineCount",onlineCount);}/*Session销毁:1. 手动销毁  getSession().invalidate();2. 自动销毁*/
    }
  2. web.xml中注册监听器

    <!--注册监听器-->
    <listener><listener-class>com.kuang.listener.OnlineCountListener</listener-class>
    </listener>
    
  3. 看情况是否使用!

3.过滤器Demo

###3.1实现用户名校验,用户名正确,进入主页面,不正确,进入错误页面

  1. 新建一个LoginServlet类,在里面进行判断

    如果用户名等于admin,把用户信息保存到session中,并重定向到登录成功页面

    否则,重定向到失败页面

    @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");if(username.equals("admin")){//把用户信息保存到session中req.getSession().setAttribute("USER_SESSION",req.getSession().getId());resp.sendRedirect("/sys/success.jsp");}else {resp.sendRedirect("/error.jsp");}}
    

###3.2实现主页面过滤,用户不可直接访问主页面,若用户访问主页面,重定向到错误页面

  1. 在登录成功页面新增一个注销链接,新建一个注销Servlet类,二者关联在一起

    <a href="/servlet/logout">注销</a>
    
    <servlet><servlet-name>LogoutServlet</servlet-name><servlet-class>com.nslt.servlet.LogoutServlet</servlet-class></servlet><servlet-mapping><servlet-name>LogoutServlet</servlet-name><url-pattern>/servlet/logout</url-pattern></servlet-mapping>
    
    @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Object user_seeesion = req.getSession().getAttribute(Constant.USER_SESSION);if (user_seeesion != null) {req.getSession().removeAttribute(Constant.USER_SESSION);resp.sendRedirect("/index.jsp");} else {resp.sendRedirect("/index.jsp");}}
    
  2. 当用户点击注销的时候,就会执行注销Servlet类的内容,移除登录成功后保存在用户Session中的数据,并且重定向到登录页面

  3. 新建一个登录过滤类,当用户没有试图直接访问登录成功页面的时候,判断用户Session中是否保存刚才保存的数据,若没有保存,则页面重定向到登录失败页面

     HttpServletRequest req = (HttpServletRequest) servletRequest;HttpServletResponse resp = (HttpServletResponse) servletResponse;if(req.getSession().getAttribute(Constant.USER_SESSION)==null){resp.sendRedirect("/error.jsp");}filterChain.doFilter(req,resp);
    
    <filter><filter-name>LogFilter</filter-name><filter-class>com.nslt.filter.LogFilter</filter-class></filter><filter-mapping><filter-name>LogFilter</filter-name><url-pattern>/sys/*</url-pattern></filter-mapping>
    

3.3遇到的问题

  1. 用户不点击注销,则可以直接访问登录成功页面。不受影响
  2. 在web.xml中注册servlet和filter的时候,一定要小心,我第一次配置的时候,把过滤不小心设置成了servlet,并且过滤的地址也设置错误,导致tomcat服务器一直处于启动中状态,查看半天找不到错误,最后直接访问页面,显示重定向过多,才明白问题出在哪里
    /sys/*

3.3遇到的问题

  1. 用户不点击注销,则可以直接访问登录成功页面。不受影响
  2. 在web.xml中注册servlet和filter的时候,一定要小心,我第一次配置的时候,把过滤不小心设置成了servlet,并且过滤的地址也设置错误,导致tomcat服务器一直处于启动中状态,查看半天找不到错误,最后直接访问页面,显示重定向过多,才明白问题出在哪里
  3. 只是一个简单的登录验证和主页面过滤就配置了大量的servlet和filter,一不小心还容易出错,过程繁琐,怪不得会有Spring的出现

参考

以上内容为我观看狂神说java所做的笔记

https://www.bilibili.com/video/BV12J411M7Sj?p=42

IDEA servlet 过滤器和监听器相关推荐

  1. Servlet过滤器和监听器

    一.过滤器 顾名思义,过滤器就像一张滤网,起过滤作用.它的主要作用就是将请求进行过滤处理然后将过滤后的请求交给下一个资源.其本质是Web应用的一个组成部件,承担了Web应用安全的部分功能,阻止不合法的 ...

  2. Servlet,过滤器,监听器,拦截器的区别

    由于最近两个月工作比较清闲,个人也比较"上进",利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时 候,发现为什么struts1要用servl ...

  3. 动手学servlet(六) 过滤器和监听器

     过滤器(Filter) 过滤器是在客户端和请求资源之间,起一个过滤的作用,举个例子,比如我们要请求admin文件夹下的index.jsp这个页面,那么我们可以用一个过滤器,判断登录用户是不是管理员 ...

  4. Servlet过滤器Filter和监听器

    一.Servlet过滤器的概念: *********************************************************************************** ...

  5. 【转载】Spring Boot 过滤器、监听器、拦截器的使用

    关注"Java后端技术全栈" 回复"面试"获取全套大厂面试资料 在开发中用到过滤器.监听器.拦截器的场景非常多,今天就来聊聊这三者在日常开发中是如何使用的. 概 ...

  6. java 监听器 分类_java过滤器和监听器详解 分类: 学习专区

    过滤器 1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求 ...

  7. spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)

    上一篇:spring boot 1.5.4 整合webService(十五) 1      Spring Boot整合redis和缓存 Spring Boot中除了对常用的关系型数据库提供了优秀的自动 ...

  8. java 过滤js事件_java中的过滤器与监听器

    过滤器: Filter本身并不生成请求和响应对象,只是提供过滤功能. Filter能够在Servlet被调用之前检查Request对象,并修改Request Header和Request内容:在Ser ...

  9. java中的过滤器与监听器

    过滤器: Filter本身并不生成请求和响应对象,只是提供过滤功能. Filter能够在Servlet被调用之前检查Request对象,并修改Request Header和Request内容:在Ser ...

最新文章

  1. 全球互联正在创造一个知识极大丰富和隐私终结的时代
  2. 第三次冲刺阶段第五天
  3. 如何用VC++新建一个项目
  4. 成为Web开发大师你必须知道的7件事情
  5. 控件中数据模板禁用小键盘减号折叠
  6. mysql自建云盘_使用nextcloud自建私人云盘
  7. jsp 九大内置对象详解以及示例
  8. 使用云存储解决方案,主要有哪些优势
  9. 计算机管理及维护培训考试题,计算机考试题库和答案_浅析高校公共计算机机房管理与维护...
  10. 穿山甲广告。swift穿山甲广告40001报错
  11. 中国象棋马走日(要求打印每一种走法) — 递归
  12. 2022 年 React Native 的全新架构更新
  13. 百度SiteApp网站打不开,手机站可以这样搞掂
  14. 计算机和游戏建立不了连接,如何建立局域网我们寝室的电脑想连接起来玩游戏我们每个人都有网号我 爱问知识人...
  15. 肿瘤特异性抗原行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  16. MATLAB toc使用
  17. 阿里网易面试送送送命题 —— 微服务架构
  18. 算法竞赛入门【码蹄集进阶塔335题】(MT2001-2025)
  19. android应用中自动化埋点的实现,Android 自动化埋点方案
  20. 超好用的奈飞Netflix客户端:Netflix for Mac

热门文章

  1. 有免费的PDF转换器吗?如何将PDF转换成PPT?
  2. 动手制作一个可以手机APP控制的智能小夜灯
  3. 中心开孔方板的Matlab有限元编程
  4. 有限公司与有限责任公司的区别
  5. 2021高考成绩23号几点可以查询,2021年广西高考成绩23号几点可以查询,今天几点出高考成绩...
  6. 项目到tomcat后,报错:jar not loaded. See Servlet Spec 2.3, section 9.7.2. class: javax/servlet/Servlet.clas
  7. 一小时,学习掌握瀑布流页面布局
  8. PyCharm 主题和字体 (Scheme Editor Font)
  9. Android View的滚动事件的监听(如上下箭头随你的手指移动而变换方向)
  10. 联想e470加装固态硬盘_DIY之Thinkpad E470升级记