重庆网站建设 吧,muse怎么做网站,网站开发教程网,英文网站建设哪家强文章目录 一、拦截器和过滤器的区别二、拦截器和过滤器的代码实现1、拦截器2、过滤器 三、总结1、什么是Filter及其作用介绍2、Filter API介绍3、Filter链与Filter生命周期 四、拦截器五、过滤器和拦截器的区别 一、拦截器和过滤器的区别
1、拦截器(Interceptor)只对action请求… 文章目录 一、拦截器和过滤器的区别二、拦截器和过滤器的代码实现1、拦截器2、过滤器 三、总结1、什么是Filter及其作用介绍2、Filter API介绍3、Filter链与Filter生命周期 四、拦截器五、过滤器和拦截器的区别 一、拦截器和过滤器的区别
1、拦截器(Interceptor)只对action请求起作用 即对外访问路径
而过滤器(Filter)则可以对几乎所有的请求都能起作用 包括css js等资源文件
2、拦截器(Interceptor)是在Servlet和Controller控制器之间执行
而过滤器(Filter)是在请求进入Tomcat容器之后 但是在请求进入Servlet之前执行
web.xml加载顺序context- param - listener - filter - servlet
在请求结束返回时也是一样 是在Servlet处理完之后返回给前端之间执行 二、拦截器和过滤器的代码实现
1、拦截器
首先需要一个拦截器类 并且这个类要实现HandlerInterceptor接口
这个接口里面有三个方法
Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{// 在拦截点Controller方法处理之前执行拦截 若返回的是false则中断执行 反之亦然return false;
}Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{// 在处理过程中Controller方法处理完之后 DispatcherServlet进行视图的渲染之前执行拦截
}Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
{// 在DispatcherServlet进行视图的渲染后 返回前进行拦截
}稍微写一下方法
Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{// 在Controller方法处理之前执行拦截 若返回的是false则中断执行 反之亦然// 判断当前的User是否为空 若不为空则不拦截if (request.getSession().getAttribute(USERINFO)!null){return true;}// 进行拦截 返回登录界面response.sendRedirect(request.getContextPath()/user/doLogin.do);return false;}然后需要去SpringMVC的配置文件中配置拦截器
!-- 配置拦截器 --
mvc:interceptorsmvc:interceptor!-- 拦截所有的mvc控制器(Controller) --mvc:mapping path/**/!-- 放行机制 指定对某个页面不进行拦截 --!-- 拦截器只对action起作用 因此填入的不是页面路径 而是方法 --mvc:exclude-mapping path/user/doLogin.do/!-- 指定使用哪个拦截器 --bean classnet.zjitc.interceptor.LoginInterceptor//mvc:interceptor
/mvc:interceptors如此 当访问的请求不为/user/doLogin.do会被拦截然后重定向到/user/doLogin.do
但是访问其它的页面不会被拦截
想要让页面也被拦截你需要过滤器
2、过滤器
同理 需要一个过滤器类 然后实现javax.servlet.Filter接口 注意Filter的路径别导错了 因为有很多同名接口
public class LoginFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException{// 过滤器初始化}Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException{}Overridepublic void destroy(){// 过滤器销毁}
}稍微写一下方法
Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
{// ServletRequest是一个接口 而HttpServletRequest是接口的实现// 但有些方法是HttpServletRequest独有的 例如getSession()// HttpServletRequest接口继承自ServletRequest接口 增加了和Http相关的方法// 但是我们可以强制转换HttpServletRequest request(HttpServletRequest)servletRequest;HttpServletResponse response(HttpServletResponse)servletResponse;// 若用户没有登录if (request.getSession().getAttribute(USERINFO)null request.getRequestURI().indexOf(/user/doLogin.do)-1){response.sendRedirect(request.getContextPath()/user/doLogin.do);}// 若用户已经登录 则继续下一个请求(继续访问)filterChain.doFilter(request,response);
}然后需去web.xml中配置过滤器
!-- 配置自定义的Filter 实现登录控制 --filterfilter-namesessionFilter/filter-namefilter-classnet.zjitc.filter.LoginFilter/filter-class/filterfilter-mappingfilter-namesessionFilter/filter-name!-- 拦截所有的页面 /斜杠代表在webapp目录下 --url-pattern/pages/*/url-patternurl-pattern/css/*/url-patternurl-pattern/img/*/url-patternurl-pattern/failer.jsp/url-pattern/filter-mapping
三、总结
拦截器和过滤器其实都是AOP编程思想的实现
都可以体现例如权限的检查 日志的记录等功能
但是有不同之处
使用范围不同
拦截器既可以用在web层 又可以用在Application和Swing程序中而filter是Servlet规范规定的 只能用于web程序中
规范不同
拦截器是在Spring容器内的 是Spring框架支持的而filter是Servlet规范规定的 是Servlet容器支持的 1、什么是Filter及其作用介绍
1概念 Servlet规范中三个技术 Servlet Listener Filter顺序为L F S Filter是sun公司中servlet2.3后增加的一个新功能在javaEE中定义了一个接口 javax.servlet.Filter来描述过滤器 2作用 通过Filter可以拦截访问web资源的请求与响应操作。 WEB开发人员通过Filter技术对web服务器管理的所有web资源例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。 3举例 在java web中针对传入的request,或response提前过滤掉一些信息或者提前设置一些参数然后再传入servlet进行业务逻辑比如过滤掉非法url不是login.do的地址请求如果用户没有登陆都过滤掉或者在传入servlet或者 struts的action前统一设置字符集或者去除掉一些非法字符。
2、Filter API介绍
Filter是javax.servlet包下的一个接口主要有以下三个方法
destory()
doFilter(ServletRequest request,ServletResponse response,FilterCjain chain)
init(FilterConfig filterConfig)3、Filter链与Filter生命周期
1Filter链介绍 多个Filter对同一个资源进行了拦截那么当我们在开始的Filter中执行chain.doFilter(request,response)时是访问下一下Filter,直到最后一个Filter执行时它后面没有了Filter,才会访问web资源。 2关于多个FIlter的访问顺序问题 如果有多个Filter形成了Filter链那么它们的执行顺序是怎样确定的 它们的执行顺序取决于在web.xml文件中配置的先后顺序。 3Filter生命周期
当服务器启动会创建Filter对象并调用init方法只调用一次.当访问资源路径与Filter的拦截路径匹配会执行Filter中的doFilter方法这个方法是真正拦截操作的方法.当服务器关闭时会调用Filter的destroy方法来进行销毁操作过滤器是JavaEE标准采用函数回调的方式进行。是在请求进入容器之后还未进入Servlet之前进行预处理并且在请求结束返回给前端这之间进行后期处理。
四、拦截器
拦截器是spring容器的是spring支持的
java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码也可以在一个action执行前阻止其执行同时也提供了一种可以提取action中可重用部分的方式。
在面向切面编程AOPAspect-Oriented Programming中拦截器用于在某个方法或字段被访问之前进行拦截然后在之前或之后加入某些操作。
比如动态代理就是拦截器的简单实现在你调用方法前打印出字符串或者做其它业务逻辑的操作也可以在你调用方法后打印出字符串甚至在你抛出异常的时候做业务逻辑的操作。
五、过滤器和拦截器的区别
①拦截器是基于java的反射机制的而过滤器是基于函数回调。②拦截器不依赖与servlet容器过滤器依赖与servlet容器。③拦截器只能对action请求起作用而过滤器则可以对几乎所有的请求起作用。④拦截器可以访问action上下文、值栈里的对象而过滤器不能访问。⑤在action的生命周期中拦截器可以多次被调用而过滤器只能在容器初始化时被调用一次。⑥拦截器可以获取IOC容器中的各个bean而过滤器就不行这点很重要在拦截器里注入一个service可以调用业务逻辑。拦截器可以获取ioc中的service bean实现业务逻辑。
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针地址作为参数传递给另一个函数当这个指针被用来调用其所指向的函数时我们就说这是回调函数。回调函数不是由该函数的实现方直接调用而是在特定的事件或条件发生时由另外的一方调用的用于对该事件或条件进行响应。
Spring MVC中每个控制器中可以定义多个请求处理方法,我们把这种请求处理方法简称为Action
过滤器Filter监听器Listener拦截器Intercepter关注的点web请求系统级别参数、对象Action部分web请求如何实现的函数回调事件Java反射机制动态代理应用场景设置字符编码统计网站在线人数拦截未登录用户URL级别的权限访问控制清除过期session审计日志过滤敏感词汇压缩响应信息是否依赖servlet容器依赖不依赖Servlet提供的支持filter接口ServletContextListener抽象接口HttpSessionListener抽象接口Spring提供的支持HandlerInterceptorAdapter类HandlerInterceptor接口级别系统级系统级非系统级