一·实现有效的登入
现在还是伪登入,直接访问网址就可以绕过登入,现在实现锁定用户访问信息,使用过滤机制,使为登入用户回到登入界面。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。
测试:
1·
欢迎页面是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:
回到: