【问题标题】:ClassNotFoundException loading filterClassNotFoundException 加载过滤器
【发布时间】:2018-01-06 19:08:35
【问题描述】:

所以我有一个非常简单的 java EE Web App。它由一个Servlet和一个jsp组成。 Servlet 位于名为“Servlets”的包中。在另一个名为“Filters”的过滤器中过滤。

过滤器是这样的:

@WebFilter(filterName="AuthFilter",
            urlPatterns={"/ProgettoWeb2018/*","/profile/*"})
public class AuthFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
     System.out.println("Hello from filter");
    }
}

现在有了这个设置,我得到以下错误:

java.lang.ClassNotFoundException: Filters.AuthFilter

如果我在“Servlets”包中移动过滤器,它可以正常工作。 怎么会?

【问题讨论】:

  • 当你处于初始级别时,通过 web.xml servlet 过滤器绑定...

标签: servlets jakarta-ee filter package


【解决方案1】:

为了更好的理解Servlet Filter项目视图如下:

Servlet 类是:

package com.whodesire.demos;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/WelcomeServlet")
public class WelcomeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public WelcomeServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException { }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        out.println("<h1>" + request.getParameter("username") + ", Welcome to Secured Servlet<h1>");
        out.println("<hr/>");
        out.close();
    }

}

Servlet过滤器类是:

package com.whodesire.demos;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter("/AuthenticationFilter")
public class AuthenticationFilter implements Filter {

    public AuthenticationFilter() { }

    public void destroy() {
        System.out.println("destroy method is called in " + this.getClass().getName());
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("init method is called in " + this.getClass().getName());

        String username = request.getParameter("username");
        String password = request.getParameter("passwd");
        String ipAddress = request.getRemoteAddr();

        System.out.println("\n username and password is : " + username + ", " + password + "\n");

        //Either you can write source here to fetch here DAO object for validation
        if(username.equals("wsuser") && password.equals("wspassword")) {
            System.out.println("User logged in " + ipAddress + " at " + (new Date().toString()));
            // pass the request along the filter chain
            chain.doFilter(request, response);
        }else {
            //if failed the servlet filter validation
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.println("<h2>Login request rejected in " + ipAddress + " at " + (new Date().toString()) + "</h2>");
            out.close();
        }
    }

    public void init(FilterConfig fConfig) throws ServletException {
        System.out.println("init method is called in " + this.getClass().getName());
    }

}

Login.html 初始页面以及 CSS(放置为 login.css):

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<link rel="stylesheet" type="text/css" href="login.css"/>
<title>Login Form</title>
</head>
<body>
<h2>User Login Form</h2>
<hr/>
<form name="loginForm" method="POST" action="WelcomeServlet">

<div class="login">
  <input type="text" placeholder="Username" name="username"/>  
  <input type="password" placeholder="Password" name="passwd"/>  
  <input type="submit" value="Login"/>
  <a href="#" class="forgot">forgot password?</a>
</div>

</form>
</body>
</html>

@charset "ISO-8859-1";

h2 {
    display: block;
    font-size: 1.8em;
    font-family: sans-serif;
    margin-top: 0.83em;
    margin-bottom: 0.83em;
    margin-left: 0;
    margin-right: 0;
    font-weight: bold;
}

.login { 
    height:110px;
    width:190px;
    margin:auto;
    border:1px #CCC solid;
    padding:10px;
}

.login input { 
    padding:5px;
    margin:5px
}

最后是 web.xml Servlet 调度程序配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

  <display-name>servletFilterDemo</display-name>
  <welcome-file-list>
    <welcome-file>login.html</welcome-file>
  </welcome-file-list>

  <filter>
    <filter-name>Authentication</filter-name>
    <filter-class>com.whodesire.demos.AuthenticationFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>Authentication</filter-name>
    <url-pattern>/WelcomeServlet</url-pattern>
  </filter-mapping>

</web-app>

希望这能让您对 Servlet 过滤器示例有一个简单的了解。

【讨论】:

  • 感谢您的回答。然而我的问题是另一个问题,我的问题并不像我希望的那样清楚。我不明白的是,如果过滤器类与 servlet 位于不同的包中,为什么应用程序找不到过滤器类。这些包都是我的 JavaResources > rcs 文件夹的直接子级。我是否必须以某种方式指定该包是另一个包?我认为拥有 packageName.filterClass 就足够了!
  • @Filippo Bosco 这会帮助你解决这个问题,如果是的话,标记为其他人也更容易回答......这就是我以非常详细的方式分享帖子的原因。
  • 不,先生。它并没有真正回答我的问题!但感谢您为这个主题遮光。
猜你喜欢
  • 2011-06-16
  • 1970-01-01
  • 2021-04-13
  • 2016-08-12
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
相关资源
最近更新 更多