学习心得
在浏览器禁用cookie的情况下,HTTPSession仍可以用于会话管理机制
转发调用的是HttpServletRequest对象中的方法
转发时浏览器只请求一次服务器。
重定向时,浏览器中的地址栏url会发生变化,重定向调用的是HttpServletResponse对象中的方法
心情
今天学习的是关于过滤器的知识,转发是服务器行为,重定向是客户端行为。过滤器很重要,有一些顺序方面的东西有一些迷茫
掌握情况:一小般
学习总结
字符集过滤器
HttpServletResponse response = (HttpServletResponse) servletResponse; servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8");
给response添加响应头,text/html,后台向前台输出字符串的时候当后台向前台输出的是json格式,不需要设置这个。
response.addHeader("content-type","text/html;charset=utf-8");
放行
filterChain.doFilter(servletRequest,servletResponse);
过滤:
这里面的servletRequest和servletResponse实际上就是HttpServletRequest和HttpServletResponse的对象
由于在形参处声明的是父类类型,发生了向上转型,
父类 父类对象 = new 子类;
父类对象.方法
ServletResponse和HttpServletResponse
子类对象调父类的方法,随便调。
父类对象想要调子类的方法,不可能,除非再向下转型。
ServletResponse没有sendRedirect
HttpServletResponse有sendRedirect
sendRedirect是子类的独有的方法
需要向下转型,向下转型是有风险的。
记住一个事:
只要地址栏不发生改变,request永远是同一个,请求转发
初始化
在创建Filter对象,在servlet容器(tomcat)加载当前web应用(当前工程)被调用
只执行一次。当前Filter的初始化操作,Filter和Servlet都是单例的。
FilterConfig类似于ServletConfig,获取初始化参数。
主要过滤请求的方法(核心方法)
真正Filter要处理的逻辑代码需要写在此方法里,每次拦截都会调用这个方法。
ServletRequest:实际上当请求来的时候,实例化的还是HttpServletRequest
ServletResponse:实际上当请求来的时候,实例化的还是HttpServletResponse
FilterChain:过滤器链,一个项目中是可以有多个过滤器的,会形成一个链,当前过滤器把请求传递给下一个过滤器
Filter的执行顺序:
filter-mapping的上下顺序有关
练习:
登录:login.html发起请求到login.do
在过程中,两个过滤器,
UsernameFilter,负责判断用户名,如果用户名正确,则把请求放行到下一个过滤器,否则,回到登录页。
PasswordFilter,负责判断密码,如果密码正确,就跳转到success.html,否则,回到登录页。
username:
public class Filter01_UsernameFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("UsernameFilter...."); filterChain.doFilter(servletRequest,servletResponse); // String username = servletRequest.getParameter("username"); // if(Objects.equals(username,"admin")){ //// 用户名正确,当前过滤器放行 // filterChain.doFilter(servletRequest,servletResponse); // return; // } // HttpServletResponse response = (HttpServletResponse) servletResponse; // HttpServletRequest request = (HttpServletRequest) servletRequest; // response.sendRedirect(request.getContextPath() + "/afternoon/login.html"); } }
password:
public class Filter02_PasswordFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("PasswordFilter..."); filterChain.doFilter(servletRequest,servletResponse); // HttpServletRequest request = (HttpServletRequest) servletRequest; // HttpServletResponse response = (HttpServletResponse) servletResponse; // // String password = request.getParameter("password"); // if(Objects.equals(password,"123456")){ // response.sendRedirect(request.getContextPath() + "/afternoon/welcome.html"); // return; // } // response.sendRedirect(request.getContextPath() + "/afternoon/login.html"); } }
html页:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="../login2.do" method="post"> 账号:<input type="text" name="username"> 密码:<input type="password" name="password"> <input type="submit" value="登录"> </form> </body> </html>
标签:02,09,HttpServletResponse,servletResponse,html,2022,过滤器,servletRequest,response From: https://www.cnblogs.com/wxp0909/p/16651275.html