发表于: 2018-10-13 22:29:37
2 531
今天完成的事情:
一、在spring boot项目里使用自定义拦截器。
主要是重构任务5时遗留任务。
拦截器代码自不用说:
/**
* 主要通过验证token内容实现拦截功能
*/
@Component
public class UserInterceptor extends HandlerInterceptorAdapter {
@Autowired
UsersService usersService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
boolean flag = isExist(request);
if (flag) {
String[] str = getCookie(request);
//取出用户名并解密
String username = DesUtil.decrypt(str[1]);
//将时间取出解密并转换为long格式
String time = DesUtil.decrypt(str[0]);
long loginTime = TokenUtil.stringFormLong(time);
long currentTime = System.currentTimeMillis();
long pastTime = currentTime - loginTime;
long time1 = usersService.getByName(username).getLoginTime();
//验证用户名和登录时间
if ((loginTime == usersService.getByName(username).getLoginTime() && pastTime < (5 * 24 * 60 * 60 * 1000) && pastTime > 0)) {
return true;
} else {
response.sendRedirect("../login");
return false;
}
} else {
response.sendRedirect("../login");
return false;
}
}
/**
* 获取cookie中的值
*
* @param request
* @return
*/
public String[] getCookie(HttpServletRequest request) {
String[] strs = new String[2];
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("time")) {
strs[0] = cookie.getValue();
}
if (cookie.getName().equals("username")) {
strs[1] = cookie.getValue();
}
}
}
return strs;
}
/**
* * 判断要求携带的两个cookie是否存在
*
* @param request
* @return
*/
public boolean isExist(HttpServletRequest request) throws Exception {
boolean flag = false;
Cookie[] cookies = request.getCookies();
//记录比较的次数
int count = 0;
for (Cookie cookie : cookies) {
if (cookie.getName().equals("time")) {
count++;
}
if (cookie.getName().equals("username")) {
count++;
}
}
if (count == 2) {
flag = true;
}
return flag;
}
}
spring boot框架最大的问题还是在于配置。因为默认“约定大于配置”,所以使用自定义配置的时候比较麻烦。
原本如果使用基于java的配置。那么配置文件里需要自己写个MyWebMvcConfigurerAdapter类,继承自WebMvcConfigurerAdapter类,然后重写addInterceptors拦截器方法就好了。
悲催的是,spring boot2.0版本废弃了WebMvcConfigurerAdapter这个类。推荐的是另外一个强大的WebMvcConfigurationSupport类。
然而,如果在配置中自定义个WebMvcConfigurer类继承WebMvcConfigurationSupport类。在spring boot看来就是放弃对Spring MVC的所有默认设置,全部自定义手动设置。那么配置文件中写明的有关Spring MVC的配置会全部失效。
这意味着关于视图解析器,监听器等设置都得自己重新在配置类中一一配置。
我使用jsp,为了使用tiles框架,配置了两个视图解析器。但是最后验证,没有springboot默认配置,两个视图解析器工作逻辑会乱掉。自己无法写全面的。
这个问题困扰良久。最后才找到解决方案:
自己写的spring mvc配置类不要继承WebMvcConfigurationSupport,直接实现WebMvcConfigurer接口,然后重写需要的方法就行。这种情况下,spring boot的默认配置和自己的配置是同时生效的!
自定义MVC配置:
/**
* 自定义配置MVC
*/
@Configuration
public class MyWebMvcConfigurerAdapter implements WebMvcConfigurer {
@Autowired
UserInterceptor userInterceptor;
/**
* 拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry){
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
registry.addInterceptor(userInterceptor).addPathPatterns("/u/*").excludePathPatterns("/login");
}
}
最后拦截成功!
二、重构任务代码
感觉spring boot依然是新框架。为了省事,减去了很多配置过程。但是任务中很多是需要自己写好配置的。重构还是回到spring mvc吧。
明天的计划:
1、继续重构任务代码。
2、复习springmvc相关。
遇到的困难:如上,已解决。
今天的收获:加深了对spring boot运行机制的理解。
评论