導航:首頁 > 凈水問答 > mvcaction過濾器

mvcaction過濾器

發布時間:2023-06-01 22:06:24

A. mvc中的action過濾器有哪些

MVC支持的過濾器類型有四種,分別是:Authorization(授權),Action(行為),Result(結果)和Exception(異常)。如下表,

B. springmvc過濾器和攔截器的區別

攔截器與過濾器的區別 :
1. 攔截器是基於java的反射機制的,而過濾器是基於函數回調。
2. 攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3. 攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4. 攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
5. 在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次

攔截器的代碼實現(以struts2為例):
1、在xml文件中如何定義攔截器
<interceptors>
<interceptor name="filterIPInterceptor"
class="com.xxxx.web.FilterIPActionInterceptor" />
<interceptor-stack name="filterIPStack">
<interceptor-ref name="defaultStack" />

<interceptor-ref name="filterIPInterceptor" />
</interceptor-stack>
</interceptors>

2、怎麼遍別寫自定義攔截器

public class FilterIPActionInterceptor extends AbstractInterceptor
{
/** 日誌控制. */
private final Log log = LogFactory.getLog(getClass());

/**
* @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
*/
@Override

C. SpringMVC的攔截器和過濾器的區別與聯系

首先給介紹下過濾器和攔截器的區別:
(1)攔截器是基於Java的反射機制的,而過濾器是基於函數回調。
(2)攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
(3)攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
(4)攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
(5)在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
(6)攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,
可以調用業務邏輯。
然後進行分析下:
1.過濾器是JavaEE標准,採用函數回調的方式進行。是在請求進入容器之後,還未進入Servlet之前進行預處
理,並且在請求結束返回給前端這之間進行後期處理。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("before...");
chain.doFilter(request, response);
System.out.println("after...");
}

chain.doFilter(request, response);這個方法的調用作為分水嶺。事實上調用Servlet的doService()方法是在
chain.doFilter(request, response);這個方法中進行的。

2.攔截器是被包裹在過濾器之中的。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}

a.preHandle()這個方法是在過濾器的chain.doFilter(request, response)方法的前一步執行,也就是在
[System.out.println("before...")][chain.doFilter(request, response)]之間執行。
b.preHandle()方法之後,在return ModelAndView之前進行,可以操控Controller的ModelAndView內容。
c.afterCompletion()方法是在過濾器返回給前端前一步執行,也就是在[chain.doFilter(request, response)]
[System.out.println("after...")]之間執行。
3.SpringMVC的機制是由同一個Servlet來分發請求給不同的Controller,其實這一步是在Servlet的service()方法
中執行的。所以過濾器、攔截器、service()方法,dispatc()方法的執行順序應該是這樣的如下圖:

D. SpringMVC的攔截器和過濾器的區別與聯系

1.1 什麼是攔截器:
攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。攔截是AOP的一種實現策略。
在Webwork的螞前喚中文文檔的解釋為——攔截悶凱器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行。同時也是提供了一種可以提悔返取action中可重用的部分的方式。
談到攔截器,還有一個詞大家應該知道——攔截器鏈(Interceptor Chain,在Struts2中稱為攔截器棧 Interceptor Stack)。攔截器鏈就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或欄位時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。

E. SpringMVC的攔截器和過濾器的區別與聯系

過濾器是基於函數回掉的,幾乎對所有請求起作用,並且在一個action的生命周期中只在初始化的時候調用一次,攔截器是基於java反射機制的,只對action起作用,攔截器在一個action生命周期中多次調用

F. MVC中設置全局過濾器,當設置了Controller過濾器時,怎麼排除內部的一些action不使用過濾器

吧你過濾器的代碼貼出來

G. MVC4 過濾器使用和怎樣控制全部action和部分action

讓一個中的所有Action都執行這個過濾器就需要對裡面的方法進行重寫

public class LoginController : Controller
{
//
// GET: /Login/
public ActionResult Index()
{
return View();
}

public ActionResult Login()
{
string name = HttpContext.Request["UserName"];
ViewData["name"] = name;
return View();
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
//object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoFilter), true);
//if (attrs.Length == 1)//有NoFilter屬性
//{
// return;
//}

string name = filterContext.HttpContext.Request["UserName"];
if (string.IsNullOrEmpty(name))
{
filterContext.HttpContext.Response.Write("<script>alert('名稱不能為空!');</script>");
filterContext.HttpContext.Response.End();
}
}
}

View Code
這樣每個action在執行前都會先執行這個過濾器。
下面是怎樣讓Index的Action不執行,只是對Login執行。有2種方式實現:
第一種:代碼修改如下:

public class LoginController : Controller
{
//
// GET: /Login/
[NoFilter]
public ActionResult Index()
{
return View();
}

public ActionResult Login()
{
string name = HttpContext.Request["UserName"];
ViewData["name"] = name;
return View();
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
//過濾掉標有NoFilter標簽的Action
object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoFilter), true);
if (attrs.Length == 1)//有NoFilter屬性
{
return;
}

string name = filterContext.HttpContext.Request["UserName"];
if (string.IsNullOrEmpty(name))
{
filterContext.HttpContext.Response.Write("<script>alert('名稱不能為空!');</script>");
filterContext.HttpContext.Response.End();
}
}
}
public class NoFilter : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
//
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
//
}
}

View Code
第二種:代碼修改如下:

public class LoginController : Controller
{
//
// GET: /Login/
public ActionResult Index()
{
return View();
}
[LoginFilter]
public ActionResult Login()
{
string name = HttpContext.Request["UserName"];
ViewData["name"] = name;
return View();
}
//protected override void OnActionExecuting(ActionExecutingContext filterContext)
//{
// //過濾掉標有NoFilter標簽的Action
// object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoFilter), true);
// if (attrs.Length == 1)//有NoFilter屬性
// {
// return;
// }

// string name = filterContext.HttpContext.Request["UserName"];
// if (string.IsNullOrEmpty(name))
// {
// filterContext.HttpContext.Response.Write("<script>alert('名稱不能為空!');</script>");
// filterContext.HttpContext.Response.End();
// }
//}
}
public class LoginFilter : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{

string name = filterContext.HttpContext.Request["UserName"];
if (string.IsNullOrEmpty(name))
{
filterContext.HttpContext.Response.Write("<script>alert('名稱不能為空!');</script>");
filterContext.HttpContext.Response.End();
}
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
//
}
}

View Code
補充:1.自定義過濾器Filter必須繼承FilterAttribute。
2.定義過個過濾器可以定義過濾器執行的先後順序 例如: 在Action上標注:
[NoFilter(Order=2)]
[LoginFilter(Order=1)]
這樣當執行這個Action時候會先執行LoginFilter 再執行NoFilter。

H. MVC過濾器,怎麼排除某個Action不使用Controller下的過濾器

當ActionInvoker在執行目標Action方法之前,會根據Order和Scope屬性對用於封裝的Filter對象進行排序。然後根據當前ControllerContext和ActionDescriptro創建一個ActionExecutingContext對象,並將其作為參數依次調用所有ActionFilter的OnActionExecuting方法。在這之後真正的目標Action方法被執行,ActionInvoker隨後執行後續的篩選操作。具體來說,它根據當前ControllerContext、ActionDescriptro以及Action方法執行過程中拋出的異常創建一個ActionExecutedContext對象。該ActionExecutedContext的Cancel屬性為False,如果Action方法返回一個ActionResult對象,該對象將會作為該ActionExecutedContext的Result屬性。接下來按照相反的次序依次調用ActionFilter對象的OnActionExecuted方法,執行過程中的ActionFilter可以修改ActionExecutedContext的Result屬性。當整個ActionFilter鏈執行結束之後,ActionExecutedContext的Result屬性返回的ActionResult將會作為對當前請求的響應。右圖基本上反映了連同目標Action在內的整個ActionFilter鏈的執行過程。

I. MVC 怎麼讓某個Action 不執行過濾器

--解決思路----------------------
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)

J. c#mvc過濾器有哪幾種,應用場景是什麼

mvc裡面的model通常稱為viewmodel 顧名思義用來與view做交互的 三層里的model通常與資料庫欄位保持一版致 在三層里用來與資料庫和業務層權做交互 兩者都是實體類 DAL操作資料庫封裝成一個model 向上傳遞至BLL 然後在mvc中將model轉換為viewmodel供vi

閱讀全文

與mvcaction過濾器相關的資料

熱點內容
恆潔雙重除垢花灑 瀏覽:55
大胸電影大尺度 瀏覽:119
水垢水泡茶 瀏覽:915
杭州提升泵廠家直銷 瀏覽:185
邁騰汽油濾芯怎麼樣 瀏覽:937
李海仁拍過的限製片 瀏覽:392
超濾膜進水cod的要求 瀏覽:116
怡口凈反滲透膜 瀏覽:990
一根住凈水器怎麼換 瀏覽:253
美國男露器官電影 瀏覽:88
水性達克羅專用樹脂 瀏覽:532
收姨收母的小說 瀏覽:21
蒸餾酒的製作工藝流程 瀏覽:86
除垢劑是幹嘛的 瀏覽:975
深圳濱河污水處理廠規模 瀏覽:156
漏點最大的十大電影 瀏覽:849
飲水機怎麼拆解內膽 瀏覽:209
煤礦污水廢水監測分析的作用 瀏覽:582
揭陽榕城191樹脂材料 瀏覽:253
沁園顆粒活性炭濾芯怎麼沖洗 瀏覽:678