spring-invasive ways of finishing the code Summary

spring offers many ways to change the value of some of the code, although very convenient, easy to abuse of control, code reading, follow-up maintenance of a certain degree of difficulty, finishing under way here.

 

A function to modify the parameters

argumentResolver

 

@Component
public class HandlerMethodArgumentResolverDemo implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
if (methodParameter != null && methodParameter.getParameterType() == String.class && methodParameter.getParameterIndex() == 1) {
return true;
}
return false;
}

@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
System.out.println("HandlerMethodArgumentResolverDemo");
return "set argument by HandlerMethodArgumentResolverDemo";
}
}

@SpringBootConfiguration
public class ConfigDemo extends WebMvcConfigurerAdapter {
@Autowired
IntercepterDemo intercepterDemo;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(intercepterDemo).addPathPatterns("/**");//配置拦截的路径,可以传多个参数
/*registry.addInterceptor(authorityInterceptor).addPathPatterns("/**");*/
}
@Autowired
HandlerMethodArgumentResolverDemo handlerMethodArgumentResolverDemo;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(handlerMethodArgumentResolverDemo);
}
}

 

二 interceptor

 

@Component
public class IntercepterDemo implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.addHeader("interceptaddhader","preintercepter");
System.out.println("IntercepterDemo preintecepter");
return true;
}

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
response.addHeader("interceptaddhader","postintercepter");
if(modelAndView != null){
modelAndView.addObject("addObject");
}
System.out.println("IntercepterDemo postintecepter");
}

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("IntercepterDemo afterCompletion");
}
}

上一个例子的 ConfigDemo 注册了这个intercepter

 

Three .aop way

 spring-aop, aspectJ, the more commonly used, they will not speak

 

Four listener

 Ordinary web project plus listener:

Listener Interface Category

1ServletContextListener monitor ServletContext object

> ServletContextAttributeListener monitor the operation of the ServletContext attributes, such as add, delete, modify,

> HttpSessionListener monitor Session object

> HttpSessionActivationListener active listening and passivate the case of HTTP sessions, passivate refers to non-active session is written to persistent device (such as a hard disk), active opposite.

> HttpSessionAttributeListener monitor property operations in Session

 > ServletRequestListener listening Request object

> ServletRequestAttributeListener monitor properties in operation Requset

定义类 : public class CountListener implements HttpSessionListener 

Configure listeners:

  1. <listener>
  2.     <listener-class>web.CountListener</listener-class>
  3. </listener>

springboot configuration listener, two examples

 

@WebListener
public class ServletRequestListener implements javax.servlet.ServletRequestListener {
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("listner "+sre.getServletContext().getAttributeNames().toString());
}
}

 

// to be called only when publishing service once 
@WebListener
public class ServletContextListenerDemo the implements ServletContextListener {
public void contextInitialized (ServletContextEvent SCE) {
System.out.println (. "Listner" + sce.getServletContext () getAttributeNames () toString ().);
}

public void the contextDestroyed (ServletContextEvent SCE) {
}
}


@SpringBootApplication
@ServletComponentScan(basePackages = "com.learn.filtertest")
public class MvntestApplication {
public static void main(String[] strings){
SpringApplication.run(MvntestApplication.class,strings);
}
}


Five filter

 Each request is executed only once the filter

@Component
public class OncePerRequestFilterDemo extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
httpServletResponse.addHeader("qzltest","yes");
System.out.println("OncePerRequestFilterDemo ,request uri is : " + httpServletRequest.getRequestURI());
filterChain.doFilter(httpServletRequest,httpServletResponse);
}
}
六 RequestBodyAdvice ReqponseBodyAdvice

@ControllerAdvice
public class RequestBodyAdviceDemo implements RequestBodyAdvice {
@Override
public boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}

@Override
public HttpInputMessage beforeBodyRead(HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) throws IOException {
//httpInputMessage.getBody().
System.out.println("RequestBodyAdviceDemo request body advice beforebodyread " + methodParameter.getMethod().getName());
return httpInputMessage;
}

@Override
public Object afterBodyRead(Object o, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
System.out.println("RequestBodyAdviceDemo request body advice afterbodyread " + methodParameter.getMethod().getName());
return o;
}

@Override
public Object handleEmptyBody(Object o, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
System.out.println("RequestBodyAdviceDemo request body advice handler empty body " + methodParameter.getMethod().getName());
Class clazz = methodParameter.getParameterType();
if (clazz.equals(String.class)){
return "auto generate";
}
return o;
}
}

@ControllerAdvice
public class ResponseBodyAdviceDemo implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter methodParameter, Class aClass) {
return methodParameter.getMethodAnnotations().length >= 1;
}

@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
if(serverHttpResponse.getHeaders().containsKey("qzltest")){
System.out.println("ResponseBodyAdviceDemo response contains header qzl ,request uri is : " + serverHttpRequest.getURI());
}
if (o != null && o instanceof String){
return " add by class ResponseFilterDemo , string: "+ (String) o;
}
return o;
}
}

Guess you like

Origin www.cnblogs.com/thinkqin/p/11812082.html