JavaWeb三大技术之Filter
来源:互联网 发布:网络棋牌信息 编辑:程序博客网 时间:2024/06/08 01:03
JavaWeb三大技术之Filter
主要通过两个案例介绍Filter
案例一:自动登录
案例二:统一GET和POST中文乱码的处理
案例一:自动登录
一,需求分析
在完成登录时,如果用户勾选“自动登录”,将在下次登录时,自动完成登录功能,减少用户再次输入账号和密码繁琐的操作。此功能是对用户的操作体验进行优化,本案例将带领大家完成此功能。效果图如下:
二,技术分析
1.Cookie
利用Cookie记住用户名和密码.
2.Filter
2.1什么是filter
Filter:一个实现了特殊接口的Java类.实现对请求资源的过滤的功能.过滤器是一个运行在服务器的程序,优先于Servlet或者jsp之前执行. 过滤器是Servlet技术中最为实用的技术.
2.2过滤器的作用
对目标资源(Servlet,jsp)进行过滤.应用场景:自动登录,解决网站乱码,过滤敏感字符...
2.3filter入门
- 编写一个类实现过滤器的接口(javax.servlet.Filter)
- 在web.xml里面,对过滤器进行配置
三,思路分析
- 在LoginServlet,如果登录成功
判断用户是否选中了自动登录 if(){}
如果勾选了: 把用户名和密码存入cookie里面
如果没勾选:删除cookie - 创建LoginFilter: 路径: /*
获得目标cookie(存的就是用户名和密码)
判断目标cookie是否为空:
不为空:取出用户名和密码,调用业务进行登录操作. 如果登录成功,把返回的user存到session里面
放行
四,代码实现
LoginServlet
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //1.获得用户名和密码 String username = request.getParameter("username"); String password = request.getParameter("password"); //2.调用业务,进行登录 LoginService loginService = new LoginService(); User user = loginService.login(username,password); //3.判断用户是否为空 if(user != null){ //登录成功 //response.getWriter().print("Login Success..."); String auto = request.getParameter("auto"); if(auto != null && "ok".equalsIgnoreCase(auto)){ System.out.println("用户勾选了自动登录..."); Cookie cookie = new Cookie("autoLogin", username+"-"+password); cookie.setPath(request.getContextPath()); cookie.setMaxAge(60*60*24); response.addCookie(cookie); }else{ Cookie cookie = new Cookie("autoLogin", ""); cookie.setPath(request.getContextPath()); cookie.setMaxAge(0); response.addCookie(cookie); } request.getSession().setAttribute("user", user); response.sendRedirect(request.getContextPath()+"/WEB01/index.jsp"); }else{ //登录失败 response.getWriter().print("Login Fail..."); } } catch (SQLException e) { e.printStackTrace(); //登录失败 response.getWriter().print("Login Fail..."); }}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);}
}
LoginFilter
package com.it.web.filter;import java.io.IOException;import java.sql.SQLException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.it.bean.User;import com.it.service.LoginService;import com.it.utils.CookieUtils;/**
Servlet Filter implementation class LoginFilter
*/
public class LoginFilter implements Filter {/**
- Default constructor.
*/
public LoginFilter() {
// TODO Auto-generated constructor stub
}
/**
- @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
@see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;User exitUser = (User) request.getSession().getAttribute(“user”);
if (exitUser == null) {
// 获得cookie
Cookie[] cookies = request.getCookies();
Cookie cookie = CookieUtils.getTargetCookie(cookies, “autoLogin”);
if (cookie != null) {
String[] values = cookie.getValue().split(“-“);
String username = values[0];
String password = values[1];LoginService loginService = new LoginService(); try { User user = loginService.login(username, password); if (user != null) { request.getSession().setAttribute("user", user); } } catch (SQLException e) { e.printStackTrace(); }}
}
chain.doFilter(request, response);
}
/**
- @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
- Default constructor.
五,总结
1.过滤器的生命周期
1.1Filter生命周期:过滤器从创建到销毁的过程
1.2生命周期方法
init(FilterConfig):初始化doFilter(ServletReqeust req,ServletResponse resp,FilterChain chain):执行过滤的方法 destroy():销毁
1.3Filter生命周期描述:
在项目启动的时候,服务器创建filter的对象,调用init方法实现初始化操作每当请求来的时候,服务器获取一个线程,执行dofilter方法,实现过滤的逻辑当服务器移除filter的时候或者服务器正常关闭的时候,服务器调用destroy方法,实现销毁操作
2.FilterConfig
filter的配置对象
3.Filter的url-pattern的配置
完全目录匹配:以"/"开始 例如:/demo1 /demo2 /aa/bb/demo3目录匹配:以"/"开始 以*结束 .扩展名匹配:以"*"开始 例如: *.jsp *.do注意:一个路径只能对应一个Servlet,但一个路径可以对应多个Filter
4.FilterChain:过滤链
过滤器链作用:当一个filter收到请求的时候,调用chain.doFilter才可以访问下一个匹配的filter,若当前的filter是最后一 个filter,调用chain.doFilter才能访问目标资源多个filter的执行顺序是由web.xml中filter-mapping的位置决定的.
5.Filter的其它配置(filter-mapping的子标签)
5.1servlet-name
指定具体过滤那个servlet的
5.2dispatcher
告知服务器如何拦截.有如下四种拦截类型
- REQUEST:默认值,只过滤从浏览器发送过来的请求
- FORWARD:只过滤转发过来的请求 —->转发服务器内部
了解:
- INCLUDE:只过滤包含过来的请求
ERROR:只过滤错误过来的请求
知识点补充:全局的统一错误页面,location转发到特定的页面
404
/404.jsp
案例二:统一GET和POST中文乱码的处理
一,需求分析
在整个网站中,可能会有get请求或post请求向服务器提交参数.参数中往往有中文信息.在后台每个Servlet中都需要去处理乱码.我们想做的是:无论get请求或者是post请求提交到Servlet中.就可以直接调用getParameter方法将乱码处理好.
二,技术分析
1.Filter的使用
在到达目标资源之前对request中的getParameter方法进行增强
2.增强一个类中的某个方法
- 继承 :能够控制这个类的构造.
- 装饰者:被增强的对象和增强的对象实现相同的接口,在增强对象中获得到被增强对象的引用.
- 动态代理:这个类实现了接口即可.
三,思路分析
创建一个CodeFilter, 路径是/*
定义一个类 继承HttpServletRequestWrapper
- 重写getParameter(String name)方法
获得请求方式 getMethod()
判断是get还是post请求,处理不同方式的乱码 - 在CodeFilter的doFilter方法里面,创建增强的Request
四,代码实现
CodeFilter
public class CodeFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { System.out.println("接收到了请求..."); HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; MyRequest myRequest = new MyRequest(request); chain.doFilter(myRequest, response);}@Overridepublic void destroy() {}
}
- JavaWeb三大技术之Filter
- JavaWeb三大组件之Filter
- javaweb三大组件之Filter(一)
- javaweb三大技术点之servlet
- JavaWeb三大技术之Listener
- Javaweb三大组件Servlet、Filter、Listener
- javaWeb三大器之过滤器:Filter
- JavaWeb三大组件(Servlet、Filter、Listener)
- javaweb 三大组件之Severlet
- JavaWeb三大组件之Listener
- JAVAWEB三大组件之过滤器
- javaweb三大组件之Servlet
- javaweb 三大组件之Severlet
- JavaWeb三大框架之---struts2详解
- JavaWeb三大组件之Servlet
- javaweb之Filter详解
- javaweb之Filter详解
- javaweb之Filter详解
- POJ 1617
- 前端的小玩意(16)——利用setter和getter实现数据校验
- STL VECTOR方法
- Windows下使用CMD命令复制多层级目录
- python 多线程 实现端口扫描
- JavaWeb三大技术之Filter
- Python学习笔记 5
- JavaScript—在嵌套的内部函数中调用外部this的方法
- mysql存储过程查询结果循环遍历 判断 赋值 游标等基本操作
- BeautifulSoup的基本用法
- 导入导出excel工具类地址
- 最容易入门的JVM讲解
- Codeforces Round #426 (Div. 2) A B C D E
- 省市(中国大学)二级联动的精髓写法