发表于: 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运行机制的理解。



返回列表 返回列表
评论

    分享到