ssm框架之写一个springmvc拦截器

Springmvc拦截器用来拦截Controller层请求,可以在Controller方法执行前后做一些特定的业务逻辑处理。类似于AOP中的环绕通知。常用来做登录拦截,权限控制等。

1)写一个类,实现HandlerIntercept接口;

/**
 * 登录拦截器
 */
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 在控制层方法请求之前调用,返回一个boolean类型值
     * 如果返回的true则放行,如果返回false,则不继续往后执行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String requestURI = request.getRequestURI();
        System.out.println("拦截到请求:"+requestURI);
        Admin admin = (Admin) request.getSession().getAttribute("admin");
        //如果admin为空,说明没有登录
        if (admin==null){
            response.sendRedirect(request.getContextPath()+"/login.jsp");
            return false;//不继续往后执行
        }
        return true;
    }

    /**
     * 在控制层方法执行返回之后执行,通常可以做一些全局的数据返回等
     * @param request
     * @param response
     * @param handler
     * @param modelAndView 控制层方法返回的结果
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("进入拦截器postHandle方法");
        //ajax请求时,modelView为null
        if (modelAndView!=null){
        System.out.println("获取到控制层方法返回结果:"+modelAndView.getModelMap()
                        +"view:"+modelAndView.getViewName());
        }
    }

    /**
     * 视图解析之后执行,通常用来做一些清理工作
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("进入afterCompletion方法");
    }
}

2)在springmvc的配置文件中配置拦截器(拦截的请求地址,放行的请求地址);

<!--    配置springmvc拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--            定义需要拦截的请求;/**:表示以/开头的任意控制层请求;   /*:只能拦截一个/的请求-->
            <mvc:mapping path="/**"/>
            <!--            定义不拦截的请求-->
            <mvc:exclude-mapping path="/admin/login"/>
            <!--            配置拦截类-->
            <bean id="loginInterceptor" class="aop.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

3)在控制层方法中写登录条件;

 //在方法参数中定义HttpSession,HttpServletRequest,HttpServletResponse等对象,springmvc会自动注入该对象
    @RequestMapping("/login")
    public String login(String account, String password, HttpSession session){
        //根据用户名查询是否存在该用户
        Admin admin = adminService.selectByAccount(account);
        if (admin!=null && admin.getPassword().equals(password)){
            //将用户信息放入session
            session.setAttribute("admin",admin);
            return "redirect:list";
        }
        return "/login.jsp";//以/开头为绝对路径,/对应webapp目录
    }
原文地址:https://www.cnblogs.com/xie-qi/p/13090628.html