Filter可以认为是Servlet的一种“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应。使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行预处理并生成响应,最后Filter再对服务器响应进行后处理。
Filter有如下几个用处。
在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
Filter有如下几个种类。
用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求。
日志Filter:详细记录某些特殊的用户请求。
负责解码的Filter:包括对非标准编码的请求解码。
能改变XML内容的XSLT Filter等。
Filter可以负责拦截多个请求或响应;一个请求或响应也可以被多个Filter拦截。
创建一个Filter只需两个步骤:
1.创建File类:
package com.symapgis.filter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
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;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import com.google.gson.Gson;
/**
* Servlet Filter implementation class TokenFilter
*/
public class TokenFilter implements Filter {
/**
* Default constructor.
*/
public TokenFilter() {
// 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 servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
String token = request.getHeader("token");
String url = request.getRequestURI();
if(url.endsWith("login.do") || url.endsWith("getTitle.do")){
chain.doFilter(servletRequest, servletResponse);
}
else{
if(token == null || token.isEmpty()){
returnJson(servletResponse, "403");
return;
}
else{
//查询数据库判断Token是否存在
try {
if(tokenInDb(token)){
chain.doFilter(servletRequest, servletResponse);
}
else{
returnJson(servletResponse, "403");
return;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private boolean tokenInDb(String token) throws Exception{
//判断token是否存在
HttpClient client = new HttpClient();
PostMethod method = null;// post 方式 get 方式 GetMethod gMethod
String result = "";
try {
method = new PostMethod("http://localhost:8081/human_resource/admin/getToken.do");
method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
method.setParameter("token", token);// 设置参数
client.executeMethod(method);
if (method.getStatusCode() == HttpStatus.SC_OK) {// 响应成功
result = method.getResponseBodyAsString();// 调用返回结果
if(result.equals("cunzai")){
return true;
}else{
return false;
}
} else {// 不成功组装结果
Map<String, Object> map = new HashMap<String, Object>();
Gson gson = new Gson();
map.put("success", false);
result = gson.toJson(map);
}
} catch (Exception e) {
}
return false;
}
private void returnJson(ServletResponse response,String result){
PrintWriter writer=null;
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
try{
writer=response.getWriter();
writer.print(result);
}catch(IOException e){
}finally{
if(writer!=null){
writer.close();
}
}
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
2.配置web.xml
<filter>
<filter-name>TokenFilter</filter-name> //类名
<filter-class>com.symapgis.filter.TokenFilter</filter-class> //路径
</filter>
<filter-mapping>
<filter-name>TokenFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>