这是和登录有关的拦截器

创建拦截器的实现类
重写它的3个方法

@Component
public class TestInterceptor implements HandlerInterceptor {

第一个方法:
请求在进入Handler之前, 该方法会被调用.
如果返回true, 则表示该请求会继续往下执行, 也就是才会执行到Handler
如果返回false, 就不会执行到Handler了. 并且, 另外两个方法也都不会执行
最常用的方法

 @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 因为我们使用的是注解形式的处理器(RequestMapping)
        // 所以handler对象的真正类型是 HandlerMethod
        HandlerMethod hm = (HandlerMethod) handler;
        // 获取到该方法的注解对象
     //  hm.getMethodAnnotation()

        HttpSession session = request.getSession();
        Object user = session.getAttribute("username");

        if (user != null) {
            return true;
        }
        //重定向到登录
        response.sendRedirect("/login");
        return false;

    }

第二个方法
Handler中的方法执行完毕之后, 向客户端返回视图之前执行
方法参数中的ModelAndView对象就是给客户端渲染所用的对象


    @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 {

    }
}

在xml中配置拦截器


<mvc:interceptors>

        <mvc:interceptor>
            <!--配置哪些地址需要走拦截器, 这个配置可以同时写多个-->
            <mvc:mapping path="/**"/>
            <!--排除哪些地址-->
            <mvc:exclude-mapping path="/category/view"/>
            <mvc:exclude-mapping path="/alogin"/>
            <mvc:exclude-mapping path="/login"/>
            <mvc:exclude-mapping path="/book/create"/>
            <mvc:exclude-mapping path="/book/delete"/>
            <mvc:exclude-mapping path="/book/update"/>
            <mvc:exclude-mapping path="/book/query"/>

</mvc:interceptors>

获取前端参数

package com.lanou.demo.controller;

import com.lanou.demo.annotation.CheckPermission;
import com.lanou.demo.interceptor.PermissionInterceptor;
import com.lanou.demo.service.VerifyCodeUtils;
import com.lanou.demo.service.VerifyCodeView;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.Arrays;
import java.util.Map;

@Controller
public class VerificationCodeController {
    

    
    @RequestMapping("/category/view")
    public ModelAndView view(HttpSession session){
        //创建ModelAndView 对象
        ModelAndView mv = new ModelAndView();
        //取出验证码
        String code = VerifyCodeUtils.generateVerifyCode(4);
        //添加到ModelAndView
        session.setAttribute("code",code);
         mv.addObject("code",code);
         //添加视图
        mv.setView(new VerifyCodeView());
        return  mv;

    }


    
    @RequestMapping("/alogin")
    public String doLogin(String username,
                          String password,
                          String code,
                          HttpSession session){


        String sessionCode = (String) session.getAttribute("code");
        if ("admin".equals(username) && "admin".equals(password)){
            if (sessionCode.equalsIgnoreCase(code)){
                // 验证过一次之后, 移除到验证码
                session.removeAttribute("code");
                //把用户名添加到session
                session.setAttribute("username", username);
                //获取许可证
                String[] permissions = {"book/query","alogin","book/create"};
                //把许可证添加到session
                session.setAttribute("permissions", Arrays.asList(permissions));
                // 重定向到/home页面
                return "/home";
        }
        }
        //如果不符合if判断就重定向到error页面
         return "/error";


    }

    @CheckPermission("book/query")
    @RequestMapping("/book/query")
    public String select(){

        return "/succeed";
    }



}

要是登陆的话有些需要获取权限
配合拦截器去做一个权限设置

package com.lanou.demo.interceptor;

import com.lanou.demo.annotation.CheckPermission;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;

@Component
public class PermissionInterceptor implements HandlerInterceptor {

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


        // 1. 从session中取出用户所拥有的权限
        HttpSession session = request.getSession();
        List<String> permissions = (List<String>) session.getAttribute("permissions");
        // 2. 获取到当前的请求所对应的Handler上的CheckPermission注解中的value的值
        HandlerMethod hm = (HandlerMethod) handler;
        // 判断当前的Handler方法上是否有这个注解
        if (hm.hasMethodAnnotation(CheckPermission.class)) {
            // 获取到注解对象
            CheckPermission annotation = hm.getMethodAnnotation(CheckPermission.class);
            // 获取到value的值
            String value = annotation.value();
            // 判断value是否在用户权限的集合中
            if (permissions.contains(value)) {


                return true;
            }
        }

        response.sendRedirect("/login");

        return false;
    }
}


在自定义一个注解,用来判断什么时候来使用

package com.lanou.demo.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/*
 * 注解上面需要配置这个注解可以用到哪里:
 * 例如: 是给类用的,还是给属性用的,还是给方法用的等等
 */
@Target(ElementType.METHOD)
/*
这个注解是在什么时候生效的.
是在运行时生效
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckPermission {

    String value();

}

再在xml中配置权限的拦截器


    <mvc:interceptors>

        <!--登录使用的拦截器-->

        <mvc:interceptor>
            <!--配置哪些地址需要走拦截器, 这个配置可以同时写多个-->
            <mvc:mapping path="/**"/>
            <!--排除哪些地址-->
            <mvc:exclude-mapping path="/category/view"/>
            <mvc:exclude-mapping path="/alogin"/>
            <mvc:exclude-mapping path="/login"/>

            <!--配置上面的地址映射会走哪个拦截器-->
            <ref bean="testInterceptor"/>
        </mvc:interceptor>


        <!--权限使用的拦截器-->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/login"/>
            <mvc:exclude-mapping path="/alogin"/>
            <mvc:exclude-mapping path="/category/view"/>

            <ref bean="permissionInterceptor"/>
        </mvc:interceptor>

    </mvc:interceptors>

注意拦截器一定要使用的恰当

posted on 2019-05-25 15:57  脑抽不要停  阅读(160)  评论(0编辑  收藏  举报