拦截器

作者: 神豪VS勇士赢 | 来源:发表于2018-08-11 16:36 被阅读4次

公共能力。所有的action都希望执行。
例子:登录拦截器
如果没有登录,所有的除了登录之外的Action应该都不能访问。

拦截器需要实现HandlerInterceptor接口
preHandle:Handler方法之前执行
postHandle进入Handler方法之后,返回modelAndView之前执行
afterCompletion执行Handler完成执行此方法

开发流程:
第一步:开发登录拦截器 拦截器一般 都覆写preHandle 方法 其他方法看根据具体需求

public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    String requestURI = request.getRequestURI();
    /**
     * 当请求路径Controller 包含了 login 就直接放行
     */
    if(requestURI.indexOf("login")>0){
        return  true;
    }
    /**
     * 当请求包含base 的 Controller 直接放行 类似于游客可以直接访问的资源
     */
    if(requestURI.indexOf("base")>0){
        return  true;
    }
    //从session 里面获取信息 看看是否之前登陆过
    Object user = request.getSession().getAttribute("user");
    //如果登陆过  则放行
    if(user!=null){
        return  true;
    }
    //如果没有登录  不放心  重定向或者转发到 登录页
    response.sendRedirect("/login.jsp");
   // request.getRequestDispatcher("/login.jsp").forward(request,response);

    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 {

}

}

第二步:开发登录Action

@Controller
public class LoginController {
@RequestMapping("/login.do")
public String doLogin(User user,HttpServletRequest request){
if(user!=null){

        if("张颖豪".equals(user.getUsername())&&"123".equals(user.getPassword())){
            request.getSession().setAttribute("user" , user);
        }
    }
    return  "index";
}
@RequestMapping("/base.do")
@ResponseBody
public List<String>   basePage(){
    ArrayList<String> arrayList = new ArrayList<>();
    arrayList.add("这是一个访客可以访问的界面");
    arrayList.add("这是一个访客可以访问的界面a");
    arrayList.add("这是一个访客可以访问的界面b");
    arrayList.add("这是一个访客可以访问的界面c");
    return arrayList;

}

}

第三步:配置拦截器
/** 表示所有Controller之前都执行
拦截系统中已经存在的请求。

<!-- 配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/><!-- 系统的所有请求 -->
        <bean class="com.zyh.interceptor.LoginInterceptor"></bean><!-- 登录拦截器 -->
    </mvc:interceptor>
</mvc:interceptors>

第四步: 测试

当我们直接访问游客可以访问的路径的时候: 直接放行,允许访问


image.png

我们并没有对下面的路径设置放行操作,所以当我们访问此访问路径的时候 会走拦截器
http://localhost:8080/pay/pay.do
在浏览器 输入http://localhost:8080/pay/pay.do 之后发现 重定向到了 登录页

image.png
当我们登录成功之后 再次访问 http://localhost:8080/pay/pay.do
image.png

做登录拦截器的优势:不需要在每个action中做登录判断。只需要做一个拦截器,所有的action在具体执行之前都调用拦截器。管理系统适用。

相关文章

网友评论

      本文标题:拦截器

      本文链接:https://www.haomeiwen.com/subject/pdpdbftx.html