学习感受
今天学习了过滤器,感觉过滤器并不是很难理解。过滤器就是一个在请求的时候需要对请求进行预处理,然后到达服务器,在服务器得到响应之后,再进行后处理的一个过滤器。
构建过滤器的一般步骤
构建过滤器一般分为两步,第一步,实现过滤器类,主要是实现doFilter方法,第二步,在web.xml文件注册过滤器。
过滤器简单实例
下面,我们就两个简单的过滤器进行实现,一个是解决中文乱码问题,一个是解决用户登录的安全权限问题。 中文乱码问题:
public class CharacterEncodingFilter implements Filter{
private FilterConfig config;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding(config.getInitParameter("charset"));
//请求拦截处理完成之后,要调用chain对象的doFilter方法告诉服务器请求拦截处理已经完成了
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
public FilterConfig getConfig() {
return config;
}
public void setConfig(FilterConfig config) {
this.config = config;
}
}
其次,我们在web.xml文件进行注册:
<!-- 注册过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>filter.CharacterEncodingFilter</filter-class>
<!-- 配置过滤器的初始化参数 -->
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- 拦截映射配置,指定过滤器对哪些请求进行过滤 -->
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
下面,我们进行下一个过滤器,解决用户登录安全权限问题:
package 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 SessionFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//做一个类型转换,将request转换成HTTPServletRequest的对象
HttpServletRequest hrequest = (HttpServletRequest)request;
HttpServletResponse hresponse = (HttpServletResponse)response;
//判断用户session中是否有用户的登录名称来判断用户是否进行登录操作
String loginUser = (String)hrequest.getSession().getAttribute("loginUser");
//如果值为null的话,说明用户没有登录,做一个强制的重定向,转到登录界面
if(loginUser == null) {
hresponse.sendRedirect(hrequest.getContextPath()+"/index.jsp?flag=1");
return;
}else {
chain.doFilter(hrequest, hresponse);
return;
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
web.xml文件注册过滤器
<!-- 注册过滤器 -->
<filter>
<filter-name>sessionFilter</filter-name>
<filter-class>filter.SessionFilter</filter-class>
</filter>
<!-- 拦截映射配置,指定过滤器对哪些请求进行过滤 -->
<filter-mapping>
<filter-name>sessionFilter</filter-name>
<url-pattern>/message.jsp</url-pattern>
</filter-mapping>