Skip to content

Commit

Permalink
责任链复用 #7
Browse files Browse the repository at this point in the history
  • Loading branch information
yao.fei committed Dec 7, 2023
1 parent 961ac67 commit 3256c55
Show file tree
Hide file tree
Showing 7 changed files with 121 additions and 125 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package com.attackonarchitect.filter.chain;

import com.attackonarchitect.http.MTRequest;
import com.attackonarchitect.http.MTResponse;
import com.attackonarchitect.servlet.Servlet;

import java.io.UnsupportedEncodingException;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

/**
* @description:
*/
public class DefaultFilterChain implements FilterChain {

//servlet
private Servlet targetServlet;

//当前filter
private Filter currentFilter;

//filters
private List<Filter> filters;

private DefaultFilterChain chain;

public DefaultFilterChain(Servlet targetServlet, List<Filter> filters) {
this.targetServlet = targetServlet;
initChain(filters);
}

public DefaultFilterChain(Servlet targetServlet, List<Filter> invokerFilters, Filter currentFilter, DefaultFilterChain chain) {
this.targetServlet = targetServlet;
this.filters = invokerFilters;
this.currentFilter = currentFilter;
this.chain = chain;
}

//初始化filter链
private DefaultFilterChain initChain(List<Filter> filters) {
DefaultFilterChain chain = new DefaultFilterChain(this.targetServlet, filters, null, null);
if (!isEmpty(filters)) {
Collections.reverse(filters);
Iterator<Filter> iterator = filters.iterator();
while (iterator.hasNext()) {
chain = new DefaultFilterChain(null, filters, iterator.next(), chain);
}
}
return chain;
}

@Override
public void addFirst(List<Filter> filters) {

if (isEmpty(this.filters)) {
this.filters = filters;
} else {
this.filters.addAll(filters);
}
initChain(this.filters);

}

@Override
public void addLast(List<Filter> filters) {

if (isEmpty(this.filters)) {
this.filters = filters;
} else {
this.filters.addAll(this.filters.size() - 1, filters);
}
initChain(this.filters);

}

@Override
public void doFilter(MTRequest request, MTResponse response) {

if (this.currentFilter != null) {
try {
this.currentFilter.doFilter(request, response);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}

if (this.chain != null) {
this.chain.doFilter(request, response);
}

if (this.targetServlet!= null) {
try {
this.targetServlet.service(request, response);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}

private boolean isEmpty(List<Filter> filters) {
return filters == null || filters.size() == 0;
}

}
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
package com.attackonarchitect.filter.chain;

import com.attackonarchitect.http.MTRequest;
import com.attackonarchitect.http.MTResponse;

import java.util.List;

/**
* @description:
*/

public interface FilterChain extends Chain{
public interface FilterChain {

void addFirst(List<Filter> filters);

void addLast(List<Filter> filters);

void doFilter(MTRequest request, MTResponse response);

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,15 @@
* @description:
*/
public class FilterChainImplFactory {
private FilterChainImplFactory(){}
private FilterChainImplFactory() {
}



public static Chain createFilterChain(Servlet servlet, String uri, ComponentScanner scanner){
public static FilterChain createFilterChain(Servlet servlet, String uri, ComponentScanner scanner) {
//
FilterManager filterManager = FilterManagerImplFactory.getFilterManager(scanner);
List<Filter> filterList = filterManager.getSpecifedFilters(uri);

return FilterChainImpl.createFilterChain(servlet,filterList);
return new DefaultFilterChain(servlet, filterList);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.attackonarchitect.handler;

import com.attackonarchitect.filter.chain.FilterChain;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import com.attackonarchitect.ComponentScanner;
import com.attackonarchitect.context.ServletContext;
import com.attackonarchitect.filter.chain.Chain;
import com.attackonarchitect.filter.chain.FilterChainImplFactory;
import com.attackonarchitect.http.HttpMTResponse;
import com.attackonarchitect.http.MTRequest;
Expand Down Expand Up @@ -35,9 +35,9 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception

MTResponse response = new HttpMTResponse(ctx);

Chain filterChain = FilterChainImplFactory.createFilterChain(servlet,uri,scanner);
FilterChain filterChain = FilterChainImplFactory.createFilterChain(servlet,uri,scanner);

filterChain.start(request,response);
filterChain.doFilter(request,response);
}


Expand Down

0 comments on commit 3256c55

Please sign in to comment.