SpringMVC-拦截器做一个登录认证的小Demo
拦截器
拦截器的定义
处理器拦截器类似于servlet开发中的filter,用于对处理器进行预处理和后处理。
定义拦截器,实现HandlerInterceptor这个接口
接口的实现需要导入包import org.springframework.web.servlet.HandlerInterceptor;
这个包不能导错,不然不能自动添加方法。
代码:
package com.jch.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class HandlerInterceptor1 implements HandlerInterceptor{
/**
* 进入handler方法之前执行
* 用于身份认证,身份校验
* 比如身份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不在向下执行
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
// TODO Auto-generated method stub
return false;
}
/**
* 进入handler之后,返回modelandview之前执行
* 应用场景从modelandview出发,将共用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一制定视图
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
/**
* 执行handler完成执行此方法
* 应用场景:统一异常处理,统一日志处理
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
}
拦截器的配置
SpringMVC拦截器针对HandlerMapping进行拦截设置
SpringMVC拦截器针对HandlerMapping进行拦截器设置
如果在某个HandlerMapping中配置拦截,经过该HandlerMapping映射成功的handler最终使用该拦截器。
一般不推荐使用,配置过于麻烦
类似全局的拦截器
SpringMVC配置类似全局的拦截器,SpringMVC框架将配置的类似全局的拦截器注入到每一个HandlerMapping中
拦截器的测试
测试需求
测试多个拦截器各个方法的执行时机
编写两个拦截器
代码;
package com.jch.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class HandlerInterceptor1 implements HandlerInterceptor{
/**
* 进入handler方法之前执行
* 用于身份认证,身份校验
* 比如身份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不在向下执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
System.out.println("这是第1个拦截器,preHandle方法");
return false;
}
/**
* 进入handler之后,返回modelandview之前执行
* 应用场景从modelandview出发,将共用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一制定视图
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
System.out.println("这是第1个拦截器,postHandle方法");
}
/**
* 执行handler完成执行此方法
* 应用场景:统一异常处理,统一日志处理
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
System.out.println("这是第1个拦截器, afterCompletion方法");
}
}
两个拦截器都放行
将两个return都改为true
在浏览器中随意访问一个路由看效果:
这是第1个拦截器,preHandle方法
这是第2个拦截器,preHandle方法
这是第2个拦截器,postHandle方法
这是第1个拦截器,postHandle方法
这是第2个拦截器,afterCompletion方法
这是第1个拦截器, afterCompletion方法
总结:
preHandle方法按顺序执行
postHandle方法和afterCompletion方法按拦截器配置的逆向顺序执行
拦截器1放行,拦截器2不放行
结果:
这是第1个拦截器,preHandle方法
这是第2个拦截器,preHandle方法
这是第1个拦截器, afterCompletion方法
总结:
拦截器1放行,拦截器的preHandle方法才会执行
拦截器2的preHandle方法不放行,拦截器2的postHandle方法和afterCompletion方法不会执行。
只要有一个拦截器拦截不放行postHandle方法都不会执行
拦截器1不放行,拦截器2不放行
结果:
这是第1个拦截器,preHandle方法
总结:
拦截器1 preHandle方法不放行,postHandle方法和afterCompletion方法都不会执行
拦截器1 preHandle方法不放行,拦截器2不执行。
小结
根据测试结果,对拦截器应用。
比如:
统一日志处理拦截器,需要该拦截器preHandler一定要放行,且将它放在拦截器链接中的第一个位置。
登录认证的拦截器,放在拦截器链接中的第一个位置
权限校验拦截器,放在登录校验拦截器之后。(因为登录通过后才校验权限)
拦截器的应用(实现登录认证)
需求
1、 用户请求URL
2、 拦截器进行校验
如果请求的URL是公开地址(无需登录就能访问的URL),让放行。、
如果用户session不存在跳转到登录界面
如果用户session存在,继续操作
登录的controller方法
package com.jch.controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LoginController {
// 登录
@RequestMapping("login.jch")
public String login(HttpSession session , String username , String password) {
// 调用service进行用户身份验证
// ...这里假设验证通过
// 在session中保存用户身份信息
session.setAttribute("username", username);
return "redirect:/register.jch"; // /为项目根目录
}
// 退出登录
@RequestMapping("logout.jch")
public String login(HttpSession session) {
// 清楚session数据
session.invalidate();
return "redirect:/login.jch";
}
}
登录认证拦截的实现
代码实现
package com.jch.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class LoginInterceptor implements HandlerInterceptor{
/**
* 进入handler方法之前执行
* 用于身份认证,身份校验
* 比如身份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不在向下执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
// 获取请求的URL
String url = request.getRequestURI();
// 判断是否是公开地址(实际使用将公开地址配置在配置文件中)这里公开地址就是登录提交的地址
if(url.indexOf("login.jch")>=0) {
// 如果要登录提交,那么放行
return true;
}
// 判断session
HttpSession session = request.getSession();
String username = (String)session.getAttribute("username");
if(username != null) {
// 有身份信息,放行
return true;
}
// 身份验证不通过跳转到登录界面
request.getRequestDispatcher("/views/home/login.jsp").forward(request, response);
System.out.println("这是第1个拦截器,preHandle方法");
return false;
}
/**
* 进入handler之后,返回modelandview之前执行
* 应用场景从modelandview出发,将共用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一制定视图
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
System.out.println("这是第1个拦截器,postHandle方法");
}
/**
* 执行handler完成执行此方法
* 应用场景:统一异常处理,统一日志处理
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
System.out.println("这是第1个拦截器, afterCompletion方法");
}
}
配置拦截器
在springmvc的前端控制器配置文件中配置interceptor拦截器
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 多个拦截器,顺序执行 -->
<!-- 登录认证拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/**"/><!-- 标识拦截所有的URL包括所有的子URL -->
<bean class="com.jch.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
启动Tomcat查看测试结果。
SpringMVC-拦截器做一个登录认证的小Demo的更多相关文章
- springboot+springmvc拦截器做登录拦截
springboot+springmvc拦截器做登录拦截 LoginInterceptor 实现 HandlerInterceptor 接口,自定义拦截器处理方法 LoginConfiguration ...
- SpringMVC拦截器(实现登录验证拦截器)
本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 <%@ ...
- SpringMVC拦截器实现用户登录拦截
本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 1 < ...
- springmvc拦截器实现用户登录权限验证
实现用户登录权限验证 先看一下我的项目的目录,我是在intellij idea 上开发的 1.先创建一个User类 package cn.lzc.po; public class User { pri ...
- springmvc拦截器的简单了解
1.定义一个拦截器 2.在springmvc.xml中配置拦截器. (1)拦截器拦截的请求是建立在前端控制器配置之下的,若DispatcherServlet拦截的是*.action,则拦截器即使配置 ...
- SpringMVC 拦截器实现原理和登录实现
SpringMVC 拦截器的原理图 springMVC拦截器的实现一般有两种方式 第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor 接口 第二种方 ...
- springMVC使用拦截器检查用户登录
参考文章 编写拦截器类 package cultivate_web.interceptor; import javax.servlet.http.HttpServletRequest; import ...
- Springboot中SpringMvc拦截器配置与应用(实战)
一.什么是拦截器,及其作用 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略.它通过动态拦截Action调用的对 ...
- 学习SpringMVC——拦截器
拦截器,顾名思义就是用来拦截的. 那什么是拦截,又为什么要拦截.对于Spring MVC来说,拦截器主要的工作对象就是用户的请求,拦截下来之后,我们可以在拦截的各个阶段悉心呵护[为所欲为].常见的比如 ...
随机推荐
- React中ref的三种用法 可以用来获取表单中的值 这一种类似document.getXXId的方式
import React, { Component } from "react" export default class MyInput extends Component { ...
- pikachu SQL-Injection
1.数字型注入(POST) 可以看到,这个参数提交是POST类型的,用burp. 测试参数id id='&submit=%E6%9F%A5%E8%AF%A2 可以看到有报错回显,而且根据回显可 ...
- TCP的三次握手和四次挥手详解
相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助. TCP报文格式 TCP的包如下: ...
- vue中使用kindeditor富文本编辑器2
第一步,下载依赖 yarn add kindeditor 第二步,建立kindeditor.vue组件 <template> <div class="kindeditor& ...
- ACE网络编程:IPC SAP、ACE_SOCKET和TCP/IP通信实例
socket.TLI.STREAM管道和FIFO为访问局部和全局IPC机制提供广泛的接口.但是,有许多问题与这些不统一的接口有关联.比如类型安全的缺乏和多维度的复杂性会导致成问题的和易错的编程.ACE ...
- MySQL实战45讲学习笔记:第十八讲
一.引子 在 MySQL 中,有很多看上去逻辑相同,但性能却差异巨大的 SQL 语句.对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大. 我今天挑选了三个这样的案例和你分享.希望再遇到相似 ...
- 后端设置Cookie前端跨域获取丢失问题(基于springboot实现)
1.跨域问题说明:后端域名为A.abc.com,前端域名为B.abc.com. 2.后端设置一个cookie发送给前台,domain应该是setDomain(“abc.com”),而不是setDoma ...
- java语言规范
一.标志符 命名规则: 标识符由26个英文字符大小写(a~zA~Z).数字(0~9).下划线(_)和美元符号($)组成. 不能以数字开头,不能是关键字 严格区分大小写 标识符的可以为任意长度 命名规范 ...
- pyqt pyinstaller使用说明
一.实验环境 1.Windows7x64_SP1 2.anaconda2.5.0 + python2.7(anaconda集成,不需单独安装) 3.pyinstaller3.0 python2.7使用 ...
- Loj #2529. 「ZJOI2018」胖
Loj #2529. 「ZJOI2018」胖 题目描述 Cedyks 是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks 是一个富有的男孩子.他住在著名的 The P ...