day55
过滤器
简介
过滤器filter,是处于客户端与服务器端目标资源之间的一道过滤技术技术
作用
执行地位在servlet之前,客户发送请求时,会先经过Filter,再到达目标Servlet中。
相应时,会根据执行流程再次反向执行Filter
可以解决多个Servlet共性代码的冗余问题
编写
新增一个类,实现Filter接口
编写其生命周期方法
再doFilter当中实现过滤方法
package com.saas.day55; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(filterName = "characterFilter", urlPatterns = "/*") public class CharacterFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { System.out.println("this is init method."); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); System.out.println("this is doFilter method."); // 让请求资源放行 filterChain.doFilter(request, response); } public void destroy() { System.out.println("this is destroy method."); } }filter的配置方式有两种:
注解:
注解方式配置: @WebFilter(filterName = "characterFilter", urlPatterns = "/*")
xml方式
<filter> <filter-name>characterFilter</filter-name> <filter-class>com.saas.day55.CharacterFilter</filter-class> </filter> <filter-mapping> <filter-name>characterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>注意请求的通配
/abc 代表的是具体的请求abc /* 代表的是任意请求 *.action 代表的是以action结尾的任何请求 *.jsp 任何的jsp页面
过滤器链和优先级
过滤器链
客户端对于服务器请求之后,服务器调用servlet之前会执行一组过滤器,那么这组过滤器就成为一个过滤器链
每个过滤器实现某个特定功能,当第一个过滤器的doFilter方法执行时,web服务器会创建一个代表FilterChain对象传递给该方法,在doFilter方法中,开发人员如果调用了FilterChain中的doFilter方法,则web服务器会检查FilterChain对象中是否还有其他filter,如果有,则执行第二个第三个...过滤器,否则,调用目标资源
优先级
在一个web容器中,可以开发多个过滤器,这种过滤器组合起来称之为一个Filter链
优先级:
如果为注解的话,是按照类全名称的字符串自然顺序决定
如果是web.xml配置方式,按照Filter-mapping的注册顺序,从上往下
web.xml配置方式高于注解方式
如果注解和xml同时配置,会创建多个过滤器对象,造成过滤多次
cookie
什么是cookie
cookie是在浏览器访问web服务器的某个资源是,由web服务器在HTTP响应头中附带的传送给浏览器的一小段数据
一旦web浏览器保存了某个cookie,那么它在以后访问该web服务器时,都应在HTTP请求头中将这个cookie回传给web服务器
一个cookie主要是由标识该信息的名称(name)和值(value)组成
创建cookie
代码实现
package com.saas.day55; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/addCookie") public class CookieServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 新建一个cookie对象,里面存放cookie的名值对 Cookie ck = new Cookie("myCode", "8888"); // 设置cookie的有效期,单位为秒 ck.setMaxAge(30); // 使用HttpServletResponse对象将cookie对象发送给客户端 resp.addCookie(ck); } } 通过response对象的addCookie方法将cookie的名值对存入cookie中
cookie是作用于客户端浏览器之上,即使服务器重启,也还是存在的,除非cookie失效
package com.saas.day55; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/getCookie") public class GetCookie extends HttpServlet { @Override- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 通过HttpServletRequest对象获取cookie,得到cookie数组 Cookie[] cookies = req.getCookies(); // 遍历cookie数组,动态获取我们需要的cookie那么对于的value for (Cookie c : cookies) { if (c.getName().equals("code")){ System.out.println("code" + c.getValue()); resp.getWriter().write("code" + c.getValue()); } if(c.getName().equals("myCode")){ System.out.println("myCode" + c.getValue()); resp.getWriter().write("myCode" + c.getValue()); } } } }通过HttpServletRequest对象获取cookie数组
循环cookie数组,动态获取我们需要的name进行进一步的处理