在基于SSM框架的项目实战中,不管是写一个什么项目,前后台的分离是必不可少的。自JavaWeb中的过滤器,到Spring MVC中新增了拦截器,目的也是为了分离前后台。
过滤器(FIlter):过滤器实际上是对一些web资源进行拦截 ,做一些处理后再交给下一个Servlet或者过滤器处理,它通常是用来拦截request进行处理的,也可以对返回的response进行拦截处理。
拦截器(Intercepter):拦截器主要是用于拦截用户请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等等。
过滤器(FIlter):过滤器是实现了javax.servlet下的Filter接口,重写Filter中的三个方法:初始化init,过滤doFIlter,销毁destroy,其中doFilter()方法是去实现过滤相关内容的方法。
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class ManagerFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化过滤器");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req= (HttpServletRequest) request;
HttpServletResponse resp= (HttpServletResponse) response;
HttpSession session = req.getSession();
Integer status = (Integer) session.getAttribute("status");
System.out.println(status);
if (session.getAttribute("status") == null || (Integer) session.getAttribute("status") != 3) {
req.setAttribute("meg", "你没有权限访问后台!");
System.out.println("过滤器拦截--------");
resp.sendRedirect("/MusicWebSite/index.html");
} else {
System.out.println("过滤器放行------------------------");
chain.doFilter(req,resp);
}
}
@Override
public void destroy() {
System.out.println("过滤器销毁");
}
}
当然,过滤器的配置配置也是必不可少的,而过滤器主要是过滤页面的,就需要在web.xml中进行相关配置。
ManagerFilter
project.filter.ManagerFilter
ManagerFilter
/html/manager.html
拦截器(Intercepter):而定义一个拦截器,一般可以通过实现HandlerInterceptor接口或者继承HandlerInterceptor接口的实现类定义,还有一种已经过时的方法是通过WebRequestInterceptor接口或者继承WebRequestInterceptor接口的实现类定义,拦截器中的三个方法:
preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法
postHandle:控制器方法执行之后执行postHandle()
afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class ManagerInterceptor extends HttpServlet implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Integer status = (Integer) session.getAttribute("status");
if (session.getAttribute("status") == null || (Integer) session.getAttribute("status") != 3) {
request.setAttribute("meg", "你没有权限访问后台!");
System.out.println("拦截器拦截--------");
response.sendRedirect("/index.html");
return false;
} else {
System.out.println("拦截器放行------------------------");
return true;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
其中mvc:mapping是你需要拦截的controller的url,如果你不需要排除一些特定的url,就需要使用mvc:exclude-mapping属性。