自定义过滤实现校验用户名密码过期、手机号是否为空,动态配置业务类的实现,目的解耦合

1.利用注解配置 web.xml
package com.hivescm.webconfig; import java.util.EventListener; import java.util.HashMap; import java.util.Map; import javax.annotation.Resource; import org.jasig.cas.client.authentication.AuthenticationFilter; import org.jasig.cas.client.session.SingleSignOutFilter; import org.jasig.cas.client.session.SingleSignOutHttpSessionListener; import org.jasig.cas.client.util.AssertionThreadLocalFilter; import org.jasig.cas.client.util.HttpServletRequestWrapperFilter; import org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.InternalResourceViewResolver; import com.hivescm.disconf.config.SsoConfig; import com.hivescm.filter.UserAuthFilter; import com.hivescm.logcenter.client.AcessLogFilter; @EnableWebMvc @ComponentScan @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Resource private SsoConfig ssoConfig; @Override public void addViewControllers(ViewControllerRegistry registry) { //设置首页 registry.addViewController( "/" ).setViewName( "forward:WEB-INF/index.jsp" ); registry.setOrder( Ordered.HIGHEST_PRECEDENCE ); super.addViewControllers(registry); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/").addResourceLocations("/**"); registry.addResourceHandler("/**").addResourceLocations("classpath:/static/"); } @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/views/"); viewResolver.setSuffix(".jsp"); return viewResolver; } /** * filter日志demo * @return */ @Bean public FilterRegistrationBean indexFilterRegistration() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(new AcessLogFilter()); registrationBean.addUrlPatterns("/"); registrationBean.setOrder(6); return registrationBean; } /** * 认证过滤 * @return */ @Bean public FilterRegistrationBean userFilterRegistration() { FilterRegistrationBean registrationBean=new FilterRegistrationBean(); registrationBean.setName("userAuthFilter"); registrationBean.setFilter(new UserAuthFilter()); Map<String, String> initParameters = new HashMap<String, String>(); initParameters.put("filterUrls", "/WEB-INF/views/loginSuccess.jsp"); initParameters.put("interfaceClasses", "com.hivescm.filter.interfaceDo.ValidatePhoneInterface,com.hivescm.filter.interfaceDo.ValidatePasswordInterface"); registrationBean.setInitParameters(initParameters); registrationBean.addUrlPatterns("/*"); registrationBean.setOrder(7); return registrationBean; } /** @Bean public FilterRegistrationBean getCasSingleSignOutFilter(){ FilterRegistrationBean registrationBean=new FilterRegistrationBean(); registrationBean.setName("casSingleSignOutFilter"); registrationBean.setFilter(new SingleSignOutFilter()); registrationBean.addInitParameter("casServerUrlPrefix",ssoConfig.getCasServerUrlPrefix()); registrationBean.addUrlPatterns("/*"); registrationBean.setOrder(1); return registrationBean; } @Bean public FilterRegistrationBean getCASFilter(){ FilterRegistrationBean registrationBean=new FilterRegistrationBean(); registrationBean.setName("CASFilter"); registrationBean.setFilter(new AuthenticationFilter()); Map<String, String> initParameters = new HashMap<String, String>(); initParameters.put("casServerLoginUrl", ssoConfig.getCasServerLoginUrl()); initParameters.put("serverName", ssoConfig.getServerName()); initParameters.put("useSession", "true"); initParameters.put("redirectAfterValidation", "true"); initParameters.put("ignorePattern", "/staticres/css/|/staticres/js/"); registrationBean.setInitParameters(initParameters); registrationBean.addUrlPatterns("/*"); registrationBean.setOrder(2); return registrationBean; } @Bean public FilterRegistrationBean getTicketValidationFilter(){ FilterRegistrationBean registrationBean=new FilterRegistrationBean(); registrationBean.setName("ticketValidationFilter"); registrationBean.setFilter(new Cas20ProxyReceivingTicketValidationFilter()); Map<String, String> initParameters = new HashMap<String, String>(); initParameters.put("casServerUrlPrefix", ssoConfig.getCasServerUrlPrefix()); initParameters.put("serverName", ssoConfig.getServerName()); registrationBean.setInitParameters(initParameters); registrationBean.addUrlPatterns("/*"); registrationBean.setOrder(3); return registrationBean; } @Bean public FilterRegistrationBean getCasHttpServletRequestWrapperFilter(){ FilterRegistrationBean registrationBean=new FilterRegistrationBean(); registrationBean.setName("casHttpServletRequestWrapperFilter"); registrationBean.setFilter(new HttpServletRequestWrapperFilter()); registrationBean.addUrlPatterns("/*"); registrationBean.setOrder(4); return registrationBean; } @Bean public FilterRegistrationBean getCasAssertionThreadLocalFilter(){ FilterRegistrationBean registrationBean=new FilterRegistrationBean(); registrationBean.setName("casAssertionThreadLocalFilter"); registrationBean.setFilter(new AssertionThreadLocalFilter()); registrationBean.addUrlPatterns("/*"); registrationBean.setOrder(5); return registrationBean; } // @Bean // public ServletRegistrationBean getDemoServlet(){ // ServletRegistrationBean registrationBean=new ServletRegistrationBean(); // registrationBean.setServlet(demoServlet); // List<String> urlMappings=new ArrayList<String>(); // urlMappings.add("/demoservlet");////访问,可以添加多个 // registrationBean.setUrlMappings(urlMappings); // registrationBean.setLoadOnStartup(1); // return registrationBean; // } @Bean public ServletListenerRegistrationBean<EventListener> getDemoListener(){ ServletListenerRegistrationBean<EventListener> registrationBean =new ServletListenerRegistrationBean<>(); registrationBean.setListener(new SingleSignOutHttpSessionListener()); registrationBean.setOrder(1); return registrationBean; } **/ }

  2.自定义我的Filter 

package com.hivescm.filter;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Enumeration;
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 javax.servlet.http.HttpServletResponseWrapper;
import com.hivescm.entity.DevUser;
import com.hivescm.filter.interfaceDo.AuthInterface;

public class UserAuthFilter  implements Filter{
	//过滤的urlKey
	private String filterUrlKey="filterUrls";
	//过滤的url集合
	private String[] filterUrlAll;
	
	//业务处理类key
	private String interfacePathKey="interfaceClasses";
	//业务处理类集合
	private String[] interfacePathAll;
	
	private Map<String, String> params = new HashMap<String, String>();  
	
	public FilterConfig config;
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		 config = filterConfig;
		 for (Enumeration e = config.getInitParameterNames(); e  
	                .hasMoreElements();) {  
	            String name = (String) e.nextElement();  
	            String value = config.getInitParameter(name);  
	            params.put(name, value);  
	        }  
		 filterUrlAll=params.get(filterUrlKey)!=null?params.get(filterUrlKey).split(","):null;
		 interfacePathAll=params.get(interfacePathKey)!=null?params.get(interfacePathKey).split(","):null;
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		 HttpServletRequest hrequest = (HttpServletRequest)request;
		 HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);
		 //获取过滤的url
		 if (this.isContains(hrequest.getRequestURI(), filterUrlAll)) {// 只对指定过滤参数后缀进行过滤
			  DevUser user= (DevUser) hrequest.getSession().getAttribute("user");
				 if(user!=null){
					 //遍历配置的业务处理类执行方法验证
					 for(String intefaceName:interfacePathAll){
						 try {
							 Class<?> cla=Class.forName(intefaceName); 
							 Object doWorkBean = cla.newInstance(); 
							 AuthInterface authInterface=(AuthInterface) doWorkBean;
							 String result= authInterface.doWork(user);
//							 Method method = cla.getMethod("doWork", DevUser.class);
//							Object result= method.invoke(doWorkBean, user);
							if(result!=null){
								 wrapper.sendRedirect((String)result);
								 return ;
							}
						} catch (Exception e) {
							e.printStackTrace();
						}
					 } 
				 }else{
					 chain.doFilter(request, response);
				 }
	        }
		     //放行
			 chain.doFilter(request, response);
	}

	@Override
	public void destroy() {
		params=null;  
	}
	
	public static boolean isContains(String container, String[] regx) {
        boolean result = false;

        for (int i = 0; i < regx.length; i++) {
            if (container.indexOf(regx[i]) != -1) {
                return true;
            }
        }
        return result;
    }

}

  3.自定义我的业务父类接口

 

package com.hivescm.filter.interfaceDo;

import com.hivescm.entity.DevUser;

public interface AuthInterface {
	
	public String doWork(DevUser devUser);

}

  4.自定义我的业务验证手机号码是否为空,为空则让其跳转到完善页面

package com.hivescm.filter.interfaceDo;


import org.apache.commons.lang3.StringUtils;
import com.hivescm.entity.DevUser;

public class ValidatePhoneInterface implements AuthInterface {
	
	private String redictAction="/user/setPhone";
	
	@Override
	public  String doWork(DevUser user) {
		 if(user!=null){
			 //判断手机号码是否完善
			 if(StringUtils.isBlank(user.getPhone())){
				 return redictAction;
			 }
			 return null;
		 }
		return null;
	}

}

  

posted @ 2017-06-22 16:17  那家那人那小伙  阅读(434)  评论(0编辑  收藏  举报