ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

过滤器与监听器

2022-01-28 14:02:51  阅读:120  来源: 互联网

标签:System println 监听器 过滤器 servlet public


过滤器:Filter

1. 什么是过滤器:

过滤器实际上就是对web资源进行拦截,做⼀些处理后再交给下一个过滤器或servlet处理,通常都是用来拦截request进⾏处理的,也可以对返回的response进行拦截处理。

2.过滤器的语法格式:

1.创建一个类实现Filter接口

public class CharSetFilter implements Filter{}

2.重写接口中的方法

public void destroy() { //销毁的⽅法}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain
chain) throws ServletException, IOException {
//过滤⽅法 主要是对request和response进⾏⼀些处理,然后交给下⼀个过滤器或
Servlet处理
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
/*初始化⽅法 接收⼀个FilterConfig类型的参数 该参数是对Filter的⼀些配置*/
}
 

3.在web.xml文件中配置 

<filter>
 <filter-name>过滤器名称</filter-name>
 <filter-class>过滤器所在的路径</filter-class>
 </filter>
 <filter-mapping>
 <filter-name>过滤器名称</filter-name>
 <url-pattern>需要过滤的资源</url-pattern>
 </filter-mapping>

3.实际应用

1.如何防止用户未登录就执行后续操作

String name=(String)session.getAttribute("key");
 if(name==null){
 //跳转到登录⻚⾯
 }

 2.设置编码方式--统一设置编码

3.加密解密(密码的加密和解密) 

4.非法文字筛选 

5.下载资源的限制

过滤器的特点:在servlet之前和之后都会被执行

4.代码实现一:单个过滤器

第一步:创建一个过滤器类,实现接口Filter 

package util;

import javax.servlet.*;
import java.io.IOException;

public class FirstFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //初始化filter
        System.out.println("初始化filter");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //请求和响应时都会执行这个方法
        System.out.println("过滤器开始过滤");
        //调取下一个过滤器方法,获取servlet方法
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("过滤器结束过滤");
    }

    @Override
    public void destroy() {
        //销毁Filter
        System.out.println("销毁Filter");
    }
}

 第二步:在web.xml文件中配置过滤器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>f1</filter-name>
        <filter-class>util.FirstFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>f1</filter-name>
        <url-pattern>/login</url-pattern>
    </filter-mapping>
</web-app>

 第三步:在登录处理类新增输出语句,并测试程序

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("login-servlet被执行");
        //接参数
        String username = req.getParameter("username");
        String pass = req.getParameter("pass");
        //写逻辑:判断正误
        if ("admin".equals(username)&&"123456".equals(pass)){
            //登录成功
            //session存值
            HttpSession session = req.getSession();
            session.setAttribute("username",username);
            session.setAttribute("psssword",pass);
            //设置session失效时间
            session.setMaxInactiveInterval(60*30);//单位是秒
            //重定向或者转发,session数据是不会丢失的,但重定向时,requet中的数据会丢失
            resp.sendRedirect("success.jsp");
        }else{
            //登录失败
            //1.后台创建cookie
            Cookie cookie = new Cookie("uname",username);
            //2.返回给前端
            resp.addCookie(cookie);
            resp.sendRedirect("index.jsp");
        }
    }
}

测试结果

init方法在第一次登录时执行,之后的登录就不会执行

destory方法在关闭服务器时执行

doFilter方法每次登录时都会执行

 5.代码实现二:多个过滤器

第一步:创建第二个过滤器接口

 

package util;

import javax.servlet.*;
import java.io.IOException;

public class SecondFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //初始化filter
        System.out.println("初始化2filter");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //请求和响应时都会执行这个方法
        System.out.println("过滤器2开始过滤");
        //调取下一个过滤器方法,获取servlet方法
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("过滤器2结束过滤");
    }

    @Override
    public void destroy() {
        //销毁Filter
        System.out.println("销毁2Filter");
    }
}

 2.配置web.xml文件

<filter>
        <filter-name>f2</filter-name>
        <filter-class>util.SecondFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>f2</filter-name>
        <url-pattern>/login</url-pattern>
    </filter-mapping>

 3.测试结果

 1.服务器启动时

2.登录时

 从1开始开始过滤,再逆序返回,执行顺序跟web.xml文件的顺序有关

代码实现三:加入乱码处理

package util;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class FirstFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //初始化filter
        System.out.println("初始化filter");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //请求和响应时都会执行这个方法
        System.out.println("过滤器开始过滤");
        //处理乱码操作
        HttpServletRequest request=(HttpServletRequest)servletRequest;
        request.setCharacterEncoding("utf-8");
        //调取下一个过滤器方法,获取servlet方法
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("过滤器结束过滤");
    }

    @Override
    public void destroy() {
        //销毁Filter
        System.out.println("销毁Filter");
    }
}

代码实现四 如何防止用户未登录就执行后续操作

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>testsession.jsp-只有用户登录以后才能访问本页面</h1>
当前登录用户:${sessionScope.username}<br>
</body>
</html>

 

package util;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class FirstFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //初始化filter
        System.out.println("初始化filter");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //请求和响应时都会执行这个方法
        System.out.println("过滤器开始过滤");
        //处理乱码操作
        HttpServletRequest request=(HttpServletRequest)servletRequest;
        HttpServletResponse response=(HttpServletResponse)servletResponse;
        request.setCharacterEncoding("utf-8");
        //防止用户在未登录的情况下访问资源
        String requestURI = request.getRequestURI();
        System.out.println("requestURI:"+requestURI);
        Object username = request.getSession().getAttribute("username");
        if (requestURI.endsWith("testsession.jsp")&&username==null){
            response.sendRedirect("index.jsp");
        }
        //调取下一个过滤器方法,获取servlet方法
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("过滤器结束过滤");
    }

    @Override
    public void destroy() {
        //销毁Filter
        System.out.println("销毁Filter");
    }
}

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>f1</filter-name>
        <filter-class>util.FirstFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>f1</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>f2</filter-name>
        <filter-class>util.SecondFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>f2</filter-name>
        <url-pattern>/login</url-pattern>
    </filter-mapping>
</web-app>

 测试结果

启动服务器时

 

 未登录时直接再地址栏输入testsession.jsp,没有跳转,而是重新回到index.jsp页面

 

但是在登录之后,将地址栏的success改成,就可以访问了 

 

监听器:Listener

 

1.什么是监听器

监听器就是监听某个域对象的的状态变化的组件 事件源:被监听的对象 ( 三个域对象 request 、 session 、 servletContext) 监听器:监听事件源对象事件源对象的状态的变化都会触发监听器 注册监听器:将监听器与事件源进行绑定 响应行为:监听器监听到事件源的状态变化时所涉及的功能代码(程序员编写代码)

2.监听器分类 

第一维度按照被监听的对象划分: ServletRequest 域、 HttpSession 域、 ServletContext 域 第二维度按照监听的内容分:监听域对象的创建与销毁的、监听域对象的属性变化

 

 

3.监听三大域对象的创建与销毁的监听器 

监听器的编写步骤(重点):

编写监听器类去实现监听器接口 覆盖监听器的方法 需要在 web.xml 中进行配置 — 注册
 <listener>
 <listener-class>监听器所在的路径</listener-class> 
</listener>
ServletContextListener 监听 ServletContext 域的创建与销毁的监听器 Servlet 域的⽣命周期 何时创建:服务器启动创建 何时销毁:服务器关闭销毁 ServletContextListener 监听器的主要作用 初始化的作作:初始化对象、初始化数据(加载数据库驱动、连接池的初始化) 加载这些初始化的配置文件 (spring 的配置文件) 任务调度 ( 定时器 —Timer/TimerTask )

 

HttpSessionListener 监听 Httpsession 域的创建和销毁的监听器 HttpSession 对象的生命周期 何时创建:第一次调⽤ request.getSession 时创建 何时销毁:服务器关闭销毁、 session 过期(默认 30 分钟,修改默认的 30 分钟是在 Tomcat 的 web.xml ,修改当前项目的过期时间是在自己项目的 web.xml 中)、⼿动销毁

 

HttpSessionListener 监听器的主要作用: 由于每次访问⽹站都会默认创建 session 对象( jsp 页面中 page 指令中的 session 属性默认为 true ,即被访问时创建 session ),可以用于计数⽹站访问过的人数 ServletRequestListener 监听 ServletRequest 域创建与销毁的监听器 ServletRequest 的⽣命周期 创建:每次请求都会创建 request 销毁:请求结束 用法同上,用处不是很大,此处省略。

代码实现

监听session创建与销毁,监听存值与移除数据

package util;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("session创建");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("session销毁");
    }
}
package util;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;


public class AttributeListener implements HttpSessionAttributeListener {
    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("session存值,"+httpSessionBindingEvent.getName()+","+httpSessionBindingEvent.getValue());
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("session移除数据");
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {

    }
}

 测试结果

服务器启动时

 

登录时

 

 

标签:System,println,监听器,过滤器,servlet,public
来源: https://blog.csdn.net/continueLR/article/details/122729024

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有