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

相关文章

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

使用filter改变改变地址,但又不想被本过滤器再次拦截的方法

继承HttpServletRequestWrapper重写里面的方法 如果是servlet重写getRequestURI() 如果是spring mvc重写 getServletPath()  可以根据getDispatcherType()类确定是那种调度类型,一般客户端请求action,或controller都是REQUEST,controller跳转到页面是FORWARD。

数据权限的设计与实现系列6——前端筛选器组件Everright-filter使用探索

linear 功能探索 最终我们是需要使用 API 的方式,调用后端服务拉取数据填充筛选器组件,不过在探索阶段,直接用 API 方式,就需要构造 mock 数据,比较麻烦,因此先使用 Function 方式来进行功能验证。 组件初始化 新建一个页面,复制官方示例,如下: <script setup>import { ref } from 'vue'import { EverrightF

请解释Java Web中的Filter的作用和使用场景。什么是Java Web中的JSP?请解释其与Servlet的关系及各自优势。

请解释Java Web中的Filter的作用和使用场景。 Java Web中的Filter(过滤器)是一个重要的组件,它在客户端与服务器端之间扮演着关键角色。Filter的主要作用是在请求到达Servlet或JSP之前,或者响应返回给客户端之前,对请求和响应进行预处理和后处理。以下是Filter的详细作用和使用场景: Filter的作用 请求预处理:在请求到达目标资源(如Servlet、J