拦截机制说明

一·实现有效的登入

现在还是伪登入,直接访问网址就可以绕过登入,现在实现锁定用户访问信息,使用过滤机制,使为登入用户回到登入界面。session失效时间大概是30分钟,可能吃完饭回来就要登入了。
现在,直接输入“http://localhost:8080/stuinfo/students”还是可以进的去的,只是操作员没有了:
在这里插入图片描述

二·拦截器

继承了一个叫Handle拦截器适配器的类,有一个方法叫preHandle,表示在之前处理,他会传入请求传入响应,传入控制器。对于拦截器所关注的网站,拦截器就要启动工作。工作就是检测你登入了没有。

1·创建包interceptor

控制器是拦在某个请求之前做点事。

2·在包interceptor中新建LoginInterceptor

继承自Handler拦截器适配器:
在这里插入图片描述
在这里插入图片描述
现在要对HandlerInterceptorAdapter类下的一些方法进行重写:

查看有哪些方法可以重写:
在这里插入图片描述
在这里插入图片描述

preHandle:拦截器拦截到这个请求之后,在你访问这个网址之前,进行一些处理。
在这里插入图片描述

书写一个拦截器:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
		throws Exception {

	//获取访问地址
	String uri = request.getRequestURI();
	
	
	System.out.println("访问网址:"+uri);
	
	//将需要拦截的地址写出来
	
	
	//其他地址一律放行
	return true;
}

3·配置拦截器:

来到dispatcher-servlet:
添加:

	<!-- springmvs 拦截器列表 -->
	<mvc:interceptors>
	
	<!--多个拦截器,将依次运行
	注:hotelsys是应用程序名
		1./**拦截所有层次深度的目录
		2./*只拦截一级目录,比如/hotelsys/rooms
		3./*/*可以拦截二级目录,比如/hotelsys/rooms/1
		4./rooms/*,一级目录得到固定,比如/hotelsys./rooms/1
		5./rooms/**,表示拦截rooms下所有层级的目录
		6./rooms/*/*,表示拦截rooms下的两级目录
		-->
		
		<mvc:interceptor>
		
			<!--匹配多级目录-->
			<!-- 只匹配一级目录,其他的不管。只要访问一级目录他就会启动 -->
			<mvc:mapping path="/*"/>

			<!-- 登录权限拦截器 -->
			<bean class="edu.mju.stuwork.interceptor.LoginInterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>

现在interceptor定义进来了,但是什么时候启动它,也要说明。

说明:

1·注明是mvc的标签:<mvc:interceptors>。为什么要注明呢?因为同名的标签是可能存在的,只写一个interceptors不能分辨,要表示是mvc库里的interceptors。

2·<mvc:interceptors>是interceptors,里面可能有很多的interceptor。

测试:

在这里插入图片描述
欢迎页面是index.jsp
2·点击系统登入:
在这里插入图片描述
拦截到了:
在这里插入图片描述
3·再点击修改,删除:
就没有被拦截,因为是这种:
在这里插入图片描述
路径了

4·离开系统:
在这里插入图片描述
5·调整
在这里插入图片描述
拦截所有级别,连取照片都可以拦的到:
在这里插入图片描述

4·限制访问

不是什么都放行,怎么样的不放行呢?
以“/stuinfo/students”打头的,都要做检测,到底登入了没有,如果要控制的网址非常多,要创建一个数组,然后遍历数组。如果与数组中的一个成员相符,就要进行身份检测。登入和登出就不用做限制了。
回到LoginInterceptor,添加限制地址:
修改为:

package edu.mju.stuwork.interceptor;

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

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class LoginInterceptor extends HandlerInterceptorAdapter {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		// 获取访问地址
		String uri = request.getRequestURI();

		System.out.println("访问网址:" + uri);

		// 将需要拦截的地址写出来
		if (uri.startsWith("/stuinfo/students")) {
			HttpSession session = request.getSession();// 拿到session,因为登入之后数据是保存在session范围的。
			Object user = session.getAttribute("loginedUser");
			// 下面有检测user(登入后留存的数据)是否为空,即判断是否登录

			if (user == null) {// 如果是空,重定向到登录界面,get提交
				System.out.println("check fail, stop! goto login! ");
				response.sendRedirect("/stuinfo/login");
				return false;// 剩下就不用在查了

			}
		}
		// 其他地址一律放行
		return true;

	}

}

1·先要知道要访问那个网址

先要知道要访问那个网址。有些网址是不受限的,比如样式表和js文件等静态资源。要拦的是除了登入外的控制器访问。

2· HttpSession session = request.getSession();

拿到session,因为登入之后数据是保存在session范围的。名字叫“loginedUser”:
在这里插入图片描述
测试:
访问http://localhost:8080/stuinfo/students:
在这里插入图片描述
回到:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值