发表于: 2019-11-18 22:53:02

1 920


今天完成的事:
1、使用拦截器进行需要登录才能访问页面的划分。
拦截器主要就是拦截用户的请求,并进行相应的操作,比如验证用户是否登录,先拦截请求,判断是否登录,登录状态则返回true,请求按照正常路径访问,非登录状态则返回false,重定向到指定页面。
定义拦截器主要有两个方式。
(1)自定义的Interceptor类要实现Spring的HandlerInterceptor接口,或者继承实现了该接口的实现类,比如Spring提供的抽象类HandlerInterceptorAdapter。
(2)实现Spring的WebRequestInterceptor接口,或继承实现该接口的类。
这里我是实现Spring的HandlerInterceptor接口。

SpringMVC中的拦截器是链式的调用,一个请求可以有多个拦截器,按照声明的顺序依次执行。HandlerInterceptor接口中定义了三种方法,通过这三种方法来对请求进行拦截处理的。
(1)preHandle方法,是拦截器最先被执行的方法,也可以当做是对当前请求的预处理。
在处理请求之前进行调用,也就是在controller方法调用前被调用,所以这里可以用来在访问网页前,判断用户是否登录,从而进行下一步操作。该方法返回布尔类型,返回true时,会继续调用下一个拦截器的preHandle方法,如果是最后一个拦截器就调用当前请求的controller方法。返回false时,表示请求结束,后续拦截器和controller方法都不会执行,可以重定向到指定页面。
(2)postHandle方法,在preHandle方法返回true时,当前请求被处理之后被调用,但是会在前端控制器进行视图渲染之前被调用,所以可以在这个方法中对controller处理过的ModelAndView进行处理。
这里需要注意的是,postHandle方法的调用顺序与preHandle方法是相反的,也就是先声明的拦截器preHandle方法先执行,其postHandle方法是后执行。
(3)afterCompletion方法,也是在preHandle方法返回true时被调用,但是是在整个请求结束后,视图已经渲染后,才执行,这个方法主要是进行资源清理工作。
是不是很熟悉,是不是很惊喜,拦截器其实就是一种AOP思想的体现。
拦截器和过滤器的区别。
(1)拦截器是基于java的反射机制(动态代理)实现的,可以处理所有请求的共同问题,权限验证、全局日志等。
(2)过滤器是基于函数回调来实现的,可以设置字符编码,url级别权限访问控制,过滤敏感词汇等。
拦截器只拦截请求,过滤器的范围更大,还可以进行资源过滤,执行顺序也是先进行过滤,再拦截。
在springmvc.xml中配置如下,这里是将所有请求拦截,放行登录注册、首页页面以及静态资源,需要注意的是直接放行静态资源所在文件夹不起作用,未登录状态无法显示首页的样式和图片,只能是放行静态资源的后缀才有效果。
另外尝试将拦截器配置在spring的全局配置文件中,甚至连拦截效果都没有了,百度没找到答案,搜索相关出来的都是如何配置。。

自定义拦截类,用以判断是否登录,只需要重写preHandle方法。
import com.jnshu.util.JwtUtil;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
    private static Logger logger = Logger.getLogger(LoginInterceptor.class);
    // 拦截器最先被执行的方法,也可以当做是对当前请求的预处理。
    // 返回true时,会继续调用下一个拦截器的preHandle方法,
    // 如果是最后一个拦截器就调用当前请求的controller方法。
    // 返回false时,表示请求结束,后续拦截器和controller方法都不会执行,可以重定向到指定页面。
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
        // 获取cookie
        Cookie[] cookies = request.getCookies();
        // 数组为空判断
        if ( cookies != null && cookies.length > 0 ) {
            // 遍历cookie,找token
            for (Cookie cookie : cookies) {
                // 如果有名为token的cookie,获取token值
                if (cookie.getName().equals("token") && cookie.getValue() != null) {
                    String token = cookie.getValue();
                    if(JwtUtil.parseJWT(token)){
                        return true;
                    }
                }
            }
        }
        // 重定向到首页
        response.sendRedirect("/login");
        return false;
    }
    // 在preHandle方法返回true时,当前请求被处理之后被调用,
    // 但是会在前端控制器进行视图渲染之前被调用,可以对controller处理过的ModelAndView进行处理。
    // 先声明的拦截器preHandle方法先执行,其postHandle方法是后执行。
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView mav) throws Exception {
    }
    // 在preHandle方法返回true时被调用,但是是在整个请求结束后,
    // 视图已经渲染后,才执行,这个方法主要是进行资源清理工作。
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object obj, Exception e) throws Exception {
    }
}
进入首页,没有token。

点击职业,跳转到登录页面。

zzz,xxx,登录后,跳转到首页,token也生成。


这时才能进入职业页面。

点击注销,删除cookie,即职业页面无法登录。

2、解决静态资源无法访问问题,整理代码,提交任务。
明天计划的事:
1、学习MD5加随机盐。
2、学习session存放token进行登陆拦截。
3、学习压测相关知识。
遇到的问题:
1、在拦截器中拦截所有请求,选择性放行部分请求,这里放行静态资源的文件夹,但是在未登录时,无法访问样式和图片,静态资源没有正常被放行,因为这里报错有关于css样式的问题,所以开始的查找方向弄错了,以为是css需要有所调整,后来尝试将拦截器配置注释掉,非登录状态也可以访问样式和图片,这才知道是拦截器拦截了静态资源的原因,经过查找没有直接放行某个文件夹下所有静态资源的合适的方法,只能一个一个添加相应的静态资源后缀进行拦截。结果就能可以访问了。。虽然问题解决了,但是这样挺不方便。。


收获:
1、了解了拦截器的配置、包含的方法、与过滤器的区别。
2、解决静态资源无法访问问题,但是还有待优化。
任务总结:
任务名称:JAVA=TASK5
任务耗时:11.14-11.18,请假1天,实际共耗时4天,延期。
技能脑图:
个人:
官方:
任务总结:(任务进度是否符合预期,是否延期,如果延期,原因是什么,如何避免下次继续延期)
任务延期。状态不太好,看着知识点了解的差不多了,该动手做了,就是不愿意动弹。。状态调整的有些慢,做事没有效率。
如何避免下次延期:调整好状态,累了就请假休息一下,尽量把效率提高。
脑图对比分析:
大致内容与官方的脑图差不多,就是学习的还是比较浅,没有深入了解,还需要后续学习。
任务中遇到哪些疑难问题,最终如何解决的,有哪些值得分享的收获。
(对于任务总结应该更多的描述出任务所走的弯路以及遇到的困难,不应鼓励将知识点无脑的堆砌在总结之中)
1、任务五主要是添加登录模块,通过加密来对用户安全方面进行保护,但是网上的方法太多,个有个的理解,具体怎么样才是最好的保护方式,没有定论,所以不要被网上的信息迷惑了眼睛,将各个加密方式了解后,可以自由的通过自己的理解进行相应的加密。
2、因为相应的加密解密方法都很容易理解,当然原理是很难的,理解方法的操作后,不要只是脑子里想象如何加密解密,实际动手去操作,更有助于理解。当然,如果是像我这样因为状态不好,不愿意动弹,那就好好休息下。
3、对于静态资源的读取,需要注意清理浏览器缓存,不要因为之前的某些修改放行的静态资源,导致原因的判断错误,只能感慨,缓存太强大了,任务六要好好学。。

返回列表 返回列表
评论

    分享到