javax.servlet.Filter 的应用

本文介绍如何使用Java的Filter实现字符编码过滤及登录验证功能。通过实现Filter接口并配置web.xml,可以轻松实现请求编码转换及未授权访问拦截。

 

Filter过滤器的使用
本篇文章是介绍javax.servlet包中Filter的几个功能,一是字符编码过滤,二是拦截指文件夹中的文件,实现登录验证.实现以上两个功能需以下几个步骤:
1、实现javax.servlet.Filter接口,编写两个类,如下:
/**
 * 作用:过滤编码
 */
package filter;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
public class EncodingFilter implements Filter
{
    protected FilterConfig filterConfig;
    private String targetEncoding;
    public EncodingFilter()
    {
        targetEncoding = "gb2312";//直接初始化0912
    }
    public void init(FilterConfig filterconfig) throws ServletException
    {
        filterConfig = filterconfig;
        //targetEncoding = filterconfig.getInitParameter("encoding");//web.xml挂参初始化
    }
    public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)
        throws IOException, ServletException
    {
        HttpServletRequest httpservletrequest = (HttpServletRequest)servletrequest;
        httpservletrequest.setCharacterEncoding(targetEncoding);
        System.out.println("使用" targetEncoding "对请求进行编码过滤");
        filterchain.doFilter(servletrequest, servletresponse);
    }
    public void setFilterConfig(FilterConfig filterconfig)
    {
        filterConfig = filterconfig;
    }
    public void destroy()
    {
        filterConfig = null;
    }
}
/**
 * 作用:过滤外界非法的进入页面
 * 注意:使用该功能时,一定要把登录页与被过滤文件夹设为同级,否则会出现循环
 */
package filter;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
public class ManageFilter implements Filter
{
    String LOGIN_PAGE;
    protected FilterConfig filterConfig;
    public ManageFilter()
    {
        LOGIN_PAGE = "/login.jsp";
    }
    public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)
        throws IOException, ServletException
    {
        HttpServletRequest request = (HttpServletRequest) servletrequest;
        HttpServletResponse response = (HttpServletResponse) servletresponse;
        HttpSession session = request.getSession();
        String key = "";
        try
        {
            //通过验证时在session中存的一个标志
     key = (String) session.getAttribute("key");
          
           
            if (key!= null&&key.equals("ok"))
            {
              
                filterchain.doFilter(servletrequest, servletresponse);
            }
            else
            {
                response.sendRedirect(LOGIN_PAGE);
                System.out.println("被拦截一个未认证的请求");
            }
        }
        catch (Exception exception)
        {
            exception.printStackTrace();
        }
    }
    public void setFilterConfig(FilterConfig filterconfig)
    {
        filterConfig = filterconfig;
    }
    public void destroy()
    {
        filterConfig = null;
    }
    public void init(FilterConfig filterconfig)
        throws ServletException
    {
        filterConfig = filterconfig;
    }
}
2、在web.xml中做一些设置
 
     code
     filter.EncodingFilter
 
 
 
     manage
     filter.ManageFilter
 
 
     code
     /*
 
 
 
     manage
     <!-- <url-pattern>/ShuiBaoRHPWK_NEW/system/ruhepaiwukou/*</url-pattern>-->
     /servlets-examples/*
在 Java Web 应用中出现 `java.lang.ClassNotFoundException: javax.servlet.Filter` 通常表明应用在运行时无法找到 `javax.servlet.Filter` 类。这可能是由于依赖缺失、依赖作用域配置错误或项目配置不正确导致的。 以下是解决此问题的几个方向: ### 1. 确保正确引入 Servlet API 依赖 如果项目使用 Maven 管理依赖,需要在 `pom.xml` 中确保 `javax.servlet-api` 被正确引入。对于使用 Servlet 3.1 的项目,可以添加以下依赖: ```xml <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> ``` 如果使用的是 Jakarta EE(如 Jakarta Servlet 5.0),则应使用: ```xml <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency> ``` 依赖的 `scope` 设置为 `provided` 表示该依赖在编译和测试阶段有效,但在运行时由容器(如 Tomcat)提供 [^3]。 --- ### 2. 检查 Spring Boot 项目中的 Tomcat 依赖作用域 在 Spring Boot 项目中,如果手动更改了 `spring-boot-starter-tomcat` 的作用域为 `provided`,可能会导致运行时缺少必要的类库。为解决此问题,可以将作用域设置为 `compile`: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>compile</scope> </dependency> ``` 此更改确保 Tomcat 依赖在运行时被包含在应用中,而不是依赖外部容器提供 [^5]。 --- ### 3. 确保 IDE 配置与构建配置一致 如果项目在 IDE(如 IntelliJ IDEA)中运行失败,但通过 Maven 打包后运行正常,可能是 IDE 的运行时类路径配置不正确。此时需要检查 IDE 的运行配置是否正确,并确保其使用的类路径与构建工具(如 Maven)一致 [^3]。 --- ### 4. 使用正确的 JDK 版本 某些类(如 `javax.xml.bind` 相关类)在 JDK 9 及以上版本中被移除,因此如果项目依赖这些类,需要手动添加对应的依赖。虽然 `javax.servlet.Filter` 不属于此类,但如果项目依赖的其他库需要旧版本的 JDK 功能,也可能导致类加载失败 [^4]。 --- ### 5. 清理并重新构建项目 如果依赖配置正确但仍出现问题,可以尝试清理并重新构建项目。在 Maven 中可以使用以下命令: ```bash mvn clean install ``` 然后重新启动应用,确保所有依赖正确加载 [^1]。 --- ### 6. 检查运行时环境 如果应用部署在外部容器(如 Tomcat)中,需要确保容器的版本与项目使用的 Servlet 规范兼容。例如,Tomcat 9 支持 Servlet 4.0,而 Tomcat 8 支持 Servlet 3.1。如果容器版本过低,可能导致某些类无法找到 [^2]。 --- ### 总结 解决 `java.lang.ClassNotFoundException: javax.servlet.Filter` 的关键在于确保依赖配置正确、运行时类路径完整,并且与开发环境和构建工具保持一致。根据项目类型和部署方式,调整依赖作用域和引入合适的 API 是解决问题的核心步骤。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值