下面介绍过滤器和拦截器以及监听器的使用方法:
执行顺序 :监听器 > 过滤器 > 拦截器
一.过滤器
主要的用途是过滤字符编码、或者去除掉一些非法字符
过滤器需要写两部分,一是java类,二是web.xml配置
1.java代码,写个类实现Filter接口(implements Filter)
public class MangerFilter implements Filter {
public static UserDaoI userDaoI;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
ApplicationContext content =
new ClassPathXmlApplicationContext("classpath:META-INF/applicationContext.xml");
userDaoI = content.getBean(UserDaoI.class);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest Request = (HttpServletRequest)servletRequest;
HttpServletResponse Response = (HttpServletResponse) servletResponse;
HttpSession session = Request.getSession();
String path = Request.getRequestURI();
String userName = (String)session.getAttribute("userName");
User user = userDaoI.getUserByName(userName);
session.setAttribute("managerPage",path);
if(path.indexOf("index")==-1 && path.indexOf("resources")==-1)
.........
}else{
filterChain.doFilter(servletRequest,servletResponse);
}
}
@Override
public void destroy() {
}
}
这里需要注意的是在spring中,实现Filter接口的类中不能使用@Autowired注入,需要使用init方法内手动加载配置文件的方法去调用。
2.在web.xml如下
<filter>
<filter-name>login</filter-name>
<filter-class>org.mshu.util.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>login</filter-name>
<url-pattern>/login/*</url-pattern>
</filter-mapping>
解释:
<filter-name>随便取
<filter-class>过滤器的路径
<url-pattern>>过滤的路径
小菜:
1.判断是否是Ajax请求
String isAjax = request.getHeader("x-requested-with");
2.另外一般出来编码问题的时候会直接在web.xml中加上这段:这个不需要再写java代码,因为它指向的代码是org.springframework.web.filter.CharacterEncodingFilter已经存在的。直接复制可用,无需改动。
<!-- Spring字符集过滤器 -->
<filter>
<filter-name>SpringEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SpringEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
二.拦截器
类似面向切片的技术,拦截器要做的工作更多是安全方面,比如用户验证,判断是否登陆
日志记录,或者限制时间点访问。
拦截器也是要写两部分,一部分是spring-mvc.xml,另一部分是java类
1.java代码部分,需要一个继承了HandlerInterceptorAdapter抽象类的方法
public class LoginIntercepter extends HandlerInterceptorAdapter{
/**
* 在业务处理器处理请求之前被调用
* 如果返回false
* 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
* 如果返回true
* 执行下一个拦截器,直到所有的拦截器都执行完毕
* 再执行被拦截的Controller
* 然后进入拦截器链,
* 从最后一个拦截器往回执行所有的postHandle()
* 接着再从最后一个拦截器往回执行所有的afterCompletion()
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String username = (String)request.getSession().getAttribute("adminName");
if(username == null){
// request.getRequestDispatcher("/WEB-INF/content/login/index.jsp").forward(request, response);
System.out.println("拦截来了");
return false;
}else{
return true;
}
}
/**
* 在业务处理器处理请求执行完成后,生成视图之前执行的动作
* 可在modelAndView中加入数据,比如当前时间
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
/**
* 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
*
* 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
2.spring-mvc.xml部分
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--配置拦截器, 多个拦截器,顺序执行 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/login/**" />
<mvc:exclude-mapping path="/resources/**" />
<bean class="interceptor.LoginIntercepter"></bean>
</mvc:interceptor>
<!-- 当设置多个拦截器时,先按顺序调用preHandle方法,
然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>
<mvc:mapping>表示拦截的路径 /**为全路径
<mvc:exclude-mapping>表示不拦截的路径。
小菜:
如果你发现<mvc:exclude-mapping>似乎不起作用,还是被拦截,并且页面出现了如下的错误
Resource interpreted as Stylesheet but transferred with MIME type text/plain
Uncaught ReferenceError: $ is not defined
那么请你把静态文件加入免拦截<mvc:exclude-mapping>的队伍中,现在看起来很合理,但是查bug的时候,,哎,鬼知道我经历的什么。
三.监听器
用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理,
系统启动时加载初始化信息
监听器的功能是在项目启动和销毁时候搞事情:
和上面一样两部分:
1.监听器类
实现ServletContextListener接口即可
public class initListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
2.编写web.xml文件
<!-- 初始化监听器-->
<listener>
<listener-class>org.yaoyan.util.initListener</listener-class>
</listener>
<listener-class>是将要写的监听器类的路径
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。