Servlet 过滤器

本文详细介绍了Servlet过滤器的应用场景及实现方式,包括乱码处理、非法字符过滤及强制登录等功能,并探讨了Servlet监听器的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Servlet 过滤器

作用:把某些信息过滤掉

1、滤器可以做什么?
    (1) 对请求进行统一编码---》乱码处理功能
    (2) 对请求进行认证---》强制登录
    (3)过滤非法字符---》非法字段

2、实现方式
    一、实现 Filter 接口

    案例1:过滤乱码
//重写doFilter方法
    @Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
        FilterChain arg2) throws IOException, ServletException {
    HttpServletRequest request=(HttpServletRequest) arg0;//转为HttpServletRequest
    HttpServletResponse response=(HttpServletResponse) arg1;//转为HttpServletResponse
    request.setCharacterEncoding("utf-8");//请求编码
    response.setCharacterEncoding("utf-8");//响应编码
    response.setContentType("text/html;charset=utf-8");//设置响应编码类型
    arg2.doFilter(request, response);//条件成立则放行
}

Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。

二、配置web.xml

<!-- 配置过滤器 -->
<filter>
    <filter-name>q1</filter-name>
    <filter-class>com.xdl.filter.FilterEncoding
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>q1</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

三、案例2:过滤非法字符
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
        FilterChain arg2) throws IOException, ServletException {
    HttpServletRequest request=(HttpServletRequest) arg0;
    HttpServletResponse response=(HttpServletResponse) arg1;
    String jl = request.getParameter("jl");//取 :简历中的内容
//      if(jl!=null&&(jl.contains("小日本")||jl.contains("坏蛋"))){
//          response.sendRedirect("filter.jsp");
//      }else{
//          arg2.doFilter(request, response);//放行
//      }
    PersonDaoImpl db=new PersonDaoImpl();//实例化数据库
    List<String> findSpeak = db.findSpeak();//找出扎有表中speka字段的信息
    boolean flag=false;
    for(String ss:findSpeak){
        if(jl.contains(ss)){//找到此信息,则为非法,然后就把flag设置为 true
            flag=true;

        }
    }
    if(jl!=null&&flag){
        System.out.println("重点关注此人:"+request.getRemoteAddr());
        response.sendRedirect("filter.jsp");

    }else{
        arg2.doFilter(request, response);//放行
    }
}

web.xml配置
<filter>
    <filter-name>q2</filter-name>
    <filter-class>com.xdl.filter.FilterSpeak</filter-class>
</filter>
<filter-mapping>
    <filter-name>q2</filter-name>
    <url-pattern>/SaveServlet</url-pattern>
</filter-mapping>

    四、案例3:强制登录

    //@WebFilter("/ListServlet")也可以通过全注解方式实现过滤器,只过滤ListServlet 如果用/*则全过滤 ,此时web.xml不用配置
    @Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
        FilterChain arg2) throws IOException, ServletException {
    HttpServletRequest request=(HttpServletRequest) arg0;
    HttpServletResponse response=(HttpServletResponse) arg1;
    HttpSession session = request.getSession();
    String username = (String) session.getAttribute("usename");
    if(username==null){
        response.sendRedirect(request.getContextPath()+"/index.jsp");//去登录
    }else{
    arg2.doFilter(request, response);//通过后,放行
    }
}

监听器

Servlet监听器也叫做 listener,通过它可以监听Web应用的上下文(环境)信息、Servlet请求信息、Servlet会话信息,并自动根据不同情况,在后台调用相  应的处理程序。通过监听器,可以自动激发一些操作


public class Listener1 implements HttpSessionListener, ServletContextListener,
    ServletRequestListener {
        ......}

//配置 web.xml;
     <listener>
    <listener-class>com.xdl.listener.Listener1</listener-class>
    </listener>

Md5加密

一、作用:MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆,即安全性较高,目前情况下md5128位加密认为是不可解的

123+12--》135    加密码  ,解密-->135-12>123 就是将来可能会到rsa加密码算法,分为 公有密钥和私有密钥

二、开发实现
    1、只需从百度找一个md5的文件即可:MD5Utils

    2、开发注册功能
    public void saveUser(User uu) {
    String sql = "insert into stu values(stu_seq.nextval,?,?)";
    // 把密码进行md5加密
    executeUpdate(
            sql,
            new Object[] { uu.getName(), MD5Utils.MD5Src(uu.getPassword()) });
}

3、开发登录功能
public boolean loginUser(User uu) {
    String sql = "select * from stu where name=? and password=?";// 由用户和密码作条件
    ResultSet rs = executeQuery(
            sql,
            new Object[] { uu.getName(), MD5Utils.MD5Src(uu.getPassword()) });
    try {
        if (rs.next()) { // 如果找到了
            return true;
        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return false;
}
### Servlet 过滤器的配置及使用方法 #### 1. 创建过滤器过滤器类需要实现 `javax.servlet.Filter` 接口,并重写其三个核心方法:`init`、`doFilter` 和 `destroy`。 - **`init` 方法**:在服务器启动时被调用,主要用于加载配置文件或初始化资源[^1]。 - **`doFilter` 方法**:这是过滤器的核心部分,用于拦截并处理请求和响应对象。可以在这里添加自定义逻辑,比如编码设置、权限验证等[^1]。 - **`destroy` 方法**:当服务器关闭时被调用,用于释放过滤器所占有的资源[^1]。 以下是一个简单的过滤器类示例: ```java import javax.servlet.*; import java.io.IOException; public class ExampleFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作,例如读取配置参数 String param = filterConfig.getInitParameter("exampleParam"); System.out.println("初始化参数:" + param); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 在这里可以对请求进行预处理 System.out.println("请求前的操作"); // 继续传递给下一个过滤器或目标资源 chain.doFilter(request, response); // 在这里可以对响应进行后处理 System.out.println("响应后的操作"); } public void destroy() { // 清理工作 System.out.println("销毁过滤器"); } } ``` --- #### 2. 配置过滤器 可以通过两种方式来配置过滤器:基于 XML 的配置和基于注解的配置。 ##### (1) 基于 XML 的配置 通过 `web.xml` 文件中的 `<filter>` 和 `<filter-mapping>` 标签完成过滤器的注册和映射。 - **<filter> 标签**:定义过滤器的名称及其对应的类名。 - **<filter-mapping> 标签**:指定哪些 URL 请求会被该过滤器拦截。 示例配置如下: ```xml <filter> <filter-name>ExampleFilter</filter-name> <filter-class>com.example.ExampleFilter</filter-class> <!-- 可选:定义初始化参数 --> <init-param> <param-name>exampleParam</param-name> <param-value>value</param-value> </init-param> </filter> <filter-mapping> <filter-name>ExampleFilter</filter-name> <url-pattern>/secure/*</url-pattern> </filter-mapping> ``` 在这个例子中,所有匹配 `/secure/` 路径的请求都会经过 `ExampleFilter` 处理[^4]。 ##### (2) 基于注解的配置 如果使用的 Servlet 容器支持 Servlet 3.0 或更高版本,则可以直接使用 `@WebFilter` 注解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值