Web过滤器、拦截器
过滤器
什么是过滤器:
Servlet规范当中定义的一种特殊的组件,用来拦截Servlet容器的调用过程。
什么时候触发:
客户发送一个请求,先经过过滤器,在执行servlet。响应的数据也要经过过滤器,再到界面。
使用场景:
1. 对用户请求进行统一认证。
2. 对用户的访问请求进行记录和审核。
3. 对用户发送的数据进行过滤或替换。
4. 对响应的内容进行压缩,减少传输量。
5. 对请求或响应进行加解密处理。
小案例:
当用户发送一个请求到服务器,先过滤,从Session中获取用户信息,从而判断出给用户是否登录。代码如下:
public class TestFilter implements Filter {
/**
* Default constructor.
*/
public TestFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpSession session = httpServletRequest.getSession();
String name = (String) session.getAttribute("name");
String password = (String) session.getAttribute("password");
if(name == null && password == null){
request.getRequestDispatcher("/login.jsp").forward(request, response);
}else{
chain.doFilter(request, response);
}
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
web.xml配置文件:
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>com.servlet.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
拦截器
什么是拦截器:
拦截器属于Spring框架里面的,拦截的是DispatcherServlet调用的过程。
什么时候触发:
DispatcherServlet收到请求后,如果有拦截器,则先执行拦截器方法,在执行处理器Controller的方法。小案例:
要实现HandlerInterceptor。代码如下:
public class SessionInterceptor implements HandlerInterceptor{
private double time;
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
time = System.currentTimeMillis();
HttpSession session = request.getSession();
Object obj = session.getAttribute("user");
if(obj == null){
//没有登录,重定向到登录界面
System.out.println("没有登录,重定向到登录界面");
response.sendRedirect("toLogin.do");
return false;
}
//登录过了,则继续向后执行
System.out.println("登录过了,则继续向后执行");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
double times = System.currentTimeMillis();
System.out.println(times-time);
}
}
要在spring配置文件中配置拦截器:
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/toLogin.do"/>
<mvc:exclude-mapping path="/login.do"/>
<mvc:exclude-mapping path="/checkcode.do"/>
<bean class="cn.tedu.ems.interceptors.SessionInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>