zoukankan      html  css  js  c++  java
  • 8.SpringMVC拦截器

    转载:https://blog.kuangstudy.com/index.php/archives/484/

    一.SpringMVC拦截器

    1.介绍

    (1)SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。

    (2)过滤器与拦截器的区别:拦截器是AOP思想的具体应用。

    过滤器

    • servlet规范中的一部分,任何java web工程都可以使用

    • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

    拦截器

    • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用

    • 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的

    2.自定义拦截器

    (1)步骤:

    1. 建立一个普通maven项目springmvc-08-interceptor,添加web架构,导入jar包(略)

    2. 配置web.xml和springmvc-servlet.xml(略)

    3. 自定义拦截器MyInterceptor.java

    4. 配置springmvc-servlet.xml

    5. 编写控制器

    6. 配置Tomcat并测试

    自定义拦截器MyInterceptor.java

    注:一般拦截器都只重写preHandle用于在控制器之前处理

    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MyInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("------------处理前------------");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("------------处理后------------");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("------------清理------------");
        }
    }

    配置springmvc-servlet.xml

    <!--关于拦截器的配置-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--/**: 包括路径及其子路径-->
            <!--/admin/*: 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
            <!--/admin/**: 拦截的是/admin/下的所有-->
            <mvc:mapping path="/**"/>
            <!--bean配置的就是拦截器-->
            <bean class="ustc.wzh.config.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

    编写控制器

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class TestController {
    
        @GetMapping("/test1")
        public String test1(){
    
            System.out.println("控制器中的方法执行了");
            return "hello";
        }
    }

    测试:

    3.拦截器案例

    (1)目的:只有登录用户才能进入主页main.jsp

    (2)步骤:

    1. 添加index.jsp放置登录页login.jsp和主页main.jsp链接

    2. 添加login.jsp和主页main.jsp

    3. 添加控制器

    4. 添加拦截器并配置springmvc-servlet.xml

    5. 测试

    添加index.jsp放置登录页login.jsp和主页main.jsp链接

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>index</title>
      </head>
      <body>
    
      <h1><a href="${pageContext.request.contextPath}/user/jumpLogin">登录页面</a> </h1>
    
      <h1><a href="${pageContext.request.contextPath}/user/main">首页</a> </h1>
      </body>
    </html>

    添加login.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>login</title>
    </head>
    
    <%--在WEB-INF下的所有资源,只能通过Controller,或Servlet进行访问--%>
    <h1>登录页面</h1>
    <hr>
    
    <body>
    <form action="${pageContext.request.contextPath}/user/login" method="post">
        用户名:<input type="text" name="username"> <br>
        密码: <input type="password" name="pwd"> <br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>

    添加main.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>main</title>
    </head>
    <body>
    <h1>首页</h1>
    
    ${username}
    <a href="${pageContext.request.contextPath}/user/logout">注销</a>
    
    </body>
    </html>

    添加控制器

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpSession;
    
    @Controller
    @RequestMapping("/user")
    public class LoginController {
    
        //登陆提交
        @PostMapping("/login")
        public String login(HttpSession session, String username, String pwd) {
            // 向session记录用户身份信息
            System.out.println("接收前端===" + username);
            if (username.equals("user1") && pwd.equals("123456")) {
                session.setAttribute("username", username);
                session.setAttribute("password", pwd);
                return "main";
            } else {
                session.setAttribute("username", null);
                session.setAttribute("password", null);
                return "login";
            }
    
        }
    
        //跳转到登陆页面
        @RequestMapping("/jumpLogin")
        public String jumpLogin() {
            return "login";
        }
    
        //跳转到成功页面
        @RequestMapping("/main")
        public String main() {
            return "main";
        }
    
        //退出登陆
        @RequestMapping("logout")
        public String logout(HttpSession session) {
            // session 过期
            session.invalidate();
            return "login";
        }
    }

    添加拦截器

    import org.springframework.web.servlet.HandlerInterceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class LoginInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // 如果是登陆页面则放行
            System.out.println("uri: " + request.getRequestURI());
            if (request.getRequestURI().contains("login") || request.getRequestURI().contains("jumpLogin")) {
                return true;
            }
    
            HttpSession session = request.getSession();
    
    
            // 如果用户已登陆也放行
            if (session.getAttribute("username") != null) {
                return true;
            }
    
            // 用户没有登陆跳转到登陆页面
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
            return false;
        }
    }

    配置springmvc-servlet.xml

    <mvc:interceptor>
        <!--/**: 包括路径及其子路径-->
        <!--/admin/*: 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
        <!--/admin/**: 拦截的是/admin/下的所有-->
        <mvc:mapping path="/user/**"/>
        <!--bean配置的就是拦截器-->
        <bean class="ustc.wzh.config.LoginInterceptor"/>
    </mvc:interceptor>

    测试正确

  • 相关阅读:
    mysql索引创建和使用细节(二)
    mysql索引创建和使用细节(一)
    PHP7.2.6安装sodium扩展
    passwd修改密码失败,报鉴定令牌操作错误
    centos6升级python版本至python3.5
    centos6升级gcc版本
    elasticsearch中文手册
    MySQL主从仅同步指定库
    适用于Centos6/7,vsftp自动安装脚本
    Redis内存模型
  • 原文地址:https://www.cnblogs.com/zhihaospace/p/12339993.html
Copyright © 2011-2022 走看看