在登录上运用拦截器

简述:跟着狂神学Java,使用SpringMVC的拦截器,敲的一个小demo,主要理解拦截器的使用。

也可以去看看狂神的笔记   https://www.kuangstudy.com/zl/ssm#header3

拦截器

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

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

实现思路

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

所使用到的配置:JDK 15、tomcat 9.0.68服务器、MAVEN 3.6.3、IDEA 2021.1、IE浏览器

配置的jar包

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.18</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

 

编写一个登陆页面 login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="passwd"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

创建用户实体类 user.java

package com.guan.dao;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String username;
    private String passwd;
}

 

编写一个Controller处理请求 LoginController.java

 1 package com.guan.controller;
 2 
 3 import com.guan.dao.User;
 4 import org.springframework.stereotype.Controller;
 5 import org.springframework.ui.Model;
 6 import org.springframework.web.bind.annotation.RequestMapping;
 7 
 8 import javax.servlet.http.HttpSession;
 9 
10 @Controller
11 @RequestMapping("/user")
12 public class LoginController {
13 
14     //跳转到登录页面
15     @RequestMapping("/jumplogin")
16     public String jumpLogin(){
17         return "login";
18     }
19     //跳转到首页
20     @RequestMapping("/jumpsuccess")
21     public String jumpsuccess(){
22         return "success";
23     }
24     //登陆提交
25     @RequestMapping("/login")
26     public String lgoin(HttpSession session, User user, Model model){
27         System.out.println("接收前端的数据==="+user);
28         //session记录用户信息
29         model.addAttribute("user",user);
30         session.setAttribute("user",user);
31         return "success";
32     }
33     //退出登录
34     @RequestMapping("/out")
35     public String loginout(HttpSession session){
36         session.removeAttribute("user");
37         return "login";
38     }
39 }

编写一个登陆成功的页面 success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>成功页面</title>
</head>
<body>

${user}

<a href="${pageContext.request.contextPath}/user/out">退出登录</a>
</body>
</html>

在 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>

编写用户登录拦截器 MyInterceptor.java

 1 package com.guan.config;
 2 
 3 import org.springframework.web.servlet.HandlerInterceptor;
 4 import org.springframework.web.servlet.ModelAndView;
 5 
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import javax.servlet.http.HttpSession;
 9 
10 public class MyInterceptor implements HandlerInterceptor {
11     @Override
12     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
13         System.out.println("处理前===============");
14         // 如果是登陆页面则放行
15         if (request.getRequestURI().contains("login")){
16             return true;
17         }
18         // 用户没有登陆跳转到登陆页面
19         HttpSession session = request.getSession();
20         if (session.getAttribute("user") !=null){
21             return true;
22         }
23         // 用户没有登陆跳转到登陆页面
24         request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
25         return false;  // 关闭拦截器
26         //return false;  开启拦截器
27     }
28 
29     @Override
30     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
31         System.out.println("处理后===============");
32         HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
33 
34     }
35 
36     @Override
37     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
38         System.out.println("清理=================");
39         HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
40     }
41 }

在Springmvc的配置文件中注册拦截器

<!--    拦截器配置-->
    <mvc:interceptors>
        <mvc:interceptor>
<!--            所有请求-->
            <mvc:mapping path="/**"/>
            <bean class="com.guan.config.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

 

posted @ 2022-11-03 11:51  mo-de  阅读(71)  评论(0)    收藏  举报