发表于: 2017-10-28 23:28:21
1 750
今天完成的事
先想想关于任务5我需要做些什么
用拦截器拦截做判定,有token的直接登录不用输入密码,可以浏览一切网页,没token的用户没有权限查看所有用户的个人信息,只能看到一些我想让用户看到的东西
那么首先我需要先写一个拦截器,在springmvc的配置文件里面进行配置
在这之前,我得给控制器加点料
.png)

在控制器的上面加访问路径
想访问某些页面必须通过路径/u
然后在mvc配置中加interceptor
翻译成中文就是拦截器
mvc:mapping是拦截的路径
mvc:exclude-mapping是不会被拦截的路径
每当我要访问/u时,拦截器会调用Interceptor做判定
.png)

目前我们网页不是很多,其实有一种简单的方法就是把对游客开放网页都exclude-mapping,但是网页多了肯定不能这么做,会提高维护成本,麻烦
或许我们可以换一种思路
再写一个控制器,使用这个控制器必须加url/u
和游客访问的控制器区别开来
拦截器类有三个方法
preHandle
postHandle
afterCompletion
preHandle这个方法会在处理器之前被调用,是用来进行处理器拦截的,假如有多个Interceptor,springmvc会根据声明的先后顺序一个接一个地执行
拦截器还用到了两个工具类,一个是Des加密的工具类,另一个是获取cookie的工具类
我的Interceptor是参考成延师兄写的,这里感谢成延师兄,前人栽树后人乘凉
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// preHandle是以布尔值为返回类型的,当值为false事,表示请求结束
boolean flag = false;
// 获取cookie的请求信息中属性名为token的值
String strtoken = ServletUtil.getCookie(request, "token");
//判断token中是否为空
// 如果stroken不为空并且strtoken的字符串长度大于0,才会执行以下操作
if (strtoken != null && strtoken.length() > 0) {
//对cookies数组中的原存放值进行解密
// desUtil是一个des加密解密的工具类
// 这里设置了密钥,请求中会带上密钥,密钥相同才会解密
desUtil.setKey(paskey);
// 将要解密的密文进行解密计算
desUtil.setDesString(strtoken);
// 获取解密后的明文
String token = desUtil.getStrM();
// 用,来分隔元素,赋给tokeninfo
String[] tokeninfo = token.split(",");
// 声明一个User对象 temp
User temp = new User();
// 把数组中的第一个元素,也就是id赋值给temp
temp.setId(tokeninfo[0]);
// 把数组中的第2个元素,也就是登陆时间赋值给temp
// parseLong把原本的字符串转化为了数字
temp.setLogintime(Long.parseLong(tokeninfo[1]));
// findByToken通过参数temp提供的信息寻找数据库中对应的资料,并赋值给user
User user = userService.findByToken(temp);
// 如果可以找到,那么user必定不为空,证明该用户被允许访问/u
if (user != null) {
flag = true;
}
}
if (flag == false) {
response.sendRedirect(request.getContextPath() + "/login");
}
return flag;
}
}
拦截器中做了两次判定
第一次判断请求中是否有token
第二次判断数据库中是否有解密后的信息
如果以上两次判断皆为true,则可通过拦截器
接下来我们要做的是考虑怎么在请求中生成token
不过这个地方好像有了一些问题,在访问的时候没有生成token
遇到的问题
今天写拦截器的时候遇到这样一个问题
.png)

Element mvc:exclude-mapping is not allowed here.
原因是SpringMVC在3.2版本之前是不支持mvc:exclude-mapping 标签的
可以将把
改成
这样就可以解决问题了
生成token失败
明天计划的事
完成task5
收获
对拦截器有了一些了解
评论