过滤器及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个)

config jsp的配置信息
page jsp自身对象(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个

pageScope page作用域 类型是map集合
requestScope request作用域 类型是map集合
sessionScope 会话作用域 类型是map集合
applicationScope 应用作用域 类型是map集合

param 代表所有请求参数集合 类型是map集合
paramValues 代表所有请求参数集合(用来获取多值参数)

cookie 代表请求中所有的cookie集合 map类型
key是cookie的name, value是cookie对象(name,value)

header 获取请求头的内容 类型是map集合f
key是请求头中key的名称
headerValues 获取请求头的内容(用来获取多值)
initParam 每个jsp可以配置一个初始化参数
initParam.key
pageContext

猜你喜欢

转载自blog.csdn.net/sinat_42759524/article/details/82855117