Ⅰ servlet可以被strutsprepareandexecutefilter攔截嗎
這個就抄牽扯到struts2的底層源碼了襲
StrutsPrepareAndExecuteFilte 實現了Filter介面
伺服器啟動調用StrutsPrepareAndExecuteFilte .init()初始化來初始化幾個重要的類,比如Dispatcher
當前台有請求發來,StrutsPrepareAndExecuteFilte 的doFilter()被調用
進行request等的封裝,找到相應action,執行相應action
struts的攔截器很重要,配置在struts-deafault.xml里有很多攔截器
比如說吧: <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
這個攔截器就是自動根據前台來的request來封裝action屬性的攔截器
Ⅱ 用了struts2還能用普通的servlet嗎
這是必然的啊...
struts2的filter必須抄映射成/*..
能不能用servlet我也沒試...
http://..com/question/77895495.html
我的struts2問題..
沒人回答..
郁悶了 ...
IMPORTANT: this filter must be mapped to all requests. Unless you know exactly what you are doing, always map to this URL pattern: /*
這是struts2 DOC文檔里的FilterDispatcher的第一句話..請認真閱讀文檔!
Ⅲ 如何讓struts2和servlet的共存
解決方法目前有四種:
方法1:
統一在後面加上.servlet結尾(包括web.xml配置文件中和頁面上使用servlet的地方)
方法2:
在struts.xml中的<struts>的節點下面添加struts2處理的請求後綴 常量:
<!--
該屬性指定需要Struts 2處理的請求後綴,該屬性的默認值是action,即所有匹配*.action的請求都由Struts 2處理。
如果用戶需要指定多個請求後綴,則多個後綴之間以英文逗號(,)隔開。
-->
<constant name="struts.action.extension" value="action" />
方法3:
在web.xml中修改struts2攔截頁面請求的配置:
原:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
現:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/user/*</url-pattern>
</filter-mapping>
servlet的請求路徑不必改變
方法4:
自定義filter對servlet進行過濾:
##############################################
# 該類是定義了一個過濾器(隨便你放在某個包下面),當既用到struts2又用到servlet時,
# 必須用該過濾器對所有的servlet做一次過濾,否則servlet將無法正常運行。
# 同時在web.xml中,在定義struts的核心控制器的過濾器前面添加該過濾器,添加代碼如下:
* <filter>
* <filter-name>redisp</filter-name>
* <filter-class>filters.ReDispatcherFilter(該過濾器的類名)</filter-class>
* <init-param>
* <param-name>includeServlets</param-name>
* <param-value>所配置的servlet,注意是那url-pattern</param-value>
* </init-param>
* </filter>
* <filter-mapping>
* <filter-name>redisp</filter-name>
* <url-pattern>/*</url-pattern>
* </filter-mapping>
*該類也可以直接繼承StrutsPrepareAndExecuteFilter的
###########################################################
public class ReDispatcherFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException
{
HttpServletRequest request = (HttpServletRequest)req;
String target = request.getRequestURI();
target = target.lastIndexOf("?")>0
?target.substring(target.lastIndexOf("/")+1,target.lastIndexOf("?")-target.lastIndexOf("/"))
:target.substring(target.lastIndexOf("/")+1);
System.out.println(target);
if(this.includes.contains(target))
{
RequestDispatcher rdsp = request.getRequestDispatcher(target);
System.out.println("go..............."+rdsp);
rdsp.forward(req, resp);
}
else
chain.doFilter(req, resp);
}
private ArrayList<String> includes = new ArrayList<String>();
public void init(FilterConfig config) throws ServletException {
this.includes.addAll( Arrays.asList(config.getInitParameter("includeServlets").split(",")));
}
}
Ⅳ struts2攔截了servlet的請求 求大神解決
<url-pattern>*.action</url-pattern> 是過濾的制url 關鍵部位 (結尾)
http://..com/question/481754705.html 這樣 的
你是 481754705.html 這樣, 過濾器過濾 question481754705.html 結尾
所以 你的過濾器在你所請求中永遠不生效 (說白了就是少了個 /)
Ⅳ 什麼是serverlet,filter,listener
對一類 url,或所有 url 進行業務處理 對各種 url 之類進行匹配,查找,執行相應操作,與 action 相比較而言,action 只能針對 某一特定的 url 進行匹配,進行操作 如: <form action = "update.action"> action 對應的 url 是固定的,對於 struts1.x 可能一個 action 只有一個 url 對於 struts2.0,一個 action 可能有多個 url,看它實現的方法數量,不過這些 url 在提交 之前都是已經的,固定的。而上面四種可以對任意 url 進行操作,如 <url-pattern>*.action</url-pattern> 區別:1,servlet 流程是短的,url 傳來之後,就對其進行處理,之後返回或轉向到某一自 己指定的頁面。它主要用來在 業務處理之前進行控制. 2,filter 流程是線性的, url 傳來之後,檢查之後,可保持原來的流程繼續向下執行, 被下一個 filter, servlet 接收等,而 servlet 處理之後,不會繼續向下傳遞。filter 功能可用來保持流程繼續按照原來的方式進行下去,或者主導流程,而 servlet 的功能主要用 來主導流程。 filter 可用來進行字元編碼的過濾,檢測用戶是否登陸的過濾,禁止頁面緩存等 3, servlet,filter 都是針對 url 之類的, listener 是針對對象的操作的, session 而 如 的創建,session.setAttribute 的發生,在這樣的事件發生時做一些事情。 可用來進行:Spring 整合 Struts,為 Struts 的 action 注入屬性,web 應用定時任 務的實現,在線人數的統計等 4,interceptor 攔截器,類似於 filter,不過在 struts.xml 中配置,不是在 web.xml, 並且不是針對 URL 的,而是針對 action,當頁面提交 action 時,進行過濾操作,相當於 struts1.x 提供的 plug-in 機制,可以看作,前者是 struts1.x 自帶的 filter,而 interceptor 是 struts2 提供的 filter. 與 filter 不同點:(1)不在 web.xml 中配置,而是在 struts.xml 中完成配置,與 action 在一起 ( 2 interceptor 來在接收之前做事 一,servlet 1, 在 web.xml 中配置 Servlet <servlet> <servlet-name>AutoServlet</servlet-name> <servlet-class> com.servlet.AutoServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>AutoServlet</servlet-name> <url-pattern>/AutoServlet</url-pattern> </servlet-mapping> 2,定義 AutoServlet,繼承 HttpServlet,實現方法 doGet, doPost ) 可由 action 自己指定用哪個 3, 應用: (1)Struts1.x 就是一個 Servlet, 它會在 doGet 方法中讀取配置文件 struts-config.xml 進行 action 的匹配,進行 (2)驗證碼生成(也可用 action 來做) 業務處理 二,filter 1, web.xml 配置 <filter> <filter-name>checkUrl</filter-name> <filter-class>com.lvjian.filter.CheckUrl</filter-class> <init-param> <param-name>name</param-name> <param-value>asong</param-value> //初始化傳參,得到時在 filter 的 init 方法中用 filterConfig.getInitParameter( "name" ) </init-param> </filter> <filter-mapping> <filter-name>checkUrl</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 2, 繼承 javax.servlet.Filter,實現 doFilter(HttpServletRequest request, HttpServletResponse response FilterChain filterChain) 等方法 HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; //獲取用戶請求的 URI String request_uri = request.getRequestURI(); //獲取 web 應用程序的上下文路徑 String contextPath = request.getContextPath(); //去除上下文路徑,得到剩餘部分的路徑 String uri = request_uri.substring(contextPath.length()); //創建會話 session HttpSession session = request.getSession(true); //保持原有流程不變 filterChain.doFilter( servletRequest , servletResponse ); 3,應用:(1)Struts2.0 (2) 進行字元編碼的過濾,檢測用戶是否登陸的過濾等 (3)禁止頁面緩存,原理就是對各個請求的 url 令其為空,在 doFilter 加入: request.setCharacterEncoding("GB2312");//設置編碼 ((HttpServletResponse)response).setHeader("Pragma" ,"No-cache"); ((HttpServletResponse)response).setHeader("Cache-C ontrol","no-cache"); ((HttpServletResponse)response).setHeader("Expires ","0");//禁止緩存 三,listener 1, 在 web.xml 中配置 <listener> <listener-class>demo.listener.MyContextLoader</listener-class> </listener> //這樣伺服器就會在啟動時創建 MyContextLoader 的一個實例,並開始監聽 servlet,session 的操作 2, 實現 常用的 listener 有: (1) ServletContextListener 監聽 ServletContext。 當創建 ServletContext 時,激 發 contextInitialized(ServletContextEvent sce)方法; 當銷毀 ServletContext 時, 激發 contextDestroyed(ServletContextEvent sce)方法。 (2) 監聽對 ServletContext 屬性的操作,比 如增加、刪除、修改屬性。 (3)HttpSessionListener 監聽 HttpSession 的操作。 當創建一個 Session 時,激發 session Created(HttpSessionEvent se) 方法; 當銷毀一個 Session 時, 激發 sessionDestroyed (HttpSessionEvent se) 方法。 (4)HttpSessionAttributeListener 監聽 HttpSession 中的屬性的操作。 當在 Session 增加一個屬性時,激 發 attributeAdded(HttpSessionBindingEvent se) 方法; 當在 Session 刪除一個屬性時,激發 attributeRemoved(HttpSessionBindingEventse)方法; 當在 Session 屬性被重新設置時,激發 attributeReplaced(HttpSessionBindingEvent se) 方法。 四,interceptor 1, 在 struts.xml 中配置 創建一個 strus.xml 的子配置文件 struts-l99-default.xml,它繼承與 struts2 的 struts-default,此配置文件是其他子配置文件的父類,只要是繼承與該文件的配置文件所 聲明的路徑都會被它過濾 . 方法 1. 普通配置法 <struts> <package name="struts2" extends="struts-default"> <interceptors> <interceptor name="myInterceptor" class="e.hust.interceptor.MyInterceptor"></interceptor> </interceptors> <action name="register" class="e.hust.action.RegisterAction"> <result name="input">/register.jsp</result> <result>/result.jsp</result> <!-- 在自定義 interceptor 並將其 ref 時, 系統會覆蓋掉默認的 interceptor-stack(defaultStack), 為了保證系統默認的 defaultStack 不受影 響, 我們需要顯式的將其引入 --> <!-- 注意兩個 interceptor-ref 的順序, 順序不同, 執行效果也不同: 先配置的先 執行/後配置的先退出(先進後出) --> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="myInterceptor"></interceptor-ref> </action> </package> </struts> 方法 2. 配置攔截器棧(即將多個 interceptor 串聯的一種元素)。然後在<action>中引入 該攔截器棧就可以了。 執行順序為先配置的先執行 這樣做的原因是:多個 action 有相同的多個 interceptor 時,如一般自己寫一個,系統 默認的有一個,要注入兩個, 對多個 action 都寫這兩個,不利於修改,可以寫成一個鏈,只需引用此鏈即可。 (1)攔截目標對象(被代理對象),這里目標對象就是 action;(2)攔截器(一個類,動態的將 某些方法插入到目標對象的某方法的 before、after);(3)對目標對象生成的(動態)代理對 象(代理對象內部方法綜合了目標對象方法+攔截器方法)。程序最終執行的是目標對象的代理, 而這個代理已經插入了 interceptor。攔截器作用:攔截 action。interceptor 相當於一 個入口和出口, 通過 interceptor 進入 action, 執行完 action 的代碼再通過 interceptor 出去。針對"struts2 -- interceptor(Interceptor 怎麼寫)"這篇文章的 MyInterceptor.class 和 MyInterceptor2.class。根據下面的配置文件執行程 序 <struts> <package name="struts2" extends="struts-default"> <struts> <package name="struts2" extends="struts-default"> <interceptors> <interceptor name="myInterceptor" class="e.hust.interceptor.MyInterceptor"></interceptor> <interceptor-stack name="myInterceptorStack"> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <action name="register" class="e.hust.action.RegisterAction"> <result name="input">/register.jsp</result> <result>/result.jsp</result> <interceptor-ref name="myInterceptorStack"></interceptor-ref> </action> </package> </struts> 方法 3. 修改默認攔截器,將自定義的攔截器棧定義為 struts2 的默認攔截器。 <struts> <package name="struts2" extends="struts-default"> <interceptors> <interceptor name="myInterceptor" class="e.hust.interceptor.MyInterceptor"></interceptor> <interceptor-stack name="myInterceptorStack"> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 此默認 interceptor 是針對當前包內所有 action 的,若不為 action 顯式指定 interceptor,就會用 default-interceptor-ref--> <!-- 如果某個 action 中引入了 interceptor, 則在這個 action 中此默認 interceptor 就會失效 --> <default-interceptor-ref name="myInterceptorStack"></default-interceptor-ref> <action name="register" class="e.hust.action.RegisterAction"> <result name="input">/register.jsp</result> <result>/result.jsp</result> </action> </package> </struts> 3. extends MethodFilterInterceptor 的攔截器如何配置哪些方法該攔截、哪些方法不 該攔截(針對方法攔截的配置) <struts> <package name="struts2" extends="struts-default"> <interceptors> <interceptor name="myInterceptor3" class="e.hust.interceptor.MyInterceptor3"></interceptor> </interceptors> <action name="register" class="e.hust.action.RegisterAction" method="queryAll"> <result name="input">/register.jsp</result> <result>/result.jsp</result> <!-- myInterceptor3 攔截器只對 RegisterAction 中的 queryAll()方法和 insert()方法進行了攔截, 其他方法未進行攔截 --> <interceptor-ref name="myInterceptor3"> <param name="includeMethods">queryAll, execute</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> <action name="register" class="e.hust.action.RegisterAction" method="insert"> <result <span 2, 實現 interceptor 類似於 filter, 自定義 filter 是實現 javax.servlet.Filter 來完成, 而 interceptor 類似,它通過實現 com.opensymphony.xwork2.interceptor.Interceptor 來自定義實現。 該介面提供了三個方法: 1) void init(); 在該攔截器被初始化之後,在該攔截器執行攔截之前,系統回調該 方法。對於每個攔截器而言,此方法只執行一次。 2) void destroy();該方法跟 init()方法對應。在攔截器實例被銷毀之前,系統將 回調該方法。 3) String intercept(ActionInvocation invocation) throws Exception; 該方法是用戶需要實現的攔截動作。該方法會返回一個字元串作為邏輯視圖。 除此之外,繼承類 com.opensymphony.xwork2.interceptor.AbstractInterceptor 是更簡單的一種實現攔截器類的方式,因為此類提供了 init()和 destroy()方法的空實現, 這樣我們只需要實現 intercept 方法。 3, 應用 import java.util.Map; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; /** * 許可權檢查攔截器 * * @author qiujy * @version 1.0 */ public class AuthorizationInterceptor extends AbstractInterceptor { /* * 攔截 Action 處理的攔截方法 * */ public String intercept(ActionInvocation invocation) throws Exception { //清除後台頁面的緩存 HttpServletResponse response = ServletActionContext.getResponse(); // ServletActionContext 自動提供,可讓其獲得 request,session,response 等 response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setHeader("Expires","0"); Map session = invocation.getInvocationContext().getSession(); String userName = (String) session.get("userName"); if (null != userName && userName.equals("test")) { System.out.println("攔截器:合法用戶登錄---"); return invocation.invoke(); //保持原來的流程不改變 } else { System.out.println("攔截器:用戶未登錄---"); return Action.LOGIN; //返回到配置文件中名字為 login 的 action } } }
Ⅵ jsp/servlet過濾器和struts2攔截器的有什麼區別
攔截器和過濾器的區別:
1、攔截器是基於java的反射機制的,而過濾器是基於函數回調
2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器
3、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用
4、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能
5、在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
攔截器
:是在面向切面編程的就是在你的service或者一個方法前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前列印出字元串(或者做其它業務邏輯的操作),也可以在你調用方法後列印出字元串,甚至在你拋出異常的時候做業務邏輯的操作。
下面通過實例來看一下過濾器和攔截器的區別:
使用攔截器進行/admin 目錄下jsp頁面的過濾
[html] view plain
<package name="newsDemo"
extends="struts-default"
namespace="/admin">
<interceptors>
<interceptor name="auth"
class="com.test.news.util.AccessInterceptor" />
<interceptor-stack name="authStack">
<interceptor-ref
name="auth" />
</interceptor-stack>
</interceptors>
<!-- action -->
<action name="newsAdminView!*" class="newsAction"
method="{1}">
<interceptor-ref
name="defaultStack"/>
<interceptor-ref
name="authStack">
</interceptor-ref>
下面是我實現的Interceptor class:
[java] view plain
package com.test.news.util;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import
com.opensymphony.xwork2.ActionInvocation;
import
com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import
com.test.news.action.AdminLoginAction;
/**
*
@author chaoyin
*/
public class AccessInterceptor
extends AbstractInterceptor {
private static final long
serialVersionUID = -4291195782860785705L;
@Override
public String intercept(ActionInvocation actionInvocation) throws
Exception {
ActionContext actionContext =
actionInvocation.getInvocationContext();
Map session =
actionContext.getSession();
//except login action
Object action = actionInvocation.getAction();
if (action
instanceof AdminLoginAction) {
return
actionInvocation.invoke();
}
//check
session
if(session.get("user")==null ){
return
"logout";
}
return actionInvocation.invoke();//go
on
}
}
過濾器:是在javaweb中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts的
action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者
struts的action前統一設置字元集,或者去除掉一些非法字元。
使用過濾器進行/admin
目錄下jsp頁面的過濾,首先在web.xml進行過濾器配置:
[html] view plain
<filter>
<filter-name>access
filter</filter-name>
<filter-class>
com.test.news.util.AccessFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>access filter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
下面是過濾的實現類:
[java] view
plain
package com.test.news.util;
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 AccessFilter
implements Filter {
/**
* @author chaoyin
*/
public void destroy() {
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
HttpSession session = request.getSession();
if(session.getAttribute("user")== null &&
request.getRequestURI()。indexOf("login.jsp")==-1 ){
response.sendRedirect("login.jsp");
return ;
}
filterChain.doFilter(arg0, arg1);
}
public void init(FilterConfig arg0) throws ServletException {
}
}
摘自網路--
Ⅶ struts2是filter還是servlet
filter也是servlet,struts2也是通過servlet實現的,如果你能自己寫一個一個structs,你會發現,你寫的就是servlet
Ⅷ STruts2過濾器怎麼攔截所有!save方法
寫一個servlet :UserFilter 實現Filter 介面
重寫方法:public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain){
if(session.getAttribut("user")==null) 異常處理;內
filterChain.doFilter(request, response);
}
修改web.xml增加servlet配置:容
<servlet>
<servlet-name>UserFilter</servlet-name>
<servlet-class>****UserFilter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserFilter</servlet-name>
<url-pattern>*</url-pattern>
</servlet-mapping-->
Ⅸ Struts與serverlet的不同
Servlet: JavaEE規范
1)sun公司提供的JavaEE規范,主要用於開發web應用;
2)簡單的說:servlet就是一個使用了一定協議以及Api的java程序;
專業的說:servlet是一套開發web應用的規范,其內部實現全部由java語言實現,具有java語言的一切優點。開發的過程是用java開發java應用。換句話說就是使用一些已經寫好的java程序去實現一定的業務,即也就是結合業務調用對象以及方法的過程;
3)servlet的主要實現都位於:javax.servlet.*以及javax.servlet.http.*兩個包下;
4)CGI的替代品;
5)一個可以處理多用戶請求的程序,處理方式:同一份代碼,用線程來控制請求處理;servlet api明確說明servlet不是線程安全的,原因是所有的請求處理都是在一個Servlet裡面完成的。
Struts: 最早的MVC開源框架
1)是apache組織基於MVC模式開發的開源的單點控制的web應用框架(framework);
2)struts2的核心是WebWork2,繼承了webwork2的血統,所以跟struts1.x有很大的區別,更類似於WebWork;
3)struts2是一個基於MVC Model 2的單點控制的Web應用框架;
一個是規范,一個是框架,區別大著呢!
Ⅹ struts2 是過濾器還是servlet
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
看名字