JavaWeb学习打卡-Day4-会话技术、JWT、Filter、Interceptor
会话技术
- 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
- 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
会话跟踪方案:
- 客户端会话跟踪技术:Cookie
- 优点:是HTTP协议中支持的技术,是官方提供的。
- 缺点:
- 移动端APP无法使用Cookie。
- 不安全,用户可以自己禁用Cookie。
- Cookie不能跨域。
- 服务端会话跟踪技术:Session
- 优点:存储在服务端,安全
- 缺点:
- 服务器集群环境下无法直接使用Session。
- Cookie的缺点。
- 令牌技术
- 优点:
- 支持PC端、移动端。
- 解决集群环境下的认证问题。
- 减轻服务器端存储压力。
- 缺点:需要自己实现。
- 优点:
JWT
JWT简介
- 全称:JSON Web Token
- 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。
- 组成:
- Header(头):记录令牌类型,签名算法等。采用Base64编码。例如:{“alg”:“HS256”,“type”:“JWT”}
- Payload(有效载荷):携带一些自定义信息,默认信息等。采用Base64编码。例如:{“id”:“1”,“username”:“Tom”}
- Signature(签名):通过指定的签名算法,将header、payload,再加入指定秘钥计算而来。防止Token被篡改,确保安全性。
JWT场景:登录认证
- 令牌生成:登录成功后,生成JWT令牌,并返回给前端。
- 令牌校验:后续每个请求,都要携带JWT令牌。在请求到达服务端后,对令牌进行统一拦截、校验。JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的,如果JWT令牌解析校验时报错,则说明JWT令牌被篡改或失效了,即令牌非法。
过滤器(Filter)
介绍
- Filter 过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
- 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
- 过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。
入门
- 定义Filter:定义一个类,实现 Filter接口,并重写其所有方法。
- 配置Filter:Filter类上加 @Webfilter 注解,配置拦截资源的路径。引导类(启动类)上加 @ServletComponentScan 开启Servlet组件支持。
@WebFilter(urlPatterns = "/*") public class DemoFilter implements Filter{public void init(FilterConfig filterConfig) throws ServletException {//初始化方法,Web服务器启动,创建Flter时调用,只调用一次。Filter.super.init(filterConfig);}public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain){//拦截到请求时,调用该方法,可调用多次System.out.println("拦截方法执行,拦截到了请求..");chain.dofilter(request,response);}public void destroy(){//销毁方法,服务器关闭时调用,只调用一次Filter.super.destroy();} }
Filter拦截路径
拦截路径 | urlPatterns值 | 含义 |
---|---|---|
具体路径 | /login | 只有访问 /login 路径时,才会被拦截 |
目录拦截 | /emps/* | 访问/emps下的所有资源,都会被拦截 |
拦截所有 | /* | 访问所有资源,都会被拦截 |
过滤器链
- 一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链
- 注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序。
拦截器(interceptor)
介绍
- 是一种动态拦截方法调用的机制,类似于过滤器。
- 是Spring框架中提供的,用来动态拦截控制器方法的执行。
- 用来拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。
入门
- 定义拦截器,实现HandlerInterceptor接口,并重写其所有方法。
@Component public class LoginCheckInterceptor implements HandlerInterceptor {@Override //目标资源方法执行前执行,返回true:放行,返回false:不放行。public boolean preHandle (HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {System.out.println("preHandle ...");return true;}@Override //目标资源方法执行后执行public void postHandle(HttpServletRequest req, HttpServletResponse resp, Object handler, ModelAndView modelAndView){System.out.println("postHandle ...");}@Override //视图渲染完毕后执行,最后执行public void afterCompletion (HttpServletRequest req, HttpServletResponse resp, Object handler, Exception ex){System.out.println("afterCompletion ...");} }
- 注册拦截器
@Configuration public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry){registry.addInterceptor(loginCheckInterceptor).addPathPatterns ("/**");} }
拦截路径
执行流程
Filter与Interceptor
- 接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
- 拦截范围不同:Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源。