导航:首页 > 净水问答 > mvc4过滤器终止执行

mvc4过滤器终止执行

发布时间:2021-02-19 00:15:11

㈠ C# MVC Filter过滤器如何停止往下执行

你这是开发mvc可不是开发asp,什么年代了还Response.Write呢?

设置filterContext的Result为一个ViewResult来阻止执行Action

㈡ 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链的执行过程。

㈢ 过滤器和SpringMVC的拦截器的区别

过滤器和拦截器的区别:

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

⑥拦截器可以获取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()方法之后,在returnModelAndView之前进行,可以操控Controller的ModelAndView内容。

c.afterCompletion()方法是在过滤器返回给前端前一步执行,也就是在[chain.doFilter(request, response)][System.out.println("after...")]之间执行。

3.SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。所以过滤器、拦截器、service()方法,dispatc()方法的执行顺序应该是这样的,大致画了个图:其实非常好测试,自己写一个过滤器,一个拦截器,然后在这些方法中都加个断点,一路F8下去就得出了结论。

㈣ aspnet mvc 拦截器 怎么不执行action的代码

有很多过复滤器 MVC支持的过滤器类型有制四种,分别是:Authorization(授权),Action(行为),Result(结果)和Exception(异常)
http://www.cnblogs.com/xlhblogs/p/3349972.html 去好好看看,都可以有效拦截 action

㈤ spring mvc拦截器 和 过滤器哪个先执行

先执行filter,只有限制性过滤器之后才可以进入容器执行拦截

㈥ 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。

㈦ MVC中设置全局过滤器,当设置了Controller过滤器时,怎么排除内部的一些action不使用过滤器

吧你过滤器的代码贴出来

㈧ MVC 怎么让某个Action 不执行过滤器

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

㈨ 在springmvc中使用过滤器chain.dofilter 出不去

如果走chain的话,通过chain.doFilter(request,response)这个方法会立即跳转到被拦截的servlet并且执行完还要再返回filter.chain相当于一扇门,从这扇门出去再从这扇门回来.调用filter的方法就是在web.xml中配置,需要配置一个与你需要拦截的servlet相同的url-pattern.
<!-- 配置一个过滤器 -->
<filter>
<filter-name>suibianxie</filter-name>
<filter-class>com.etoak.filter.MyEncoding</filter-class>
<!-- 配置一个私有参数 -->
<init-param>
<param-name>mycode</param-name>
<param-value>gbk</param-value>
</init-param>
</filter>
<!-- 拦截的先后顺序和mapping的顺序有关 -->
<filter-mapping>
<filter-name>suibianxie</filter-name>
<!-- 注意这里和要拦截的servlet的url-pattern必须一致,等于是过滤器
抢在servlet之前拦截住了 -->
<url-pattern>/servlet/Test</url-pattern>
</filter-mapping>
<!-- 配置第二个过滤器 -->
<filter>
<filter-name>suibianxie2</filter-name>
<filter-class>com.etoak.filter.Naming</filter-class>
</filter>
<filter-mapping>
<filter-name>suibianxie2</filter-name>
<url-pattern>/servlet/Test</url-pattern>
</filter-mapping>

<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>com.etoak.servlet.Test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/servlet/Test</url-pattern>
</servlet-mapping>

㈩ mvc 过滤器怎么不能跳转页面

服务器跳转需要在复写doFilter()类中 用 reques.getRequestDiapacther().forward("路径"); 跳转回
客户端跳转应该答用 response.sendRedirect("路径");

阅读全文

与mvc4过滤器终止执行相关的资料

热点内容
进气滤芯不好有什么影响 浏览:173
用甲醛标样代替蒸馏水 浏览:422
艾克罗司空气负离子净化器怎么用 浏览:339
苗圃净水厂建在哪里 浏览:144
医院化验室重金属废水处理 浏览:480
污水处理厂污泥处置批复 浏览:176
杭州水处理中心 浏览:846
假冒南亚环氧树脂 浏览:890
垃圾中转站污水处理流程 浏览:285
超滤膜1004工作原理图 浏览:239
反渗透净水机不往桶走水怎么办 浏览:792
反渗透膜清理 浏览:159
污水厂工作单位状况 浏览:714
无纺布的过滤效率 浏览:206
净水器使用时要开废水开关吗 浏览:618
水壶烧水有水垢能不能喝 浏览:880
石家庄桥东污水处理厂还有吗 浏览:213
为什么要先定容后过滤 浏览:500
反渗透膜管清洗剂 浏览:64
污水提升泵泽德e2 浏览:250