spring filter拦截器配置

spring filter拦截器配置

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值