拦截器的基本工作原理:对请求的东西做过滤;
过滤器跟拦截器很相似;
比如(过滤器案例):
[ 以上登录名是中文,则在控制中心接收过来的登录名参数值是乱码,解决办法就是拦截器]
springmvc提供的org.springframework.web.filter.CharacterEncoding.class,把它配置在web.xml里;
[<init-param>对过滤器encoding做一个初始化操作“*”所有请求都在这过滤]
1:拦截器的实现(编写拦截器的类),让此类去实现HandlerInterceptor接口并重写里面的虚方法(3个)
2:注册拦截器(写了拦截器类,不配到springmvc的配置文件里,就不起作用)
他的配置文件(spring-mvc.xml这个名字不固定,可改)名字一般是在web.xml里能找到
在里面加上
<!--多个拦截器-->
<mvc:interceptors>
<bean>拦截器实现类的全类名(带包的)</bean>
</mvc:interceptors>
注意一定得倒命名空间:xmlns:mvc="http://www.springframework.org/schema/mvc"
还有相关的mvc的包后面的xsd一定得注意;
【那这个所有的请求都会经过这个拦截器(也就是正确情况下,所有值都可传进来),但是我们要设规则,对部分请求做拦截】
3:配置拦截器的拦截规则
用<mvc:interceptor>
<mvc:mapping path=" /view"/>
<bean>拦截器实现类的全类名(带包的)</bean>
</mvc:interceptor>
<!--给访问的所有/view路径下的方法全部拦截具体拦截做什么在拦截类里边-->
拦截器里的三个重写方法:
postHandle(HttpservletRequest arg0,HttpServletResponse arg1,Object arg2,ModelAndView arg3);
这个方法一般对cotroller里返回的视图结果做修改
[以上.addObject()是对返回内容做了修改;.setViewName()是对返回的视图页面做修改,把原本返回到1页面的东西返回给了2页面]
afterCompletion 只是一般对请求后的资源,流,等做销毁等作用方法;
preHandle方法
请求被终止就访问不到;
举例,一个车去北京经过两个收费站,回来时先经过2在经过1;回来时发票应该先是2寄回来再是1;
拦截器的实现还有下面这种方法:
implements WebRequestInterceptor
但是preHandle不是boole类型,阻止不了请求,所以一般不用,其他配置,使用原理同上
1:场景代码,先在配置文件中(解决乱码这里是拦截器跟之前过滤器一个功能)
拦截器类里代码
2:解决权限(比如只有登录成功的人才能访问其他的事)
[假如所有登录信息存在session会话里,判断回话里有这个登录人没,没有则请求转发到登录页面,并把请求跟响应的参数传过去,且终止请求]
[拦截器就可以过滤资源等]
过滤器是java技术依赖于tomcat的;拦截器框架自带的框架接口