下面介绍过滤器和拦截器以及监听器的使用方法:
执行顺序 :监听器 > 过滤器 > 拦截器java
主要的用途是过滤字符编码、或者去除掉一些非法字符
过滤器须要写两部分,一是java类,二是web.xml配置web
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方法内手动加载配置文件的方法去调用。spring
<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>
解释:spring-mvc
<filter-name>随便取 <filter-class>过滤器的路径 <url-pattern>>过滤的路径
1.判断是不是Ajax请求安全
String isAjax = request.getHeader("x-requested-with");
2.另一般出来编码问题的时候会直接在web.xml中加上这段:这个不须要再写java代码,由于它指向的代码是org.springframework.web.filter.CharacterEncodingFilter已经存在的。直接复制可用,无需改动。session
<!-- 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类mvc
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 { }
<?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>表示不拦截的路径。app
若是你发现<mvc:exclude-mapping>彷佛不起做用,仍是被拦截,而且页面出现了以下的错误jsp
Resource interpreted as Stylesheet but transferred with MIME type text/plain Uncaught ReferenceError: $ is not defined
那么请你把静态文件加入免拦截<mvc:exclude-mapping>的队伍中,如今看起来很合理,可是查bug的时候,,哎,鬼知道我经历的什么。ide
用于监听一些重要事件的发生,监听器对象能够在事情发生前、发生后能够作一些必要的处理,
系统启动时加载初始化信息
监听器的功能是在项目启动和销毁时候搞事情:
和上面同样两部分:
实现ServletContextListener接口便可 public class initListener implements ServletContextListener{ @Override public void contextInitialized(ServletContextEvent servletContextEvent) { } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } }
<!-- 初始化监听器--> <listener> <listener-class>org.yaoyan.util.initListener</listener-class> </listener>
<listener-class>是将要写的监听器类的路径