zoukankan      html  css  js  c++  java
  • Springmvc拦截器

    拦截器可以在控制层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>
  • 相关阅读:
    OAuth 2 深入介绍
    浅谈 EF CORE 迁移和实例化的几种方式
    为什么我们不应该使用微信或者 QQ 作为团队协作的 IM 工具?
    三值 bool? 进行与或运算后的结果
    Slack 开发入门之 Incoming Webhooks:往 Slack 的 Channel 中发消息
    int? 竟然真的可以是 null!.NET/C# 确定可空值类型 Nullable 实例的真实类型
    .NET 中使用 Mutex 进行跨越进程边界的同步
    UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等)
    谨慎使用 FileInfo.Exists 实例方法,而是使用 File.Exists 静态方法替代
    只需 5 秒钟,你就能取到 WPF 程序的超高分辨率超高清截图
  • 原文地址:https://www.cnblogs.com/xie-qi/p/12977393.html
Copyright © 2011-2022 走看看