过滤器的使用
[1]为什么使用过滤器?
目前遇到的问题:
A、目前解决post方式中文乱码是基于书写了baseservlet,所以我们不用在每一个servlet中去书写,
但是我们以后开发的过程中不会再去书写baseservlet ,这个时候就需要我们在每一个控制单
元方法中去书写解决中文乱码的操作。
B、目前用户在没有登陆的情况下,还是可以访问登陆成功以后的页面。
问题的共性:一直书写的是重复的代码
[2]过滤器理解示意图
[3]过滤器的应用
A.过滤器解决中文乱码
实现代码如下:
public class EncFilter implements Filter {
String enc="";
//初始化方法---执行一次
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//读取初始化参数
enc = filterConfig.getInitParameter("uu");
//读取全局参数
enc = filterConfig.getServletContext().getInitParameter("tt");
}
// 每一次请求都执行
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//【A】到达目标资源之前的处理操作
request.setCharacterEncoding(enc);
//【B】执行下一个过滤器或者目标资源
chain.doFilter(request,response);
//【C】离开服务器之前的操作
}
//销毁方法 --执行一次
@Override
public void destroy() {
}
}
web.xml文件
<filter>
<filter-name>EncFilter</filter-name>
<filter-class>com.lzj.filter.EncFilter</filter-class>
<!--初始化参数-->
<init-param>
<param-name>uu</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncFilter</filter-name>
<url-pattern>/*</url-pattern>
<!--<url-pattern>/servlet/*</url-pattern>
<url-pattern>*.do</url-pattern>-->
</filter-mapping>
<!--全局参数 可以被任何的servlet或者过滤器进行读取-->
<context-param>
<param-name>tt</param-name>
<param-value>utf-8</param-value>
</context-param>
B.过滤器实现登录控制
public class LoginConFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request= (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//[1]获得session 中的内容
Object obj = request.getSession().getAttribute("employee");
String requestURI = request.getRequestURI();
if("/sxtoa/login.jsp".equals(requestURI)||"/sxtoa/EmployeeController".equals(requestURI)){
chain.doFilter(req,resp);
}else {
if(obj==null){
response.sendRedirect("/sxtoa/login.jsp");
return;
}else {
//执行下一个过滤器或者目标资源
chain.doFilter(req,resp);
}
}
}
@Override
public void destroy() {
}
}
[注]:过滤器中使用的一些问题
问题1:多个过滤器,执行的顺序怎么确定?
答:<filter-mapping>的顺序确定执行的顺序。
问题2:每个请求和响应都要经过过滤器吗?
答:不是,是否经过过滤器,经过几个过滤器由过滤器的路径来定。
<url-pattern>/servlet/*</url-pattern>
<url-pattern>/*</url-pattern>
问题3:请求和响应时是不是分别将过滤器代码从头到尾执行一遍?
答:不是,请求时执行预处理操作,响应时执行后处理操作。
请求时过滤器的执行顺序如果是1,2,4,响应时过滤器的执行顺序4,2,1
问题4:在过滤器中能否跳转到项目的其他任意资源?
答:可以,举例:如果一个过滤器是进行权限验证,没有登录,就不让访问目标资源,直接跳转到login.jsp。
问题5:重定向和转发是否经过过滤器?
答:重定向经过;默认转发不经过,因为是服务器端跳转。