SpringMVC——拦截器,过滤器实现登录拦截
一、拦截器与过滤器的区别
1、过滤器
依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。
2、拦截器
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是能对controller请求进行拦截,可以拦截静态资源,但是拦截不了jsp页面
二、登陆拦截的实现思路
思路:即将请求的url地址进行解析,除了登录外的请求都要进行拦截或者过滤,这些请求在通过登录的判断,来决定最后的结果
2.1拦截器实现登陆拦截
2.1.1创建拦截器
public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("进行拦截"); //获取请求的RUi:去除http:localhost:8080这部分剩下的 String uri = request.getRequestURI(); System.out.println(uri); //UTL:除了login.jsp是可以公开访问的,其他的URL都进行拦截控制 if (uri.indexOf("/login") >= 0) { System.out.println("这是登录页面"); return true; } //获取session HttpSession session = request.getSession(); Users user = (Users) session.getAttribute("user"); //判断session中是否有用户数据,如果有,则返回true,继续向下执行 if (user != null) { System.out.println("有数据"); return true; } //不符合条件的给出提示信息,并转发到登录页面 response.sendRedirect("login.jsp"); System.out.println("非法"); return false; } @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 { } }
2.1.2 配置拦截器
<!--拦截器映射--> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.invoicing.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
2.1.3 注意:
因为拦截器无法拦截jsp页面,所以,直接登录jsp页面无法拦截。
将所有的jsp文件放入到WEB-INF文件夹下,这样用户是直接不能访问WEB-INF文件下的jsp文件的。spring mvc的理念也是通过controller里的@RequestMapping来请求相关jsp页面,而非用户直接访问jsp页面。
2.2 过滤器实现
2.2.1导入依赖:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
2.2.2编写过滤器:
@WebServlet(urlPatterns = {"/*"}) public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest; System.out.println("123"); //放行URL if (httpServletRequest.getRequestURI().indexOf("/login") >= 0) { filterChain.doFilter(servletRequest,servletResponse); } Object user = httpServletRequest.getSession().getAttribute("user"); if (user==null){ httpServletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse); }else { //放行请求 filterChain.doFilter(servletRequest,servletResponse); } } @Override public void destroy() { } }