Springmvc拦截器

HappyHeng 2020-05-28

拦截器可以在控制层Controller方法前后执行对应的操作,以实现登录拦截,权限控制等功能。

1)编写拦截器,实现HandlerInterceptor接口;

//控制层拦截器实现
public class LoginInterceptor implements HandlerInterceptor{
    /**
     *请求到达控制层之前执行  返回true,则放行,返回false,则拦截
     *handler:请求的对象,如果是控制层请求,则为HandleMethod对象,可通过该对象获取控制层方法信息
     * **/
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入拦截器");
        //判定handler是否为控制层方法
        if (handler instanceof HandlerMethod){
            HandlerMethod handlerMethod= (HandlerMethod) handler;
            //获取方法名
            String name=handlerMethod.getMethod().getName();
            System.out.println("方法名:"+name);
            Class<?> beanType = handlerMethod.getBeanType();
            System.out.println("控制层类名:"+beanType.getName());
        }
        //去session中获取登录标识
        HttpSession session = request.getSession();
        User user= (User) session.getAttribute("user");
        if (user!=null){//用户已登录,放行
            return true;
        }
        //如果没有登录,则跳转到登录页面
        response.sendRedirect(request.getContextPath()+"/login.jsp");
        return false;
    }

    /**
     * 控制层方法调用之后,视图解析器解析之前执行
     * modelAndView:控制层方法返回的模型视图对象
     * **/
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("进入拦截器postHandle方法");
        if (modelAndView!=null){
            System.out.println("需要跳转的页面:"+modelAndView.getViewName());
            System.out.println("返回的Model数据:"+modelAndView.getModel());
            System.out.println("返回的ModelMap数据:"+modelAndView.getModelMap());
            modelAndView.addObject("postHandleInfo","postHandle中添加的值");
        }
    }
    /**
     * 在视图解析器之后执行,通常做一些清理工作
     * **/
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("进入afterCompletion方法");
    }
}

2)Springmvc的配置文件中配置拦截器,并指定拦截的请求和放行的请求;

<!--    配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
<!--            指定要拦截的请求  /* ==>/hello,/user
                                /** ==>/user/hello  :表示所有的请求-->
            <mvc:mapping path="/**"/>
<!--            不拦截的请求-->
            <mvc:exclude-mapping path="/login"/>
<!--            拦截器类-->
            <bean id="loginInterceptor" class="interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

3)写一个控制层文件来传输数据;

@Controller
public class IndexController {
    @RequestMapping("/login")
    public String login(String name, String password, HttpSession session){
        System.out.println("获取到前台数据:name="+name+",password="+password);
        //todo 查询数据库,验证是否存在用户数据
        User user=new User();
        user.setName("科比");
        if (user==null){//如果用户不存在,跳回登录页面
            return "login.jsp";
        }
        //登录成功,将用户信息放入session
        session.setAttribute("user",user);
        return "index.jsp";
    }
}

4)再写一个用户登录的页面和按钮;

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>用户登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login">
    用户名:<input type="text" name="name"/><br/>
    密码:  <input type="password" name="password"/><br/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>

相关推荐