Java Spring * 案例详解
作者:溜了溜了AA 发布时间:2022-11-01 07:15:06
标签:Spring, ,
springmvc提供了 * ,类似于过滤器,他将在我们的请求具体出来之前先做检查,有权决定接下来是否继续,对我们的请求进行加工。
* ,可以设计多个。
通过实现handlerunterceptor,这是个接口
定义了非常重要的三个方法:
后置处理
前置处理
完成处理
案例一:
通过 * 实现方法耗时统计与警告
package com.xy.interceptors;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
/**
* 方法耗时统计 *
*/
public class MethodTimerInterceptor implements HandlerInterceptor {
private static final Logger LOGGER=Logger.getLogger(MethodTimerInterceptor.class);
//前置功能, 开始到结束,两个点减法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//定义开始时间
long start = System.currentTimeMillis();
//2.将其存到请求域当中
request.setAttribute("start",start);
//记录请求日志
LOGGER.info(request.getRequestURI()+",请求到达");
//3,返回true,才会找下一个 * ,如果没有下一个 * ,则去Controller
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//1,取出start
long start = (long) request.getAttribute("start");
//2,得到end
long end =System.currentTimeMillis();
//3,记录耗时
long spendTime = end-start;
if (spendTime>2000){
LOGGER.warn("方法耗时严重,请及时处理,耗时:"+spendTime);
}else {
LOGGER.info("方法耗时"+spendTime+"毫秒,正常");
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
springmvc的配置
<!-- * 的配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--
-->
<mvc:mapping path="/**/*"/>
<bean class="com.xy.interceptors.MethodTimerInterceptor">
</bean>
</mvc:interceptor>
</mvc:interceptors>
案例二:会话 *
package com.xy.interceptors;
import com.xy.pojo.User;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SessionInterceptor implements HandlerInterceptor {
private static final Logger LOGGER=Logger.getLogger(SessionInterceptor.class);
//检查当前会话是否有User,如果有则放行,没有则拦截
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("SESSION_USER");
if (user==null){
LOGGER.warn("您不具备权限,请先登录");
return false;
}
if(user instanceof User){
//再去数据库检查其身份对不对,是否冻结。。。
User user1 = (User) user;
user1.setPwd(null);
request.getSession().setAttribute("SESSION_USER",user1);
LOGGER.info(user1.getName()+"处于登录状态,可以执行操作");
return true;
}else {
LOGGER.warn("请先登录");
return false;
}
}
@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 {
}
}
springMvc配置
<!-- * 的配置-->
<mvc:interceptors>
<!--只想拦截/user2/**/*
还需要开放登录权限
-->
<mvc:interceptor>
<mvc:mapping path="/user2/**/*"/>
<!--排除登录的URI-->
<mvc:exclude-mapping path="/user2/login"></mvc:exclude-mapping>
<bean class="com.xy.interceptors.SessionInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
将其配置在mvc:interceptors节点之下即可。
* 执行顺序问题
如果有N个 * ,并且都能拦截到某个URI的时候,执行顺序问题,
在springmvc当中 * 定义的顺序是有关系的。配置在前面的优先拦截,按照顺序来
* 与过滤器的比较
相似
1,都有优先处理请求的权利,都可以决定是否将请求转移到请求的实际处理的控制器处。
2,都可以对请求或者会话当中的数据进行加工。
不同
1, * 可以做前置处理也可以做后置处理,还可以进行完成处理,控制的 更加细致,而过滤器只负责前面的过滤行为而已。
2, 过滤器优先执行,还是 * 优先呢?----------过滤器优先。
3,过滤器是servlet规范里面的组件。
4, * 都是框架自己而外添加的组件。
来源:https://blog.csdn.net/shaorouAA/article/details/102574483
0
投稿
猜你喜欢
- 在互联网的服务端开发的时候,我们很经常要在一个项目中去调用不同的数据库。在这种情况下,必然要涉及到多数据源问题。那么,我们该如何解决多数据源
- 我就废话不多说了,大家还是直接看代码吧~<select id="getBiTree" parameterType=
- 这个功能一共有两部分组成,第一部分是窗体代码,另外的一部分是一个辅助方法。直接贴出代码,以供大家参考:using System;using
- 基础配置新建module:cloudalibaba-config-nacos-client3377pom文件版本号已经由父工程控制<?
- 本文主要介绍了面向对象的三大特征实例解析,下面看看具体内容。封装封装一个Teacher和Student类package com.hz.tes
- Java多线程线程的创建1.继承Thread2.实现Runnable3.实现Callable使用继承Thread类来开发多线程的应用程序在设
- 项目介绍基于Layui的后台管理系统模板,扩展Layui原生UI样式,整合第三方开源组件,提供便捷快速的开发方式,延续LayuiAdmin的
- 提到类型转换,首先要明确C#中的数据类型,主要分为值类型和引用类型:1.常用的值类型有:(struct)整型家族:int,byte,char
- 前言:文件的上传和下载在日常开发中很是常见,那么这一功能是如何实现的呢,下面我给大家介绍一下实现条件:1、需要一个form标签,method
- 要实现摇一摇的功能,类似于微信的摇一摇方法1:通过分析加速计数据来判断是否进行了摇一摇操作(比较复杂)方法2:iOS自带的Shake监控AP
- 1.栈和队列的共同特点是(只允许在端点处插入和删除元素)4.栈通常采用的两种存储结构是(线性存储结构和链表存储结构)5.下列关于栈的叙述正确
- 本文实例为大家分享了Java实现图形界面计算器的具体代码,供大家参考,具体内容如下 代码:import javax.swing.*
- Java Lambda 源码分析问题:Lambda 表达式是什么?JVM 内部究竟是如何实现 Lambda 表达式的?为什么要这样实现?一、
- 新版的IDEA为了防止 pom 更新时,MAVEN 自动导包时卡死的问题,取消了自动导包机制。但新增了导入按钮和快捷键。 问题id
- 1.根据单个分隔字符用split截取例如string st="GT123_1";string[] sArray=st.s
- Java 反射机制介绍Java 反射机制。通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还原“类的全部的信息”。这里“类
- 一:问题描述 在已经root过的android设备下,app执行一个linux命令,app需要获取su权限,在某些a
- IDE工具之IDEA2022.2的简介、下载与安装、初步配置IDEA简介概述IDEA全称是IntelliJ,是JetBrains公司推出一个
- springboot sqlSessionFactoryBean自定义1.新建一个配置类,加上configuration注解2.定制化Sql
- 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节