过滤器说白了就是一个继承Filter的类.
某些java代码文件运行之前如果想做统一的操作,可以通过过滤器进行实现.
比如想对每个java代码文件进行编码:
创建一个类集成Fileter类
package com.lm.filter;
import java.io.IOException;
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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet Filter implementation class EncodeFilter
*/
public class EncodeFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
HttpServletRequest request2 = (HttpServletRequest) request;
HttpServletResponse response2 = (HttpServletResponse) response;
request2.setCharacterEncoding("utf-8");
response2.setContentType("text/html;charset=utf-8");
// pass the request along the filter chain
chain.doFilter(request2, response2);
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
之后在web.xml里面进行如下配置:
<filter>
<display-name>EncodeFilter</display-name>
<filter-name>EncodeFilter</filter-name>
<filter-class>com.lm.filter.EncodeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
其中/*是代表全部(每一个)的java代码文件运行之前会先从此过滤器类走一遍,进行编码.
下面是课堂的笔记(有一点乱)
Filter:
1.概念: servlet2.3版本出现的,servlet规范 servlet,listener ,filter
进行过滤的对象
通过服务器的动态资源和静态资源的请求和响应进行拦截(过滤器)
2.作用:
通过服务器的动态资源和静态资源的请求和响应进行拦截(过滤器)
3.相关api:
FilterChain:过滤器链
FilterConfig:过滤器的配置
方法doFilter(request,response) 放行
3.入门使用:
3.1 定义一个类实现Filter接口重写3个
3.2 在web.xml中注册
<filter>
<filter-name></filter-name>
<filter-class></filter-class>
</filter>
<filter-mapping>
<filter-name></filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.生命周期:
init(FilterConfig config) doFilter() destroy()
在web.xml里面:
<filter>
<filter-name>myFilter01</filter-name>
<filter-class>MyFilter01</filter-class>
<init-param>
<param-name>ww</param-name>
<param-value>test</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myFilter01</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
上面的代码意思是:有一个MyFilter01的过滤器(java类),配置一个过滤器变量名称:myFilter01
这个拦截器(过滤器)可以拦截所有的程序,如果运行某个Servlet类,或者是jsp等,就会拦截住,不会让其继续执行.
(注意:可以有好多个拦截器,至于当运行对应的程序时,哪个拦截器会先拦截见下面的优先级高低.
配置参数init-param
获取值config.getInitParameter(name);配置文件以键值对的方式进行配置的,这样会获取到对应的值test
5.
过滤器的路径:
5.1 <url-pattern>/*</url-pattern> 拦截所有
5.2 <url-pattern>/具体映射路径(示例:指定的servlet路径或者是jsp)</url-pattern>
拦截指定的路径(完全匹配)绝对匹配
5.3 <url-pattern>*.do(拓展名)</url-pattern> 模糊匹配, 只拦截jsp文件
5.4 <url-pattern>/list.do(拓展名)</url-pattern>
5.5 <servlet-name></servlet-name> 根据servlet的名称来拦截指定的servlet
优先级高低: <url-pattern>比<servlet-name>优先级高
只有url-pattern的优先级: 按照在web.xml中的注册顺序来决定
Servlet映射的路径:
1. <url-pattern>/具体名</url-pattern>
2. <url-pattern>*.do</url-pattern>
3. <url-pattern>/具体名.do</url-pattern>
6.全局编码过滤 给所有页面设置编码。
7.自动登录:
login.jsp-- LoginServlet
1.获取请求参数
对密码进行处理:
数据库中的密码就是加密过的
Update user set pwd=MD5(pwd) where uuid= 1;
登录的时候得把输入的密码进行加密后去数据库查询
MD5Utils
2.调用业务逻辑(service层)登录 --- 业务逻辑调用dao层
3.登录成功:Servlet
记住密码
勾选了自动登录的框,下一次才自动登录
1.保存用户名和密码(cookie) 用户名和密码字符串拼接,逗号分割不行,换成&
把cookie的信息响应给浏览器 response.addCookie(cookie);
2.登录的状态 (session)
request.getSession().setAttribute("user",user);
4. filter
//如果是进入到登录页面(login.jsp或者LoginServlet),
手动登录,完善,在登录页面需要显示用户名和密码并且调用service层登录
如果是非登录页面,且状态是未登录, 直接获取cookie存储的信息,
直接调用service登录(filter做的)
session存储用户的状态信息 cookie(用户信息,放置信息泄漏要加密)
登录失败,获取错误信息存储到域对象传递给当前页面进行展示(EL表达式)