Filter
- 过滤器: 对用户请求进行预处理
- 对Web应用进行资源控制
- 请求与结果都需要通过过滤器
- 流程图:
实现Filter步骤
- 实现Filter接口
- 配置Filter
- 实现接口&配置示例:
package com.eric.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;
public class HelloFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
Filter.super.init(config);
}
@Override
//实现过滤操作
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
//执行Servlet前
System.out.println("before servlet");
System.out.println("hello filter");
//调用下一个Filter
chain.doFilter(req, resp);
//执行Servlet后
System.out.println("after servlet");
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
<!-- 配置filter -->
<filter>
<filter-name>helloFilter</filter-name>
<filter-class>com.eric.filter.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>helloFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- 设置过滤内容 -->
</filter-mapping>
Filter生命周期
- Filter在服务器启动时,进行实例化和初始化,由服务器管理
权限过滤
package com.eric.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;
public class AuthorizationFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
/*
* 检查用户是否登陆
* 登陆,跳转到下一个Filter
* 未登陆,跳转到登陆页面
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
/*
* 登陆失败需要让login.jsp通过Filter
* 避免陷入重定向循环
* 难点: 需要使部分页面,避免被过滤器过滤掉
* login.jsp / login
*/
//获得请求的页面信息
// String path = req.getRequestURL().substring(req.getRequestURL().lastIndexOf("/") + 1);
// System.out.println(path);
//
// if("login.jsp".equals(path) || "login".equals(path)) {
// //避免login.jsp再次被过滤,陷入死循环
// chain.doFilter(request, response);
// return ;
// }
// Object obj = req.getSession().getAttribute("user");
// if(obj == null) {
// resp.sendRedirect("login.jsp");
// return ;
// }
// chain.doFilter(request, response);
/* 优化后的代码
* 从session中读取用户信息,如果没有信息,则说明用户没有登陆,有一下两种情况需要处理
* 第一种:没有登陆就去请求其他资源(这些资源要求用户登陆)
* 直接跳回登陆页面
* 第二种:没有登陆,现在去登陆: login/login.jsp
* 让其进行登陆验证
* 如果从session中获取到用户信息,说明用户已经登陆,不需要过滤
*/
Object obj = req.getSession().getAttribute("user");
if(obj == null) {
String path = req.getRequestURL().substring(req.getRequestURL().lastIndexOf("/") + 1);
//未登陆,切访问path不是login
if(!("login.jsp".equals(path) || "login".equals(path))) {
resp.sendRedirect("login.jsp");
return ;
}
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
- 乱码过滤
package com.eric.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
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.HttpServletRequestWrapper;
public class CharacterEncodingFilter implements Filter {
String encoding = null;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
encoding = filterConfig.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if(encoding == null || encoding == "") {
encoding = "utf-8";
}
request.setCharacterEncoding(encoding); // 只能解决post请求
response.setCharacterEncoding(encoding);
chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) request) {
@Override
//重新封装请求对象
public String getParameter(String name) {
if("get".equals(this.getMethod().toLowerCase())) {
//如果方法为get提交方式,则转换编码格式
String value = super.getParameter(name);
try {
//转换编码格式
return new String(value.getBytes("iso-8859-1"), encoding);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return super.getParameter(name);
}
} , response);
}
@Override
public void destroy() {
}
}