Springmvc拦截器

2021-01-06 12:30

阅读:539

YPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">

标签:跳转   action   传输数据   info   boolean   ISE   html   ping   gets   

拦截器可以在控制层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的配置文件中配置拦截器,并指定拦截的请求和放行的请求;


    

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)再写一个用户登录的页面和按钮;

"text/html;charset=UTF-8" language="java" isELIgnored="false" %>用户登录
"${pageContext.request.contextPath}/login"> 用户名:"text" name="name"/>
密码: "password" name="password"/>
"submit" value="登录"/>

 

Springmvc拦截器

标签:跳转   action   传输数据   info   boolean   ISE   html   ping   gets   

原文地址:https://www.cnblogs.com/xie-qi/p/12977393.html


评论


亲,登录后才可以留言!