JavaWeb框架-SpringMVC-5-拦截器

话说:

各位读者盆友,昨天我已经到家啦。今天来说SpringMVC的一个小知识点-拦截器

目录


1.拦截器作用
2.案例
3.总结


难度系数:★☆☆☆☆
建议用时:20min

1.拦截器作用

拦截器有什么用?
之前我们的Servlet中,有个过滤器,我们自己也写过一个字符编码的过滤器,其中有个doFilter方法,具有放行作用,如果没有调用,那么一直处于“拦截”状态。当时的流程是:写一个类实现Filter接口,在web.xml中配置Filter初始化编码,然后在doFilter()方法里面实现字符编码配置即可。这其实也只一种AOP思想的一个小体现。这样,所有的请求,我们都不用再考虑编码啦。框架中的拦截器作用也类似。

场景1:电商等网站,用户可以直接浏览,当用户要购买时候,需要判断用户是否登录,这个过程可以采用拦截器;

场景2:如果没有登录,用户直接访问后台系统,这个时候也要做个拦截,提示用户登陆后在操作。

类似情形应该很多,拦截器是AOP思想的一个体现,未改变我们之前的代码,还对整个流程做了控制,一个切面下去,做了我们想控制的事情。

2.案例
比如,用户想进入后台,懂点程序,直接访问我得mapper,配置拦截器后结果是这样的:

JavaWeb框架-SpringMVC-5-拦截器_第1张图片

这样避免用户直接进入后台。如何实现呢?非常简单,流程化的东西。
1)写一个类,实现HandlerInterceptor接口,在执行menuList方法之前拦截住,实现流程控制;
2)配置具体拦截哪个请求;
3)代码中具体实现拦截逻辑。

1)写一个,实现HandlerInterceptor接口,在执行menuList方法之前拦截住,实现流程控制;
一般是单独建一个包,下面放各种拦截器,每个拦截器按照拦截功能命名,方便查看。

JavaWeb框架-SpringMVC-5-拦截器_第2张图片

package com.hmc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.hmc.pojo.SysUser;

/**
*
*2018年2月10日
*User:Meice
*上午7:27:13
*/
public class MenuListInterceptor implements HandlerInterceptor {

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("menuList方法之后");

    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("menuList方法之中");

    }

    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object arg2) throws Exception {
        System.out.println("menuList方法之前");
        //判断sessin里面是否有用户,如果不存在,提示用户登陆后在访问
        SysUser sysUser =(SysUser)  req.getSession().getAttribute("sysUser");
        if(sysUser == null) {
            System.out.println("需登录后方能查看菜单列表");
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().write("");
            //req.getRequestDispatcher("login.jsp").forward(req, resp);
            return false;
        }else {
            return true;
        }

    }

}

以上已经实现了非常简单的一个业务逻辑。Session中用户不存在,直接提示用户登录。可以发现,淘宝、天猫如果要添加购物车,是直接拦截并提示登录;京东可以添加购物车,埋单时候在提示登录。个人觉得本质差不多,用户既然要购买,还不如登录后在添加到购物车。流程就是这样的,可以用拦截器实现。

2)配置具体拦截哪个请求

在SpringMVC.xml中配置拦截哪个请求,核心就是mvc:interceptor

 
      <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/menuList"/>
            <bean class="com.hmc.interceptor.MenuListInterceptor">bean>
        mvc:interceptor>
      mvc:interceptors> 

这里配置也很简单明确,有点类似MyBatis中配置连接数据库的结构。environments ⇒ environment 是吧!

可以配置拦截具体的请求,也可以用表达式配置拦截不同滴请求。

3)代码中具体实现拦截逻辑。

System.out.println("menuList方法之前");
        //判断sessin里面是否有用户,如果不存在,提示用户登陆后在访问
        SysUser sysUser =(SysUser)  req.getSession().getAttribute("sysUser");
        if(sysUser == null) {
            System.out.println("需登录后方能查看菜单列表");
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().write("");
            //req.getRequestDispatcher("login.jsp").forward(req, resp);
            return false;
        }else {
            return true;
        }

这里我们跳转界面用的是resp.getWriter().write(),在其中写了JS,这样跳转就需要用js的跳转方式:window.location.href=”;而不能在使用req.getRequestDispatcher().forward(req,resp),知道为什么么?

3.总结

面向切面编程,后期还会用专门的1篇博客来详细阐述。至今,我们接触的思想有:面向对象、面向接口、面向切面等等,这些思想才是非常有生命力的东西。

好了,下期再会!

你可能感兴趣的:(Java)