filter拦截器的简单使用

     在很多系统中都使用过拦截器,拦截器大多用在登陆和日志处理方面,那么现在就以登陆为例子,简单介绍下拦


截器。


一、功能:


    它使用户可以改变一个request和修改一个response.Filter 不是一个servlet,它不能产生一个response,它能


够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response.换种说法,


filter其实是一个“servletchaining“(servlet 链)


二、组成:


    配置文件

 

    三个方法:

1void init(Filter Config Config)用于完成filter的初始化


2woid destory用于filter销毁之前,完成某些资源的回收


3.void doFilter(ServletRequest request, ServletResponse response,FilterChain chaim);实现过滤功能,该


方法就是每个请求及响应增加的额外处理。)

 

filter链:


执行filter的顺序,一个项目中可以执行多个filter,并且每个filter有不同的执行顺序,这些具体顺序的执行在配


置文件中进行配置。

 

Web.xml中配置filter


<!-- 定义Filter --> 
<filter> 
    <!-- Filter 的名字 --> 
    <filter-name>security</filter-name> 
    <!-- Filter 的实现类 --> 
	<filter-class> test.filter.SecurityFilter</filter-class>
</filter> 
<!-- 定义Filter 拦截地址 --> 
<filter-mapping> 
    <!-- Filter 的名字 --> 
    <filter-name> security </filter-name> 
    <!-- Filter 负责拦截的URL --> 
    <url-pattern>/security/*</url-pattern> 
</filter-mapping>

小例子:

<filter>
	<filter-name>LoginFilter</filter-name>
	<filter-class>com.voiinnov.puhuilicai.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>LoginFilter</filter-name>
	<url-pattern>/ssl/*</url-pattern> 
	<!-- <url-pattern>*</url-pattern> -->
</filter-mapping> 


Filter实现类;
这里以登陆为例,

package com.voiinnov.puhuilicai.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.voiinnov.puhuilicai.common.Constants;
import com.voiinnov.puhuilicai.entity.CustUser;

/**
 * 
 * @Description: 登录filter
 * @author jingjiwu
 * @date 2014年8月25日 下午6:57:25
 */
public class LoginFilter implements Filter {

	private NotAuthUrl notAuthUrl = null;
	
	public LoginFilter(){
	}
	
	
	public void init(FilterConfig filterConfig) throws ServletException {
        ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext());  
        notAuthUrl = (NotAuthUrl) ctx.getBean("notAuthUrl");
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;  
        HttpServletResponse res = (HttpServletResponse) response;  
        HttpSession session = req.getSession(true);
        String preUrl = (String)session.getAttribute("preUrl");
    	String logUrl = (String)session.getAttribute("logUrl");
    	CustUser user = (CustUser) session.getAttribute(Constants.USER); 
    	String type = req.getHeader("X-Requested-With");
        String url = ((HttpServletRequest)request).getRequestURI();
        if(user==null && url.contains("/ssl/") && !isNotloginUrl(url)){
        	if(StringUtils.isNotBlank(type) && type.equalsIgnoreCase("XMLHttpRequest")){
        		res.setHeader("sessionstatus", "timeout");  
        		res.sendError(518, "session timeout.");  
        	}else{
        		String purl = req.getRequestURL().toString();
            	if (!purl.contains("login")) {
            		preUrl=purl;
            		if (null!=req.getQueryString()) {
            			preUrl= preUrl+"?"+req.getQueryString();
    				}
    			}
            	session.setAttribute("preUrl", preUrl);
            	session.setAttribute("logUrl", logUrl);
            	logUrl = "http://"+req.getHeader("Host")+req.getContextPath()+"/index.htm?isFilter=yes";
       		 	res.sendRedirect(logUrl);
       		 	return;
        	}
        }else{
        	if(null!=user){
        		Long loginTime = (Long) session.getServletContext().getAttribute(user.getUserName());
        		if(loginTime!=null){
        			if(user.getLoginTime()<loginTime){
        				session.removeAttribute("user");
        				System.out.println("session remove");
        				String login = req.getContextPath() + "/index.htm";
	                 	res.sendRedirect(login);
	                 	return;
        			}
        		}
        		if(StringUtils.isNotBlank(preUrl)){
        			session.removeAttribute("logUrl");
        			session.removeAttribute("preUrl");
        			if(user.getCustType()==1 && preUrl.indexOf("ssl/account/toCenter")>1){
        				preUrl = preUrl.replaceAll("ssl/account/toCenter", "ssl/account/toEntCenter");
        			}
        			res.sendRedirect(preUrl);
        			return;
        		}
        	}
        	
	        /*if(null != user ){
	        	if(StringUtils.isNotBlank(preUrl)){
					session.removeAttribute("logUrl");
					session.removeAttribute("preUrl");
					if(user.getCustType()==1 && preUrl.indexOf("ssl/account/center")>1){
						preUrl = preUrl.replaceAll("ssl/account/center", "ssl/account/entcenter");
					}
					res.sendRedirect(preUrl);
	        	}
			}*/
        	/*if(null != user && StringUtils.isNotBlank(preUrl)){
    			session.removeAttribute("logUrl");
    			session.removeAttribute("preUrl");
    			if(user.getCustType()==1 && preUrl.indexOf("ssl/account/center")>1){
    				preUrl = preUrl.replaceAll("ssl/account/center", "ssl/account/entcenter");
    			}
            	res.sendRedirect(preUrl);
        	}*/
        } 
        chain.doFilter(request, response);
        
	}

	/**
	 * 不登录即可访问的页面
	 * @param url
	 * @return
	 */
	private boolean isNotloginUrl(String url){
		for(String not:notAuthUrl.getNotAuth()){
			if(url.contains(not))
				return true;
		}
		return false;
	}
	
	public void destroy() {
		
	}
}


    

     拦截器基本就分为这几部分,想要更多的了解,就需要自己去实践喽~

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在 Java Web 应用中,可以通过 Filter 拦截器来实现防止 SQL 注入攻击。Filter 是 Servlet 规范中的一种组件,用于对请求和响应进行过滤和处理。 具体实现步骤如下: 1. 创建一个 Filter 类,并实现 Filter 接口。 2. 在 doFilter 方法中,获取请求中的参数,并对参数进行过滤和转义,以避免 SQL 注入攻击。 3. 在 web.xml 文件中配置 Filter,指定要过滤的 URL 和 Filter 类。 以下是一个简单Filter 实现代码示例: ``` public class SqlFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; Map<String, String[]> parameterMap = req.getParameterMap(); for(String key: parameterMap.keySet()) { String[] values = parameterMap.get(key); for(String value: values) { // 进行过滤和转义 value = filter(value); } } chain.doFilter(request, response); } private String filter(String value) { // 进行过滤和转义操作 // ... return value; } // 其他方法省略 } ``` 在 web.xml 文件中,可以将 Filter 配置为拦截所有请求: ``` <filter> <filter-name>SqlFilter</filter-name> <filter-class>com.example.SqlFilter</filter-class> </filter> <filter-mapping> <filter-name>SqlFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 这样,所有请求都会经过 SqlFilter 过滤器,对请求中的参数进行过滤和转义,从而避免 SQL 注入攻击。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值