如何在Java项目中使用过滤器、拦截器和监听器

如何在Java项目中使用过滤器、拦截器和监听器?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

创新互联是一家专注网站建设、网络营销策划、成都小程序开发、电子商务建设、网络推广、移动互联开发、研究、服务为一体的技术型公司。公司成立10多年以来,已经为近千家三维植被网各业的企业公司提供互联网服务。现在,服务的近千家客户与我们一路同行,见证我们的成长;未来,我们一起分享成功的喜悦。

一、拦截器:是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方 法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

1.Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现。

2.拦截器栈(Interceptor Stack)Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。

package com.lzw.struts.Interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MyInterceptor extends MethodFilterInterceptor {
  private static final long serialVersionUID = -6410044851077844880L;
  /**
   * 在struts.xml struts
   */
  private String lzw;
  public String getLzw() {
    return lzw;
  }
  public void setLzw(String lzw) {
    this.lzw = lzw;
  }
  @Override
  public void destroy() {
    System.out.println("destroy!");
  }
  @Override
  public void init() {
    System.out.println("init!");
  }
  @Override
  protected String doIntercept(ActionInvocation invocation) throws Exception {
    System.out.println("MyInterceptor-start");
    System.out.println(lzw);
    String result = invocation.invoke();
    System.out.println("MyInterceptor-end");
    return result;
  }
}
package com.lzw.struts.Interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class FirstInterceptor extends MethodFilterInterceptor {
  private static final long serialVersionUID = 1L;
  @Override
  protected String doIntercept(ActionInvocation invocation) throws Exception {
    System.out.println("FirstInterceptor-Start");
    String result = invocation.invoke();
    System.out.println("FirstInterceptor-End");
    return result;
  }
}

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>


  
  
  
  
  
  
  
    
      
        struts
      
      
      
      
      
        
        
        
      
    
    
    
    
    
      /result.jsp
      /error.jsp
      /error.jsp
    
  

或者:

<?xml version="1.0" encoding="UTF-8" ?>


  
    
      
        struts
      
    
    
    
      /result.jsp
      /error.jsp
      /error.jsp
      
      
      
    
  

web.xml中加入:


   struts2
   
   org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
   
    actionPackages
    com.lzw.struts.action
   
 
 
   struts2
   /*
 
package com.lzw.struts.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport{
  private static final long serialVersionUID = 1L;
  private String username;
  private String password;
  public String getUsername() {
    return username;
  }
  public void setUsername(String username) {
    this.username = username;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  @Override
  public String execute() throws Exception {
    System.out.println("=====execute=====");
    if ("hello".equals(this.getUsername().trim()) && "world".equals(this.getPassword().trim())) {
      return "success";
    } else {
      this.addFieldError("username", "username or password error");
      return "failer";
    }
  }
  @Override
  public void validate() {
    System.out.println("=====validate=====");
    if (null == this.getUsername() || "".equals(this.getUsername().trim())) {
      this.addFieldError("username", "username required");
    }
    if (null == this.getPassword() || "".equals(this.getPassword().trim())) {
      this.addFieldError("password", "password required");
    }
  }
  public String lzwTest() {
    System.out.println("======Test====");
    return SUCCESS;
  }
}
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>


 
  
  My JSP 'login.jsp' starting page
  
  
  
  
  
  
 
 
   
username:
password:

控制台结果:

init!
2013-10-31 13:51:15 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-apr-8080"]
2013-10-31 13:51:15 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["ajp-apr-8009"]
2013-10-31 13:51:15 org.apache.catalina.startup.Catalina start
信息: Server startup in 1699 ms
MyInterceptor-start
struts
FirstInterceptor-Start
=====validate=====
======Test====
FirstInterceptor-End
MyInterceptor-end

二、过滤器:是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符。主要为了减轻服务器负载,减少压力

package com.lzw.filter.demo;
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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class UserAccessFilter implements Filter{
  @Override
  public void destroy() {
    System.out.println("destroy!");
  }
  @Override
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
      throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest)req;
    HttpServletResponse response = (HttpServletResponse)res;
    HttpSession session = request.getSession();
    if(session.getAttribute("user")== null && request.getRequestURI().indexOf("login.jsp")==-1 ){
      response.sendRedirect("login.jsp");
      return ;
    }
    chain.doFilter(req, res);
  }
  @Override
  public void init(FilterConfig config) throws ServletException {
    //ApplicationFilterConfig[name=UserFilter, filterClass=com.lzw.filter.demo.UserAccessFilter]
    System.out.println(config.toString());
  }
}

web.xml 中加入:


    UserFilter
    com.lzw.filter.demo.UserAccessFilter


    UserFilter
    /jsp/*

1、拦截器是基于java的反射机制的,而过滤器是基于函数回调
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

执行顺序 :过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。

个人认为过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理);

过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的Action;

Action处理完成返回后,拦截器还可以做其他过程,再向上返回到过滤器的后续操作。

三、监听器:Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。

主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。

package com.lzw.filter.demo;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class InitDataListener implements ServletContextListener {
  private static ServletContext servletContext;
  public static ServletContext getServletContext() {
    return servletContext;
  }
  @Override
  public void contextInitialized(ServletContextEvent contextEvent) {
    servletContext = contextEvent.getServletContext();
    //final ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
    System.out.println("服务器启动完毕!");
    System.out.println(servletContext);
  }
  @Override
  public void contextDestroyed(ServletContextEvent sce) {}
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>

 
  index.html
  index.htm
  index.jsp
  default.html
  default.htm
  default.jsp
 
  
    com.lzw.filter.demo.InitDataListener
  

控制台结果:

信息: Starting service Catalina
2013-10-31 15:13:55 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet Engine: Apache Tomcat/7.0.42
服务器启动完毕!
org.apache.catalina.core.ApplicationContextFacade@7966340c
2013-10-31 15:13:56 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-apr-8080"]
2013-10-31 15:13:56 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["ajp-apr-8009"]
2013-10-31 15:13:56 org.apache.catalina.startup.Catalina start
信息: Server startup in 402 ms

关于如何在Java项目中使用过滤器、拦截器和监听器问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


本文标题:如何在Java项目中使用过滤器、拦截器和监听器
分享URL:http://ybzwz.com/article/jsdese.html