91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot攔截器實現登錄攔截的方法示例

發布時間:2020-10-17 15:10:47 來源:腳本之家 閱讀:188 作者:斷橋殘雪 欄目:編程語言

源碼

GitHub:https://github.com/291685399/springboot-learning/tree/master/springboot-interceptor01

SpringBoot攔截器可以做什么

可以對URL路徑進行攔截,可以用于權限驗證、解決亂碼、操作日志記錄、性能監控、異常處理等

SpringBoot攔截器實現登錄攔截

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
    <relativePath/>
  </parent>
  <groupId>com.wyj</groupId>
  <artifactId>springboot-interceptor01</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>springboot-interceptor01</name>
  <description>springboot攔截器</description>

  <properties>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <!-- springboot -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>

    <!-- lombok -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>

    <!-- thymeleaf -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
  </dependencies>

  <build>
    <finalName>springboot-interceptor01</finalName>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

WebMvcConfigurer:繼承WebMvcConfigurationSupport類,重寫addInterceptors方法

/**
 * 在springboot2.0.0之后,WebMvcConfigurerAdapter已經過時了
 * 會使用WebMvcConfigurer或者WebMvcConfigurationSupport替代
 *
 * @author wyj
 * @create 2019-06-01 21:48
 */
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurationSupport {

  /**
   * 在springboot2.0.0之前繼承WebMvcConfigurerAdapter類,重寫addInterceptors方法
   *
   * @param registry
   */
//  @Override
//  public void addInterceptors(InterceptorRegistry registry) {
//    /**
//     * 攔截器按照順序執行,如果不同攔截器攔截存在相同的URL,前面的攔截器會執行,后面的攔截器將不執行
//     */
//    registry.addInterceptor(new AuthorityInterceptor())
//        .addPathPatterns("/user/**");
//    super.addInterceptors(registry);
//  }

  /**
   * 在springboot2.0.0之后實現WebMvcConfigurer接口,重寫addInterceptors方法
   *
   * @param registry
   */
//  @Override
//  public void addInterceptors(InterceptorRegistry registry) {
//    /**
//     * 攔截器按照順序執行,如果不同攔截器攔截存在相同的URL,前面的攔截器會執行,后面的攔截器將不執行
//     */
//    registry.addInterceptor(new AuthorityInterceptor())
//        .addPathPatterns("/user/**");
//  }

  /**
   * 在springboot2.0.0之后繼承WebMvcConfigurationSupport類,重寫addInterceptors方法
   *
   * @param registry
   */
  @Override
  protected void addInterceptors(InterceptorRegistry registry) {
    /**
     * 攔截器按照順序執行,如果不同攔截器攔截存在相同的URL,前面的攔截器會執行,后面的攔截器將不執行
     */
    registry.addInterceptor(new AuthorityInterceptor())
        .addPathPatterns("/user/**");
    super.addInterceptors(registry);
  }
}

AuthorityInterceptor:實現HandlerInterceptor接口,重寫preHandle、postHandle、afterCompletion方法

  • preHandle:在請求處理之前進行調用(Controller方法調用之前)
  • postHandle:請求處理之后進行調用,但是在視圖被渲染之前(Controller方法調用之后)
  • afterCompletion:在整個請求結束之后被調用,也就是在DispatcherServlet 渲染了對應的視圖之后執行(主要是用于進行資源清理工作)
@Slf4j
public class AuthorityInterceptor implements HandlerInterceptor {

  private static final Set<String> NOT_INTERCEPT_URI = new HashSet<>();//不攔截的URI

  static {
    NOT_INTERCEPT_URI.add("/user/login.html");
    NOT_INTERCEPT_URI.add("/user/login");
  }

  /**
   * 在請求處理之前進行調用(Controller方法調用之前)
   */
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
               Object object) throws Exception {
    String uri = request.getRequestURI();
    if (NOT_INTERCEPT_URI.contains(uri)) {
      log.info("不攔截" + uri);
      return true;
    }
    log.info("攔截" + uri);
    HttpSession session = request.getSession();
    UserInfo userInfo = (UserInfo) session.getAttribute("user_info_in_the_session");
    if (userInfo == null) {
      throw new RuntimeException("用戶未登陸");
    }
    return true;
  }

  /**
   * 請求處理之后進行調用,但是在視圖被渲染之前(Controller方法調用之后)
   */
  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mv) throws Exception {
  }

  /**
   * 在整個請求結束之后被調用,也就是在DispatcherServlet 渲染了對應的視圖之后執行
   * (主要是用于進行資源清理工作)
   */
  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex) throws Exception {
  }
}

UserController:

@Controller
@RequestMapping(value = "/user")
public class UserController {

  @RequestMapping(value = "/login.html")
  public String index() {
    return "login";
  }

  @RequestMapping(value = "/login")
  public String login(User user) {
    //查詢數據庫,我這里直接寫死
    User dbUser = new User(1, "zhangsan", "123456", "admin");
    if (dbUser.getPassword().equals(user.getPassword())) {
      UserInfo userInfo = new UserInfo(dbUser.getId(), dbUser.getUsername(), dbUser.getRole());
      HttpSession session = getRequest().getSession();
      session.setAttribute("user_info_in_the_session", userInfo);
      return "admin";
    }
    return "login";
  }

  @RequestMapping(value = "/userInfo")
  @ResponseBody
  public String userInfo() {
    HttpSession session = getRequest().getSession();
    UserInfo userInfo = (UserInfo) session.getAttribute("user_info_in_the_session");
    return userInfo.toString();
  }

  private HttpServletRequest getRequest() {
    return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
  }
}

User:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {

  private int id;
  private String username;
  private String password;
  private String role;

}

UserInfo: 用于存在用戶信息儲存在session中

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo implements Serializable {

  private int id;
  private String username; 
  private String role;

}

login.html:只是一個很簡單的登錄表單

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>登陸頁面</title>
</head>
<body>
<form action="/user/login" method="post">
  登陸:<br/>
  用戶名:<input name="username" id="username" type="text"/><br/>
  密&nbsp;&nbsp;&nbsp;碼:<input name="password" id="password" type="password"/><br/>
  <input type="submit" value="登陸"/>
</form>
</body>
</html>

admin.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>首頁</title>
</head>
<body>
<form action="/user/userInfo" method="get">
  <input type="submit" value="用戶信息"/></form>
</body>
</html>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

曲麻莱县| 孟津县| 磐石市| 株洲县| 合山市| 博白县| 舒城县| 佳木斯市| 巴里| 金堂县| 嘉善县| 格尔木市| 调兵山市| 新蔡县| 汤原县| 卢龙县| 新龙县| 历史| 辉南县| 射洪县| 梨树县| 寿宁县| 甘德县| 青阳县| 景德镇市| 千阳县| 罗甸县| 习水县| 襄樊市| 芦溪县| 东海县| 洪洞县| 榆林市| 新化县| 二连浩特市| 芜湖市| 乌拉特前旗| 迁西县| 奉节县| 喀什市| 鄄城县|