Filter和ServletContext和Listener

2024-06-02 01:44

本文主要是介绍Filter和ServletContext和Listener,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

Filter案例

解决全站乱码问题

登录权限校验

ServletContext对象

Listener(监听器)


Filter案例

解决全站乱码问题

我们每次访问每个servlet都要书写处理请求和响应乱码的代码,这样代码十分冗余,所以我们可以在过滤中

@WebFilter("/*")
public class EncodeFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;//your code..//解决请求乱码request.setCharacterEncoding("utf-8");//解决响应乱码response.setContentType("text/html;charset=utf-8");//放行filterChain.doFilter(request,response);}@Overridepublic void destroy() {}
}
@WebServlet("/servletDemo1")
public class servletDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");System.out.println(username);response.getWriter().print("哈哈哈");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/servletDemo1" method="post"><input type="text" name="username"><input type="submit" value="提交">
</form>
</body>
</html>

登录权限校验

步骤

        1.访问hhh.html这个页面时必须先要登录,不登录不能访问,使用过滤器代码书写代码让其跳转到登录页面login.html

         2.登录loginServlet中获取用户名和密码,存到user对象中,然后存在session中(不关闭服务器,这个session就一直在服务器里面),最后重定向到hhh.html

        3. 使用一个过滤器对hhh.html进行拦截,先从session中获取用户信息,如果没有登录,获取的是null,就跳转到登录页面,如果不为null,说明登录成功,放行

 hhh.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>这就是终极文件</h1>
</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录</title>
</head>
<body>
<form action="/loginServlet" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="pwd"><br><input type="submit" value="提交">
</form>
</body>
</html>

loginServlet

@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求参数String username = request.getParameter("username");String pwd = request.getParameter("pwd");User user = new User();user.setUsername(username);user.setPwd(pwd);//这里在实际开发中,应该调用业务层的方法,与数据库交互//获取session对象HttpSession session = request.getSession();session.setAttribute("u",user);//登陆成功,就跳转到hhh.htmlresponse.sendRedirect("/hhh.html");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

loginFilter过滤器,过滤hhh.html


@WebFilter("/hhh.html")
public class loginFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;//your code..//从session中获取对象HttpSession session = request.getSession();User u = (User) session.getAttribute("u");if(u==null){//没有登录//跳转到登录页面response.sendRedirect("/login.html");}else{//放行filterChain.doFilter(request,response);}}@Overridepublic void destroy() {}
}

先登录

在显示页面

ServletContext对象

可以共享数据的对象

1.request:只能在一次请求一次响应中进行数据共享-->请求转发

2.session:只能在一次会话过程中,可以有多次请求和响应

3.ServletContext:只要项目存在就可以共享数据,多次会话,多次请求多次响应都可以共享数据,操作整个项目的配置文件

范围大小:

ServletContext>session>request

ServletContext属于接口,在tomcat启动的时候tomcat创建门面类(ServletContext的子类)

我们可以在Servlet类中直接获取ServletContext对象;getServletContext()属于父类GenericServlet中的方法

@WebServlet("/servletContextDemo1")
public class servletContextDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取ServletContext对象ServletContext servletContext = getServletContext();//获取指定文件的MIME类型String mimeType = servletContext.getMimeType("demo1.html");//相对于webapp的路径System.out.println("mimeType="+mimeType);//mimeType=text/html//获取指定文件的真实路径String realPath = servletContext.getRealPath("demo1.html");System.out.println("realPath="+realPath);//realPath=D:\java code\web6_filter_listener\target\web6_filter_listener-1.0-SNAPSHOT\demo1.html}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

 

Listener(监听器)

说明:
         javaweb的监听器就是监听ServletContext HttpServletRequest HttpSession这三个对象的创建和销毁,同时监听是哪个对象数据的变化,就是监听属性的变化:setAttibute(),removeAttribute()

1.ServletContext是tomcat启动创建,关闭tomcat销毁

2.HttpServlet是浏览器第一次访问执行request.getSession()创建,销毁时间 1)30min 2)执行invalidate()

3.HttpServletRequest时浏览器第一次访问Servlet创建,浏览器收到服务器的响应就销毁

//配置监听器
@WebListener
public class conTextListerner implements ServletContextListener {//实现接口//当ServletContext创建(启动tomcat)时执行该方法@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {System.out.println("ServletContext创建");}//当ServletContext(关闭tomcat)销毁时执行该方法@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("ServletContext销毁");}
}

 不使用注解可以在web.xml中配置

<!--    配置监听器--><listener><listener-class>com.hhh.listener.conTextListerner</listener-class></listener>

这篇关于Filter和ServletContext和Listener的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022695

相关文章

Spring Boot拦截器Interceptor与过滤器Filter详细教程(示例详解)

《SpringBoot拦截器Interceptor与过滤器Filter详细教程(示例详解)》本文详细介绍了SpringBoot中的拦截器(Interceptor)和过滤器(Filter),包括它们的... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)详细教程1. 概述1

dubbo3 filter(过滤器)如何自定义过滤器

《dubbo3filter(过滤器)如何自定义过滤器》dubbo3filter(过滤器)类似于javaweb中的filter和springmvc中的intercaptor,用于在请求发送前或到达前进... 目录dubbo3 filter(过滤器)简介dubbo 过滤器运行时机自定义 filter第一种 @A

Java 8 Stream filter流式过滤器详解

《Java8Streamfilter流式过滤器详解》本文介绍了Java8的StreamAPI中的filter方法,展示了如何使用lambda表达式根据条件过滤流式数据,通过实际代码示例,展示了f... 目录引言 一.Java 8 Stream 的过滤器(filter)二.Java 8 的 filter、fi

Hbase Filter+Scan 查询效率优化

Hbase Filter+Scan 查询效率问题 众所周知,Hbase利用filter过滤器查询时候会进行全表扫描,查询效率低下,如果没有二级索引,在项目中很多情况需要利用filter,下面针对这种情况尝试了几种优化的方案,仅供参考,欢迎交流。 根据业务要求,作者需要根据时间范围搜索所需要的数据,所以作者设计的rowKey是以时间戳为起始字符串的。 正确尝试: 1.scan 设置 开始行和结

监听器(Listener)使用详情

https://www.cnblogs.com/xdp-gacl/p/3969249.html 孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十五)——监听器(Listener)学习二 一、监听域对象中属性的变更的监听器   域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest

Filter基本原理和使用

https://www.cnblogs.com/xdp-gacl/p/3948353.html 一、Filter简介   Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控

java-在ANTLR中,如何使用生成的Listener代码

测试基本环境 windows 10java 19antlr 4.13.1 使用场景 主要是通过实现ParseTreeListener 的接口实现自己的业务逻辑,从而构建自己的程序。 Listener概要 生成java代码后,会有两个listener的类,HelloListener是接口,HelloBaseListener是实现。 D:\源码\kafka-2.1\antlr\gen\H

在UE的内容浏览器中添加自定义的Filter

目标需求 在UE的内容浏览器中,可以使用Filter来过滤资源: 目标需求是在这之中添加一个自定义的Filter。 其代码上是非常简单的,在本文末尾。 然而我觉得找到方法的过程也是挺有意思的,因此我也记录了下来。 探索过程 1. 在哪定义? 首先,我猜测Other Filters下的各个项目,也都是通过代码添加的。因此,我调了其中一项,比如Show Redirectors,然后对代码进

Flink实例(六十八):布隆过滤器(Bloom Filter)的原理和实现

什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上在网络爬虫里,一个网址是否被访问过yahoo, gmail等邮箱垃圾邮件过滤功能 这几个例子有一个共同的特点: 如何判断一个元素是否存在一个集合中? 常规思路 数组链表树、平衡二叉树、TrieMap (红黑树)哈希表 虽然上面描述的

过滤器(Filter)和拦截器(Interceptor)

在Web开发中,过滤器(Filter)和拦截器(Interceptor)都是重要的组件,它们都可以对HTTP请求进行预处理、后处理以及一些额外的操作。然而,它们之间在多个方面存在明显的区别 1. 运行位置 过滤器(Filter):运行在Web服务器和Servlet容器之间的组件,可以拦截所有进出该容器的请求和响应。过滤器是Servlet规范的一部分,不依赖于特定的框架。拦截器(Intercep