filterchain

时间:2024-09-24 22:48:14编辑:流行君

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


上一篇:投资学堂

下一篇:没有了