目的:最近公司的项目中需要用到filter拦截所有请求,看用户是否登录等验证信息,所以把servlet,filter,listener总结一下
一、servlet
1.启动类中添加
@Bean
public ServletRegistrationBean getDemoServlet(){
ServletRegistrationBean registrationBean=new ServletRegistrationBean();
registrationBean.setServlet(new DemoServelt());
List<String> urlMappings=new ArrayList<String>();
urlMappings.add("/demoservlet");访问,可以添加多个
registrationBean.setUrlMappings(urlMappings);
registrationBean.setLoadOnStartup(1);
return registrationBean;
}
2.demo类
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class DemoServelt extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 2600143224322327782L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("==>DemoServlet接受请求");
resp.getWriter().write("DemoServlet access success");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doGet(req, resp);
}
}
二、filter
业务场景:前端每次请求头都必选带token,除了一些不过滤的url,主要用来验证是否有权限去访问微服务。(已经测试)
1.启动类中添加
@Bean
public FilterRegistrationBean testFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean(new LoginFilter());
List<String> urlPatterns = new ArrayList<String>();
urlPatterns.add("/*"); //添加过滤的list集合
registration.setUrlPatterns(urlPatterns);
registration.setEnabled(true); //过滤器的开关
return registration;
}
2.demo类
import com.exception.AppcationException;
import com.exception.ExceptionEnum;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class LoginFilter implements Filter {
protected static List<Pattern> patterns = new ArrayList<Pattern>();
@Override
public void init(FilterConfig filterConfig) throws ServletException {
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, filterConfig.getServletContext());
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
String usertoken = httpRequest.getHeader("token");
String url = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length());
String[] regex=new String[10] ;
regex[0]="^login.*$";
/** 注意这段 添加不过滤的表达式到list集合
* swagger的url
*/
regex[1]="^v2.*$";
regex[2]="^webjars.*$";
regex[3]="^swagger.*$";
for (int i=0;i<=3;i++) {
patterns.add(Pattern.compile(regex[i]));
}
if (url.startsWith("/") && url.length() > 1) {
url = url.substring(1);
}
if (isInclude(url)){
filterChain.doFilter(httpRequest, httpResponse);
return;
}else {
if(token==null || token.isEmpty()){
throw new AppcationException(ExceptionEnum.NOTFOUNTVALUE);
}else
{
System.out.println(token);
}
}
}
@Override
public void destroy() {
}
private boolean isInclude(String url) {
for (Pattern pattern : patterns) {
Matcher matcher = pattern.matcher(url);
if (matcher.matches()) {
return true;
}
}
return false;
}
}