springMvc验证登录状态才可以进行修改个人信息-《简单易懂》

9 篇文章 1 订阅
3 篇文章 0 订阅

前言

如果一个用户想要修改自己的个人信息, 那么他必须是登录状态下进行的

本文章将会简单的配置一下拦截器的使用,以及一些简单介绍

环境 idea

spring 依赖均为 5.0.0.RELEASE 版本

jdk 1.8

开始

SpringMVC提供了 Interceptor 拦截器几种机制:

实现 HandlerInterceptor接口

继承实现了 HandlerInterceptor接口的类

实现 WebRequestInterceptor接口

继承实现了 WebRequestInterceptor接口的类

我会使用实现HandlerInterceptor接口的机制, 其他的可以到网上查资料,用法是差不多的

查看 HandlerInterceptor接口源码:

public interface HandlerInterceptor {

  default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  throws Exception {
    return true;
  }

  default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable ModelAndView modelAndView) throws Exception {
  }

  default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable Exception ex) throws Exception {
  }

}

三个方法的作用:

preHandle: 执行 Handler 方法之前执行, 返回值是 Boolean 类型, 如果返回 false, 表示拦截请求,不再向下执行, 如果返回 true , 表示放行, 程序继续向下进行(如果后面没有其他拦截器,就会直接执行 controller 方法)

postHandle: 执行 Handler 之后, 返回 ModelAndView 之前执行

afterCompletion: 执行完 Handler 之后执行, 由于是在 controller 方法执行完毕后执行该方法, 所以该方法适合进行统一的异常或者日志处理操作

创建登录拦截

登录控制器:

package com.ujiuye.controller;


import com.ujiuye.domain.User;
import com.ujiuye.exception.UserException;
import com.ujiuye.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpSession;

@Controller
public class LoginController {

    @Autowired
    private IUserService userService;

    //登录方法
    @RequestMapping("login")
    public String login(String username, String password,
                        HttpSession session, Model model) throws UserException {
        User user = userService.selectLogin(username, password);
        if (user!=null){
            //user对象放入session作用域
            session.setAttribute("USER_IN_SESSION",user);
            //跳转到用户列表页面
            return "redirect:/user/query.do";
        }else {
            //跳转到登录页面,提示用户名或密码错误
            model.addAttribute("msg","用户名或者密码错误");
            return "forward:/login.jsp";
        }
    }
}

登录检查

package com.ujiuye.interceptor;


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 {

    //登录检查,实现接口里的这个方法
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判断session中是否有"USER_IN_SESSION"的key
        HttpSession session = request.getSession();
        Object user = session.getAttribute("USER_IN_SESSION");
        if (user == null){
            //跳转到登录页面
            response.sendRedirect("login.jsp");
            return  false;
        }
        return true;
    }
}

查看session是否有 USER_IN_SESSION 的key, 如果有就代表已经登陆, 反之;

配置全局拦截器

springMVC.xml 文件里

 <!--拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--拦截的路径/*一级路径 /**所有路径-->
            <mvc:mapping path="/**"/>
            <!--排除登录页面-->
            <mvc:exclude-mapping path="/login.do"/>
            <!-- 拦截器类-->
            <bean class="com.ujiuye.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
    <mvc:interceptor>
            <!--第二个拦截器-->
        </mvc:interceptor>
       <mvc:interceptor>
           <!--第三个拦截器-->
        </mvc:interceptor>
    </mvc:interceptors>

记得排除掉登录页面;
</mvc:interceptors>: 标签下可以创建多个拦截器, 从上往下执行

总结
其实就是登录成功后在session放入一个key, 然后拦截器实现 HandlerInterceptor接口, 实现里面的方法, 判断session是否存在登录的key, 有的话就是已登录, 没有就再跳回登录页面, 防止用户直接进入深一层的页面,

然后再springMVC.xml配置文件里配置一个全局拦截器,就ok了。

两种接口的区别

HandlerInterceptor: 主要进行请求前, 和请求后的拦截

而WebRequestInterceptor:针对请求的拦截器接口, 该接口中没有
response(响应),所以该接口只进行请求数据的准备和处理

查看 WebRequestInterceptor接口源码:

public interface WebRequestInterceptor {

  // 该方法返回值为 **void**,无返回值, 由于没有返回值, 所以使用该方法主要进行数据的前期准备,
  void preHandle(WebRequest request) throws Exception;

  void postHandle(WebRequest request, @Nullable ModelMap model) throws Exception;

  void afterCompletion(WebRequest request, @Nullable Exception ex) throws Exception;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值