JAVAWeb - Filter(过滤器)
Filter:过滤器,用来过滤网站数据;
- 处理中文乱码
- 登录验证....
过滤器的分析:
我们用户在使用web浏览器访问web服务器的时候;以往的过程都是web服务器直接去寻址拿资源(servlet,jsp,HTML,静态资源),然而在请求处理的时候,我们通常会因为请求和响应的数据结构类型不同,导致网页出现乱码,或者崩溃的状态。
我们在web服务器和静态资源中加了一层过滤器,专门对请求和响应的码进行处理,统一规格化请求和响应的代码,就可以避免乱码的情况。
一:导包
<dependencies> <!--Servlet 的依赖--> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <!--jsp的依赖--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency> <!--jstl 表达式的依赖--> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> <!-- taglibs 标签库 --> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-impl</artifactId> <version>1.2.5</version> <scope>runtime</scope> </dependency> </dependencies>
一般在maven中导入这四个包就可以完成了,过滤器一般的实现只需要这四个包
二:编写过滤器
导包:java.servlet
实现Filter接口:
注意点:过滤中一定要包含这个方法 filterChain.doFilter 不然请求就会停在监听器中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class CharacterEncodingFilteer implements Filter { //初始化:在web服务器启动的时候就已经初始化完成了 public void init(FilterConfig filterConfig) throws ServletException { System.out.println( "CharacterEncodingFilter已经初始化" ); } //chain /* 1.过滤器中的代码,在过滤特定需求的请求中都会执行 2.必须要让过滤器往下进行:filterChain.doFilter */ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding( "utf-8" ); servletResponse.setCharacterEncoding( "utf-8" ); servletResponse.setContentType( "text/html;charset=UTF-8" ); System.out.println( "CharacterEncodingFilter执行前" ); filterChain.doFilter(servletRequest,servletResponse); //让我们的请求继续向下交接;没有这句话就会停在这个过滤器内 System.out.println( "CharacterEncodingFilter执行后" ); } //销毁:在web服务器关闭的时候过滤器就会自动关闭 public void destroy() { System.out.println( "CharacterEncodingFilter已经销毁" ); } } |
在web.xml中配置Filter的作用域
<filter> <filter-name>CharacterEncodingFilteer</filter-name> <filter-class>top.lostyou.jsp.Filter.CharacterEncodingFilteer</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncodingFilteer</filter-name> <!-- 过滤Filter包下的文件的请求--> <url-pattern>/Filter/*</url-pattern> </filter-mapping>
监听器:实现一个监听器的接口(很多)
1.编写一个监听器:实现监听器的接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | //统计在线人数:统计session public class OnlineCountLinster 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(); System.out.println(se.getSession().getId()); se.getSession().invalidate(); 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); } } |
2.在web.xml中注册监听器,并设置session的过期事件
<!--注册监听器--> <listener> <listener-class>top.lostyou.jsp.linster.OnlineCountLinster</listener-class> </listener> <session-config> <session-timeout>1</session-timeout> </session-config>
过滤器和监听器的常见应用:
监听器GUI的实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | public class TestPanel { public static void main(String[] args) { Frame frame = new Frame( "监听器GUI测试" ); //新建一个窗体 Panel panel = new Panel( null ); //面板 frame.setLayout( null ); //设置窗体布局 frame.setBounds( 300 , 300 , 500 , 500 ); //设置窗体位置,及显示大小 frame.setBackground( new Color( 0 , 0 , 255 )); //设置背景颜色 panel.setBounds( 50 , 50 , 300 , 300 ); panel.setBackground( new Color( 0 , 255 , 0 )); frame.add(panel); frame.setVisible( true ); //设置窗体可视化 //监听事件,关闭监听事件 frame.addWindowListener( new WindowListener() { public void windowOpened(WindowEvent e) { System.out.println( "打开" ); } public void windowClosing(WindowEvent e) { System.out.println( "关闭ing" ); System.exit( 0 ); } public void windowClosed(WindowEvent e) { System.out.println( "关闭ed" ); } public void windowIconified(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowActivated(WindowEvent e) { System.out.println( "激活" ); } public void windowDeactivated(WindowEvent e) { System.out.println( "未激活" ); } }); } } |
以上通过GUI的方法实现窗口:
在运行以后一个窗体被呈现了出来
此时我们对窗体的操作都使用监听器去监听;
每当我们执行一个事件都可能会有反馈,就是监听器的作用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?