java过滤器filter能过滤某个包下的所有servlet吗
不能直接过滤。过滤器是根据URL路径来过滤的,不是根据包名来拦截的。但是你可以按照这样的规则配置你的web.xml文件,间接实现你的需求。① 你的servlet的访问路径,根据包名来命名。设计二级路径。比如你有一个user.servlet包。你可以把里面的所有Servlet路径全部设置为/user/xxxServlet。你的filter拦截路径就改为/user/* //1 AServlet代码package user.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class AServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(456); }}//2BServlet代码package user.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class BServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(123);}}//3 filter代码package filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class Myfilter implements Filter {@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {System.out.println("执行了"+arg0.getParameter("name"));arg2.doFilter(arg0, arg1);}@Overridepublic void init(FilterConfig arg0) throws ServletException {}}//4 web.xml配置 AServlet user.servlet.AServlet AServlet /user/AServlet Bservlet user.servlet.BServlet Bservlet /user/BServlet Myfilter filter.Myfilter Myfilter /user/* //5测试 我的工程应用名是HelloWorld http://localhost/HelloWorld/user/AServlet?name=aaa http://localhost/HelloWorld/user/BServlet?name=bbb 会发现控制台分别打印出取出的参数aaa和bbb证明。拦截成功。
java过滤器filter能过滤某个包下的所有servlet吗?
可以的,其实确切的说不是某个包;正如你给的例子中,url-pattern中放的路径一样;你在配置servlet的时候,url-pattern这个路径可以加层次的,举例说明,比如用户信息的所有servlet可以写成 /userinfo/具体的servlet在写过滤器的时候,就可以拦截/userinfo/*;在想你这个问题,如果你如果想拦截某个包下的,可以把这个包下的所有servlet的url-pattern的值,统一加上一层目录( /某某包/* )
Java实现的拦截器
拦截器在在流行的开源框架中很常见 依赖的技术就是Java的动态代理 理解拦截器的核心原理对理解这些开源框架的体系结构至关重要 下面以一个简单的模型的来说明拦截器的实现的一般方法 模型分为以下模块 业务组件 是被代理和被拦截的对象 代理处理器 实现了InvocationHandler接口的一个对象 代理对象 Proxy对象 拦截器 普通的JavaBean 在调用业务方法的之前或者之后会自动拦截并执行自己的一些方法 客户端 执行业务处理的入口 以下是模型的实现 一 业务组件 分为业务接口和业务类 /** * 业务组件接口 */ public interface BusinessInterface { public void doSomething(); } /** * 业务组件 */ public class BusinessClass implements BusinessInterface{ public void doSomething() { System out println( 业务组件BusinessClass方法调用:doSomething() ); } } 二 代理处理器 包含了业务对象绑定动态代理类的处理 并实现了 InvocationHandler接口的invoke方法 import java lang reflect InvocationHandler; import java lang reflect Method; import java lang reflect Proxy; /** * 动态代理处理器工具 */ public class DynamicProxyHandler implements InvocationHandler { private Object business; //被代理对象 private InterceptorClass interceptor = new InterceptorClass(); //拦截器 /** * 动态生成一个代理类对象 并绑定被代理类和代理处理器 * * @param business * @return 代理类对象 */ public Object bind(Object business) { this business = business; return Proxy newProxyInstance( //被代理类 的ClassLoader business getClass() getClassLoader() //要被代理 的接口 本方法返回对象会自动声称实现了这些接口 business getClass() getInterfaces() //代理处理 器对象 this); } /** * 代理要调用的方法 并在方法调用前后调用连接器的方法 * * @param proxy 代理类对象 * @param method 被代理的接口方法 * @param args 被代理接口方法的参数 * @return 方法调用返回的结果 * @throws Throwable */ public Object invoke(Object proxy Method method Object[] args) throws Throwable { Object result = null; interceptor before(); result=method invoke(business args); interceptor after(); return null; //To change body of implemented methods use File | Settings | File Templates } } 三 拦截器 普通的JavaBean 在调用业务方法的之前或者之后会自动拦截并执行自己的 一些方法 /** * 拦截器 */ public class InterceptorClass { public void before(){ System out println( 拦截器InterceptorClass方法调用:before()! ); } public void after(){ System out println( 拦截器InterceptorClass方法调用:after()! ); } } 四 模拟客户端 执行业务处理的入口 /** * 客户端 */ public class Client { public static void main(String args[]) { DynamicProxyHandler handler = new DynamicProxyHandler(); BusinessInterface business = new BusinessClass(); BusinessInterface businessProxy = (BusinessInterface) handler bind(business); businessProxy doSomething(); } lishixinzhi/Article/program/Java/hx/201311/27143