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

    SpringMVC:拦截器

    概述

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

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

    过滤器

    • servlet规范中的一部分,任何java web工程都可以使用
    • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

    拦截器

    • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
    • 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的

    自定义拦截器

    那如何实现拦截器呢?

    想要自定义拦截器,必须实现 HandlerInterceptor 接口。

    1. 新建一个Moudule , springmvc-07-Interceptor , 添加web支持
    2. 配置web.xml 和 springmvc-servlet.xml 文件
    3. 编写一个拦截器

      package com.kuang.interceptor;
      
      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 {
      
          //在请求处理的方法之前执行
          //如果返回true执行下一个拦截器
          //如果返回false就不执行下一个拦截器
          public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
              System.out.println("------------处理前------------");
              return true;
          }
      
          //在请求处理方法执行之后执行
          public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
              System.out.println("------------处理后------------");
          }
      
          //在dispatcherServlet处理后执行,做清理工作.
          public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
              System.out.println("------------清理------------");
          }
      }
    4. 在springmvc的配置文件中配置拦截器

      <!--关于拦截器的配置-->
      <mvc:interceptors>
          <mvc:interceptor>
              <!--/** 包括路径及其子路径-->
              <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
              <!--/admin/** 拦截的是/admin/下的所有-->
              <mvc:mapping path="/**"/>
              <!--bean配置的就是拦截器-->
              <bean class="com.kuang.interceptor.MyInterceptor"/>
          </mvc:interceptor>
      </mvc:interceptors>
    5. 编写一个Controller,接收请求

      package com.kuang.controller;
      
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.ResponseBody;
      
      //测试拦截器的控制器
      @Controller
      public class InterceptorController {
      
          @RequestMapping("/interceptor")
          @ResponseBody
          public String testFunction() {
              System.out.println("控制器中的方法执行了");
              return "hello";
          }
      }
    6. 前端 index.jsp

      <a href="${pageContext.request.contextPath}/interceptor">拦截器测试</a>
    7. 启动tomcat 测试一下!
      1570205071233.png

    验证用户是否登录 (认证用户)

    实现思路

    1. 有一个登陆页面,需要写一个controller访问页面。
    2. 登陆页面有一提交表单的动作。需要在controller中处理。判断用户名密码是否正确。如果正确,向session中写入用户信息。返回登陆成功。
    3. 拦截用户请求,判断用户是否登陆。如果用户已经登陆。放行, 如果用户未登陆,跳转到登陆页面

    代码编写

    1. 编写一个登陆页面 login.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>Title</title>
      </head>
      
      <h1>登录页面</h1>
      <hr>
      
      <body>
      <form action="${pageContext.request.contextPath}/user/login">
          用户名:<input type="text" name="username"> <br>
          密码: <input type="password" name="pwd"> <br>
          <input type="submit" value="提交">
      </form>
      </body>
      </html>
    2. 编写一个Controller处理请求

      package com.kuang.controller;
      
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      
      import javax.servlet.http.HttpSession;
      
      @Controller
      @RequestMapping("/user")
      public class UserController {
      
          //跳转到登陆页面
          @RequestMapping("/jumplogin")
          public String jumpLogin() throws Exception {
              return "login";
          }
      
          //跳转到成功页面
          @RequestMapping("/jumpSuccess")
          public String jumpSuccess() throws Exception {
              return "success";
          }
      
          //登陆提交
          @RequestMapping("/login")
          public String login(HttpSession session, String username, String pwd) throws Exception {
              // 向session记录用户身份信息
              System.out.println("接收前端==="+username);
              session.setAttribute("user", username);
              return "success";
          }
      
          //退出登陆
          @RequestMapping("logout")
          public String logout(HttpSession session) throws Exception {
              // session 过期
              session.invalidate();
              return "login";
          }
      }
    3. 编写一个登陆成功的页面 success.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>Title</title>
      </head>
      <body>
      
      <h1>登录成功页面</h1>
      <hr>
      
      ${user}
      <a href="${pageContext.request.contextPath}/user/logout">注销</a>
      </body>
      </html>
    4. 在 index 页面上测试跳转!启动Tomcat 测试,未登录也可以进入主页!

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
        <head>
          <title>$Title$</title>
        </head>
        <body>
        <h1>首页</h1>
        <hr>
        <%--登录--%>
        <a href="${pageContext.request.contextPath}/user/jumplogin">登录</a>
        <a href="${pageContext.request.contextPath}/user/jumpSuccess">成功页面</a>
        </body>
      </html>
    5. 编写用户登录拦截器

      package com.kuang.interceptor;
      
      import org.springframework.web.servlet.HandlerInterceptor;
      import org.springframework.web.servlet.ModelAndView;
      
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;
      import java.io.IOException;
      
      public class LoginInterceptor implements HandlerInterceptor {
      
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
              // 如果是登陆页面则放行
              System.out.println("uri: " + request.getRequestURI());
              if (request.getRequestURI().contains("login")) {
                  return true;
              }
      
              HttpSession session = request.getSession();
      
              // 如果用户已登陆也放行
              if(session.getAttribute("user") != null) {
                  return true;
              }
      
              // 用户没有登陆跳转到登陆页面
              request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
              return false;
          }
      
          public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
      
          }
          
          public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
      
          }
      }
    6. 在Springmvc的配置文件中注册拦截器

      <!--关于拦截器的配置-->
      <mvc:interceptors>
          <mvc:interceptor>
              <mvc:mapping path="/**"/>
              <bean id="loginInterceptor" class="com.kuang.interceptor.LoginInterceptor"/>
          </mvc:interceptor>
      </mvc:interceptors>
    7. 再次重启Tomcat测试!

    OK,测试登录拦截功能无误.

    文章来源https://blog.kuangstudy.com/index.php/archives/484/该博主,侵权请联系删除

     
  • 相关阅读:
    leetcode 48. Rotate Image
    leetcode 203. Remove Linked List Elements 、83. Remove Duplicates from Sorted List 、82. Remove Duplicates from Sorted List II(剑指offer57 删除链表中重复的结点) 、26/80. Remove Duplicates from Sorted ArrayI、II
    leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes
    leetcode 58. Length of Last Word
    安卓操作的一些问题解决
    leetcode 378. Kth Smallest Element in a Sorted Matrix
    android studio Gradle Build速度加快方法
    禁用gridview,listview回弹或下拉悬停
    Android Studio找不到FragmentActivity类
    安卓获取ListView、GridView等滚动的距离(高度)
  • 原文地址:https://www.cnblogs.com/GOOGnine/p/12271271.html
Copyright © 2011-2022 走看看