Spring MVC 拦截器判断用户是否登录

功能介绍

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

项目结构

需要完整代码可以关注并私信我
在这里插入图片描述

结果

  • 点击登录(提交),显示登陆成功,返回此页面,点击查看图片,可以查看图片;
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 点击注销(清除session登录信息),点击查看图片

  • 注意:使用无痕窗口进行调试在这里插入图片描述

  • 此时查看被拦截,仍然在登录页面。在这里插入图片描述

主要代码实现

控制器:登录,访问图片,注销

package indi.huishi.controller;

import indi.huishi.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 1、有一个登录页面,需要写一个 controller 访问页面
 * 2、登录页面有一提交表单的动作。需要在 controller 中处理。
 * 2.1、判断用户名密码是否正确
 * 2.2、如果正确 向 session 中写入用户信息
 * 2.3、返回登录成功。
 * 3、拦截用户请求,判断用户是否登录
 * 3.1、如果用户已经登录。放行
 * 3.2、如果用户未登录,跳转到登录页面
 * @author Huishi
 */
@Controller
@RequestMapping("/user")
public class LoginController {
    
    
    //访问 http://localhost:8080/springmvc_login_interceptor_war_exploded/images/21.jpg

    /**
     * 登录
     * @param user
     * @param model
     * @param request
     * @return
     */
    @RequestMapping("/login")
    public String login(User user, Model model, HttpServletRequest request){
    
    
//        System.out.println(user);
        // 判断用户名和密码
        if(user.getUsername().equals("Huishi") && user.getPassword().equals("123456")){
    
    
            // 如果正确 向 session 中写入用户信息
            request.getSession().setAttribute("userInfo", user);
            System.out.println(request.getSession().getAttribute("userInfo"));
            return "success";
        }
        return "error";
    }

    /**
     * 访问
     * @param user
     * @param model
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    @RequestMapping("/enter")
    public void enter(User user, Model model, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        response.sendRedirect("http://localhost:8080/springmvc_login_interceptor_war_exploded/images/1.png");
    }

    /**
     * 注销
     * @param request
     * @return
     */
    @RequestMapping("/logout")
    public @ResponseBody User
    logout(String s, HttpServletRequest request){
    
    
        System.out.println("注销...");
        // 清空用户信息
        request.getSession().setAttribute("userInfo",null);
        return (User) request.getSession().getAttribute("userInfo");
    }
}

拦截器:拦截访问图片的请求路径

package indi.huishi.interceptor;

import indi.huishi.pojo.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author Huishi
 */
public class LoginInterceptor implements HandlerInterceptor {
    
    
    private static String userInfo = "userInfo";
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        User user = (User) request.getSession().getAttribute(userInfo);
        System.out.println("拦截器user"+user);
        if (user == null){
    
    
            // 如果用户未登录,跳转到登录页面
            request.getRequestDispatcher("/index.jsp").forward(request, response);
            return false;
        }else{
    
    
            // 含有user信息,放行
            return true;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    

    }
}

拦截器配置

    <!--拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/user/enter"/>
            <bean class="indi.huishi.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

页面index.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%--
  Created by IntelliJ IDEA.
  User: Huishi
  Date: 2021/4/15
  Time: 21:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <%@include file="/WEB-INF/pages/base.jsp"%>
    <base href="<%=basePath%>">
    <title>Title</title>
</head>
<body>
    <script type="text/javascript" src="script/jquery-1.7.2.js"></script>
    <script type="text/javascript">
        $(function (){
     
     
           $("#logout").click(function(){
     
     清空session中的登录信息
               <%--alert("${pageContext.request.contextPath}");--%>
                $.ajax({
     
     
                    url:"${pageContext.request.contextPath}/user/logout",
                    data:null,
                    dataType:"json",
                    success:function(data){
     
     
                        if(data==null) {
     
     
                            $("#status").text("清空成功").css('color','green');
                        }else{
     
     
                            $("#status").text("清空失败").css('color','red');
                        }
                    }
                    });
               });
        });
    </script>


    <table>
        <form action="user/login" method="post">
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username" value="Huishi"></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="text" name="password" value="123456"></td>
            </tr>
            <tr>
                <td><input type="submit" name="登录"></td>
            </tr>
        </form>
            <tr>
                <td>
                    <input type="button" id="logout" value="注销(清除session登录信息)">
                </td>
                <td>
                    <span id="status"></span>
                </td>
            </tr>
        <tr>
            <td>
                 <a href="user/enter">查看图片</a>
            </td>
        </tr>
    </table>

</body>
</html>

Guess you like

Origin blog.csdn.net/qq_36937684/article/details/115743919