Java三大器之(Interceptor)的实现原理及代码示例

Java三⼤器之(Interceptor)的实现原理及代码⽰例前⾔:前⾯2篇博客,我们分析了Java中过滤器和的实现原理,今天我们来看看。
1,的概念
java⾥的是动态拦截Action调⽤的对象,它提供了⼀种机制可以使开发者在⼀个Action执⾏的前后执⾏⼀段代码,也可以在⼀个Action
执⾏前阻⽌其执⾏,同时也提供了⼀种可以提取Action中可重⽤部分代码的⽅式。在AOP中,⽤于在某个⽅法或者字段被访问之前,进⾏拦截
然后再之前或者之后加⼊某些操作。⽬前,我们需要掌握的主要是Spring的,Struts2的不⽤深究,知道即可。
mp3机2,的原理
⼤部分时候,⽅法都是通过代理的⽅式来调⽤的。Struts2的实现相对简单。当请求到达Struts2的ServletDispatcher 时,Struts2
会查配置⽂件,并根据配置实例化相对的对象,然后串成⼀个列表(List),最后⼀个⼀个的调⽤列表中的。Struts2的是可
插拔的,是AOP的⼀个实现。Struts2栈就是将按⼀定的顺序连接成⼀条链。在访问被拦截的⽅法或者字段
时,Struts2链
中的就会按照之前定义的顺序进⾏调⽤。
3,⾃定义的步骤
第⼀步:⾃定义⼀个实现了Interceptor接⼝的类,或者继承抽象类AbstractInterceptor。
第⼆步:在配置⽂件中注册定义的。
rtscts第三步:在需要使⽤Action中引⽤上述定义的,为了⽅便也可以将定义为默认的,这样在不加特殊说明的情况下,所有的
Action都被这个拦截。
4,过滤器与的区别
过滤器可以简单的理解为“取你所想取”,过滤器关注的是web请求;可以简单的理解为“拒你所想拒”,关注的是⽅法调⽤,⽐如拦截
敏感词汇。
4.1,是基于java反射机制来实现的,⽽过滤器是基于函数回调来实现的。(有⼈说,是基于动态代理来实现的)
4.2,不依赖servlet容器,过滤器依赖于servlet容器。
4.3,只对Action起作⽤,过滤器可以对所有请求起作⽤。
4.4,可以访问Action上下⽂和值栈中的对象,过滤器不能。
4.5,在Action的⽣命周期中,可以多次调⽤,⽽过滤器只能在容器初始化时调⽤⼀次。
5,Spring
5.1,抽象类HandlerInterceptorAdapter
我们如果在项⽬中使⽤了Spring框架,那么,我们可以直接继承HandlerInterceptorAdapter.java这个抽象类,来实现我们⾃⼰的。
Spring框架,对java的概念进⾏了包装,这⼀点和Struts2很类似。HandlerInterceptorAdapter继承了抽象接⼝HandlerInterceptor。
package org.springframework.web.servlet.handler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public abstract class HandlerInterceptorAdapter implements HandlerInterceptor{
// 在业务处理器处理请求之前被调⽤
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
return true;
}
// 在业务处理器处理请求完成之后,⽣成视图之前执⾏
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception{
}
// 在DispatcherServlet完全处理完请求之后被调⽤,可⽤于清理资源
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception{
}
}
接下来我们看⼀下Spring框架实现的⼀个简单的UserRoleAuthorizationInterceptor,UserRoleAuthorizationInterceptor继承了
抽象类HandlerInterceptorAdapter,实现了⽤户登录认证的拦截功能,如果当前⽤户没有通过认证,会报403错误。
package org.springframework.web.servlet.handler;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UserRoleAuthorizationInterceptor extends HandlerInterceptorAdapter{
气体内能// 字符串数组,⽤来存放⽤户⾓⾊信息
private String[] authorizedRoles;
public final void setAuthorizedRoles(String[] authorizedRoles){
this.authorizedRoles = authorizedRoles;
}
public final boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws ServletException, IOException{
if (this.authorizedRoles != null) {
for (int i = 0; i < this.authorizedRoles.length; ++i) {
if (request.isUserInRole(this.authorizedRoles[i])) {
return true;
}
}
}
handleNotAuthorized(request, response, handler);
return false;
}
protected void handleNotAuthorized(HttpServletRequest request, HttpServletResponse response, Object handler)
throws ServletException, IOException{
// 403表⽰资源不可⽤。服务器理解⽤户的请求,但是拒绝处理它,通常是由于权限的问题
response.sendError(403);
}
}
下⾯,我们利⽤Spring框架提供的HandlerInterceptorAdapter抽过类,来实现⼀个⾃定义的。我们这个叫做 UserLoginInterceptorBySpring,进⾏登录拦截控制。⼯作流程是这样的:如果当前⽤户没有登录,则跳转到登录页⾯;登录成功后,跳转到
之前访问的URL页⾯。
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
凌家滩import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
/**
* @description 利⽤spring框架提供的HandlerInterceptorAdapter,实现⾃定义
*/
public class UserLoginInterceptorBySpring extends HandlerInterceptorAdapter{
// 在业务处理器处理请求之前被调⽤
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
// equalsIgnoreCase 与 equals的区别?
if("GET".Method())){
//RequestUtil.saveRequest();
}
System.out.println("");
String requestUri = RequestURI();
String contextPath = ContextPath();
String url = requestUri.substring(contextPath.length());
System.out.println("requestUri" + requestUri);
System.out.println("contextPath" + contextPath);
System.out.println("url" + url);
String username = (String) Session().getAttribute("username");
if(null == username){
/
/ 跳转到登录页⾯
return false;
}
else{
return true;
}
}
2-溴芴// 在业务处理器处理请求完成之后,⽣成视图之前执⾏
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception{        System.out.println("");
if(modelAndView != null){
Map<String, String> map = new HashMap<String, String>();
modelAndView.addAllObjects(map);
}
}
// 在DispatcherServlet完全处理完请求之后被调⽤,可⽤于清理资源
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception{
System.out.println("");
}
}
是依赖Java反射机制来实现的。的实现,⽤到的是JDK实现的动态代理,我们都知道,JDK实现的动态代理,需要依赖接⼝。
是在⾯向切⾯编程中应⽤的,就是在你的service或者⼀个⽅法前调⽤⼀个⽅法,或者在⽅法后调⽤⼀个⽅法。不是在l,⽐如struts在
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
System.out.println("⽅法调⽤前,可以执⾏⼀段代码" + Name());
救世军result = method.invoke(this.targetObj, args);
System.out.println("⽅法调⽤后,可以执⾏⼀段代码 " + Name());
return result;
}
总结:
1.过滤器(Filter):所谓过滤器顾名思义是⽤来过滤的,Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web 请求,
这⼀点,是⽆法做到的。在Java Web中,你传⼊的request,response提前过滤掉⼀些信息,或者提前设置⼀些参数,然后再传⼊servlet或
者struts的action进⾏业务逻辑,⽐如过滤掉⾮法url(不是login.do的地址请求,如果⽤户没有登陆都过滤掉),或者在传⼊servlet或者struts
的action前统⼀设置字符集,或者去除掉⼀些⾮法字符(聊天室经常⽤到的,⼀些骂⼈的话)。filter 流程是线性的,url传来之后,检查之后,
可保持原来的流程继续向下执⾏,被下⼀个filter, servlet接收。
2.(Listener):Java的,也是系统级别的监听。随web应⽤的启动⽽启动。Java的在c/s模式⾥⾯经常⽤到,它
会对特定的事件产⽣产⽣⼀个处理。监听在很多模式下⽤到,⽐如说观察者模式,就是⼀个使⽤来实现的,在⽐如统计⽹站的在线⼈数。
⼜⽐如struts2可以⽤监听来启动。Servlet⽤于监听⼀些重要事件的发⽣,对象可以在事情发⽣前、发⽣后可以做⼀些必要的处理。
3.(Interceptor):java⾥的提供的是⾮系统级别的拦截,也就是说,就覆盖⾯来说,不如过滤器强⼤,但是更有针对性。
Java中的是基于Java反射机制实现的,更准确的划分,应该是基于JDK实现的动态代理。它依赖于具体的接⼝,在运⾏期间动态⽣成字节码。
是动态拦截Action调⽤的对象,它提供了⼀种机制可以使开发者在⼀个Action执⾏的前后执⾏⼀段代码,也可以在⼀个Action执⾏前阻⽌其
执⾏,同时也提供了⼀种可以提取Action中可重⽤部分代码的⽅式。在AOP中,⽤于在某个⽅法或者字段被访问之前,进⾏拦截然后再之前或
者之后加⼊某些操作。java的主要是⽤在插件上,扩展件上⽐如 Hibernate Spring Struts2等,有点类似⾯向切⽚的技术,在⽤之前先要在
配置⽂件即xml,⽂件⾥声明⼀段的那个东西。

本文发布于:2024-09-21 22:35:06,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/516660.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:拦截器   实现   过滤器   请求
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议