可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am having a problem setting up the filter -
the filter I have defined in web.xml looks like this
<filter>
<filter-name>Log</filter-name>
<filter-class>test.log</filter-class>
</filter>
<filter-mapping>
<filter-name>Log</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
But I am getting the following error -
SEVERE: Exception starting filter Log
java.lang.ClassNotFoundException: test.log
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:532)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:514)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:133)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:256)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:103)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4650)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5306)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
I have the class defined but for some reason I am getting the Classnotfoundexcetion. Can someone help me out?
EDIT ---
I have a package called test and a class called log.
package test;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Implements Filter class
public class log implements Filter {
public void init(FilterConfig config) {
}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws java.io.IOException, ServletException {
// Get the IP address of client machine.
String ipAddress = request.getRemoteAddr();
// Log the IP address and current timestamp.
System.out.println("IP "+ ipAddress + ", Time "
+ new Date().toString());
// Pass request back down the filter chain
chain.doFilter(request,response);
}
public void destroy( ){
/* Called before the Filter instance is removed
from service by the web container*/
}
}
Thank You,
回答1:
The filter-class parameter needs to be a Java class that should implement the Filter interface. Can you check if that's the case with you?
Check this example for guidance:
http://viralpatel.net/blogs/tutorial-java-servlet-filter-example-using-eclipse-apache-tomcat/
From the above link:
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>
net.viralpatel.servlet.filters.LogFilter
</filter-class>
<init-param>
<param-name>test-param</param-name>
<param-value>This parameter is for testing.</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
public class LogFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {...
}
}
回答2:
Funny enough, this same issue just happened to me today while it was working on yesterday. After investigation showing nothing was wrong, I concluded this was an eclipse environment issue:
- Stop the tomcat server
- Cleaned the project (Project->Clean...)
- Refresh the whole project (right click on project name -> Refresh)
- Start the server on again.
Issue gone!
回答3:
For a simple solution, try putting your log.class
file into this directory:
tomcat/webapps/[your app name]/WEB-INF/classes/test
Create that directory if it doesn't exist.
How to find your .class file:
Most times, the default setting for Eclipse will compile your source file (.java
) into a .class
file whenever you save it, otherwise you may have to press CTRL-B (build) to force it compile into a .class
file.
Once that is done you will be able to find the log.class
file in your Eclipse workspace at: [your workspace name]/[your eclipse project name]/bin/test/
The workspace directory location is usually visible right when you start eclipse. For Windows 7 I think it defaults to the Users
directory, WinXP and 2000 it defaults to the user's Documents and Settings
folder.
Alternately:
You should have a "Package Explorer" view on the left side of your Eclipse window. It will contain a log.java
leaf in the package tree. If you right-click that leaf and then click on Show In
> Navigator
that will open the actual file structure in the "Navigator" view.
There should be a bin
node visible in that view. Inside that you should find a test
node and then inside that you will see log.class
. You can right-click on it to copy it and then simply navigate to the directory I gave at the top and paste it in.
All should be well.
回答4:
This can be something wrong in the source code of the related class.
Recently I happened to see the same problem.
After a real long time hard investigation, I found that the exception is encoded in the class:
$ jad BaseController.class
Parsing BaseController.class...The class file version is 51.0 (only 45.3, 46.0 and 47.0 are supported)
Generating BaseController.jad
$ cat BaseController.jad
// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
...
import HttpServletRequest;
import HttpServletResponse;
import HttpSession;
...
public class BaseController
{
public BaseController()
{
throw new Error("Unresolved compilation problems: \n\tThe import javax.servlet.http.HttpServletRequest cannot be resolved\n\tThe import javax.servlet.http.HttpServletResponse cannot be resolved\n\tThe import javax.servlet.http.HttpSession cannot be resolved\n\tHttpSession cannot be resolved to a type\n\tHttpServletRequest cannot be resolved to a type\n\tHttpSession cannot be resolved to a type\n\tHttpSession cannot be resolved to a type\n\tHttpServletRequest cannot be resolved to a type\n\tHttpServletRequest cannot be resolved to a type\n\tHttpServletResponse cannot be resolved to a type\n");
}
...
So, after recompile the source with necessary libs, the problem is resolved.
回答5:
Had the problem once, finally right click on project -> Build project helped.
回答6:
I'm guessing that you don't have it copied correctly be included in the servlet classpath.
See here for what makes up the servlet classpath:
Controlling the classpath in a servlet