使用过滤器将页面展示分页实现,自动登录

本文深入解析Servlet过滤器的概念、编写步骤、匹配路径规则及应用场景,包括字符编码、登录检查和自动登录等,同时介绍密码加密处理技术和JSP作用域。

1. 过滤器

问题:设置解码字符集时,以下的代码出现在了多处servlet中,
要求:希望避免出现重复代码
request.setCharacterEncoding("utf-8");

2. 概念

Filter 过滤器
可以对请求(响应)进行过滤

请求 --> 过滤器1 --> 过滤器2 --> … --> 过滤器n --> 目的地(Servlet, jsp)

3. 编写过滤器的步骤

  1. 实现Filter接口
  2. 在类上添加@WebFilter(urlPattern=“要过滤的目标路径”)
  3. 在doFilter方法中控制请求是否前进到下一个过滤器
filterChain.doFilter(request, response); // 调用此方法,表示请求继续前进,不调用,请求就停止不前了

4. 匹配路径的三种写法

  1. 精确匹配:目标路径是过滤器路径就是什么
    例如: “/s1”, “/s2” …
  2. 前缀匹配:
    例如:有两个servlet,路径分别是 /user/s1, /user/s2
    过滤器的匹配路径就可以写为: /user/ *

/ * 表示匹配此应用程序中所有路径

  1. 后缀匹配:
    *.后缀
    注意: 后缀匹配不要以/开头, 精确匹配和前缀匹配需要以/开头

*.jsp 表示在请求到达所有jsp之前,经过此过滤器

5. 多个过滤器

使用@WebFilter去控制匹配路径时,多个过滤器都匹配目标,执行顺序和过滤器类名有关。
按同一个目录下类名的字母顺序排序

6. 过滤器的应用

应用1: 字符编码过滤器
在过滤器中统一调用request.setCharacterEncoding方法
应用2: 登录检查

HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpSession session = request.getSession();
// 检查是否有登录标记
if(session.getAttribute("isLogin") == null) { // 如果没有找到
    request.getRequestDispatcher("/login.jsp").forward(request, servletResponse);
    return;
} else { // 找到登录标记, 放行请求,让请求继续前进
    filterChain.doFilter(request, servletResponse);
}

应用3: 自动登录

  1. 过滤器
  2. cookie (把用户名和密码的信息记录在cookie)

7. 密码的加密处理

散列技术(签名技术)
明文 密文
123456 ==> e10adc3949ba59abbe56e057f20f883e
md5 算法 16字节
sha256 算法

特点1:运算不可逆
特点2:运算的结果长度固定
特点3:原始内容一样,运算的结果是一样的

8. jsp 隐式对象(9个)

对象描述
configjsp的配置信息
pagejsp自身对象(this)
exception异常对象(isErrorPage=true)
response响应
out响应字符流
pageContext页面作用域
request请求作用域 变量类型 HttpServletRequest
session会话作用域 (同一个客户端的多次请求) HttpSession
application应用作用域 变量类型 ServletContext (上下文)
他们都有如下方法
.setAttribute("名", 值);   // 设置
Object 值 = .getAttribute("名"); // 获取
Object 值 = .removeAttribute("名"); // 删除

作用域(Scope)

<%// 向page作用域存入内容
//    pageContext.setAttribute("name", "张三"); // 同一页面中的信息
    request.setAttribute("name", "李四");    // 一次请求有效的信息(例如servlet存入结果,jsp获取结果)
    session.setAttribute("name", "王五"); // 每个用户(浏览器)独有的信息(例如购物车信息)
    application.setAttribute("name", "赵六"); // 适合放全局信息(城市信息, 类别信息)
    %>

    <!-- 从page作用域获取内容-->
    <%= pageContext.getAttribute("name")%>
    <!--  从page作用域获取内容(推荐) -->
    ${pageScope.name}

    <!-- 从request作用域取-->
    <%= request.getAttribute("name")%>
    <!-- 从request作用域取(推荐)-->
    ${requestScope.name}

    <!-- 从session作用域取值 -->
    <%= session.getAttribute("name")%>
    <!-- 从session作用域取值(推荐) -->
    ${sessionScope.name}

    <!-- 从application作用域取值 -->
    <%= application.getAttribute("name")%>
    <!-- 从application作用域取值(推荐) -->
    ${applicationScope.name}

    <hr/>
    <!-- 在el表达式取作用域变量时,不加前缀,先搜索pageScope, 再搜索requestScope, 继续搜索sessionScope, 再搜索applicationScope-->
    ${name}

9. el表达式中的隐式对象

11个

对象描述
pageScopepage作用域 类型是map集合
requestScoperequest作用域 类型是map集合
sessionScope会话作用域 类型是map集合
applicationScope应用作用域 类型是map集合
param代表所有请求参数集合 类型是map集合
paramValues代表所有请求参数集合(用来获取多值参数)
cookie代表请求中所有的cookie集合 map类型 key是cookie的name, value是cookie对象(name,value)
header获取请求头的内容 类型是map集合, key是请求头中key的名称
headerValues获取请求头的内容(用来获取多值)
initParam每个jsp可以配置一个初始化参数,initParam.key
pageContext页面作用域
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

phial03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值