亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Java項目中使用過濾器、攔截器和監聽器

發布時間:2020-11-19 15:59:22 來源:億速云 閱讀:207 作者:Leah 欄目:編程語言

如何在Java項目中使用過濾器、攔截器和監聽器?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

一、攔截器 :是在面向切面編程的就是在你的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 <param name="lzw">struts</param>
   */
  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

<&#63;xml version="1.0" encoding="UTF-8" &#63;>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
  <!--開發模式開關,本地可以設為true幫助調試問題,部署到服務器上設為false-->
  <constant name="struts.devMode" value="false"/>
  <!--務必配上該屬性,否則會導致AOP注入異常-->
  <constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true"/>
  <constant name="struts.i18n.encoding" value="UTF-8" />
  <constant name="struts.multipart.maxSize" value="1000000000"/>
  <package name="strutsLzw" extends="struts-default" namespace="/">
    <interceptors>
      <interceptor name="lzwInterceptorA" class="com.lzw.struts.Interceptor.MyInterceptor">
        <param name="lzw">struts</param>
      </interceptor>
      <interceptor name="lzwInterceptorB" class="com.lzw.struts.Interceptor.FirstInterceptor">
      </interceptor>
      <!-- 定義自己的攔截器棧 -->
      <interceptor-stack name="myStack">
        <interceptor-ref name="lzwInterceptorA"></interceptor-ref>
        <interceptor-ref name="lzwInterceptorB"></interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>
      </interceptor-stack>
    </interceptors>
    <!-- 全局的每個action都會攔截 -->
    <default-interceptor-ref name="myStack"></default-interceptor-ref>
    <!-- 增加method="lzwTest" 執行LoginAction的lzwTest方法 否則執行execute方法 -->
    <action name="login" class="com.lzw.struts.action.LoginAction" method="lzwTest">
      <result name="success">/result.jsp</result>
      <result name="failer">/error.jsp</result>
      <result name="input">/error.jsp</result>
    </action>
  </package>
</struts>

或者:

<&#63;xml version="1.0" encoding="UTF-8" &#63;>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
  <package name="strutsLzw" extends="struts-default">
    <interceptors>
      <interceptor name="lzwInterceptor" class="com.lzw.struts.Interceptor.MyInterceptor">
        <param name="lzw">struts</param>
      </interceptor>
    </interceptors>
    <!-- 增加method="lzwTest" 執行LoginAction的lzwTest方法 否則執行execute方法 -->
    <action name="login" class="com.lzw.struts.action.LoginAction" method="lzwTest">
      <result name="success">/result.jsp</result>
      <result name="failer">/error.jsp</result>
      <result name="input">/error.jsp</result>
      <interceptor-ref name="lzwInterceptor"></interceptor-ref>
      <!--增加defaultStack 否則 驗證攔截器不執行,也就是 validate 方法不執行-->
      <interceptor-ref name="defaultStack"></interceptor-ref>
    </action>
  </package>
</struts>

web.xml中加入:

<filter>
   <filter-name>struts2</filter-name>
   <!-- 已經過時了<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> -->
   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
   <init-param>
    <param-name>actionPackages</param-name>
    <param-value>com.lzw.struts.action</param-value>
   </init-param>
 </filter>
 <filter-mapping>
   <filter-name>struts2</filter-name>
   <url-pattern>/*</url-pattern>
 </filter-mapping>
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+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <base href="<%=basePath%>" rel="external nofollow" >
  <title>My JSP 'login.jsp' starting page</title>
  <meta http-equiv="pragma" content="no-cache">
  <meta http-equiv="cache-control" content="no-cache">
  <meta http-equiv="expires" content="0">
  <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  <meta http-equiv="description" content="This is my page">
  <!--
  <link rel="stylesheet" type="text/css" href="styles.css" rel="external nofollow" >
  -->
 </head>
 <body>
   <form action="login.action" method="post">
     username:<input type="text" name="username"><br>
     password:<input type="password" name="password"><br>
   <input type="submit" value="submit">
   </form>
 </body>
</html>

控制臺結果:

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 中加入:

<filter>
    <filter-name>UserFilter</filter-name>
    <filter-class>com.lzw.filter.demo.UserAccessFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>UserFilter</filter-name>
    <url-pattern>/jsp/*</url-pattern>
</filter-mapping>

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

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 <welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
 </welcome-file-list>
  <listener>
    <listener-class>com.lzw.filter.demo.InitDataListener</listener-class>
  </listener>
</web-app>

控制臺結果:

信息: 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項目中使用過濾器、攔截器和監聽器問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

民乐县| 仁化县| 温州市| 吴忠市| 平邑县| 开平市| 美姑县| 衡东县| 汉沽区| 砚山县| 桦川县| 黔西县| 哈密市| 淮北市| 常宁市| 萨迦县| 资阳市| 昌黎县| 如东县| 磐安县| 原平市| 浑源县| 顺平县| 莫力| 巩留县| 六枝特区| 清涧县| 西乡县| 岐山县| 巴彦县| 河津市| 阳东县| 徐汇区| 昔阳县| 夏津县| 长乐市| 泸水县| 大城县| 崇左市| 安义县| 黔江区|