今天我们先来看一看
Interceptor
Interceptor 是 JFinal AOP 的实现方式,通过实现 Interceptor 接口以及使用@Before
annotation 可以细粒度地进行配置。Interceptor 并非线程安全的,线程安全拦截器需要继承 PrototypeInterceptor 来实现。
①先来回顾Controller的用法
创建 TestInterceptorController类 extends Controller
在Config中配置路由 me.add("/interceptor",TestInterceptorController.class);
②新建Interceptor 继承 PrototypeInterceptor
public class MyInterceptor extends PrototypeInterceptor {
@Override
public void doIntercept(ActionInvocation ai) {
System.out.println("Before action invoking");
ai.invoke();
System.out.println("After action invoking");
}
}
③配置使用:
拦截器的配置有三种:
一是在Config进行全局拦截配置:
@Override
public void configInterceptor(Interceptors me) {
me.add(new MyInterceptor());
}
二是使用注解在Controller层面进行配置
@Before(MyInterceptor.class)
public class TestInterceptorController extends Controller{
public void index() {
System.out.println("Running in invoking");
renderText("Hello TestInterceptor!!");
}
}
以上两种方法执行后
控制台显示结果:
三是使用注解在Action方法上配置:
创建新拦截器
public class ActionIntercetor extends PrototypeInterceptor {
@Override
public void doIntercept(ActionInvocation ai) {
System.out.println("这是ActionIntercetor拦截器");
ai.invoke();
}
}
Controller中加上action方法 test
@Before(ActionIntercetor.class)
public void test(){
renderText("Action拦截器");
}
控制台:Action级别,Controller级别跟全局一起用的结果,先执行全局,再执行Controller,最后是Action的。
另外注解和Config中的add方法是可以配置多个拦截器的。
④好,我们来看看拦截器的应用:乱码问题解决
我们使用get的方式传中文给服务器,看看会有什么情况发生
我们发现返回了乱码
如果这样做呢?
发现没问题好的,我们尝试解决一下test方法里面的乱码问题:
Controller ctrl = ai.getController();
System.out.println(ai.getMethodName());
System.out.println(ctrl.getParaMap());
ai.invoke();
我们发现JFinal给我们封装的比较好,无法得知客户端是用get还是post的方法提交的,这解决起来有点棘手。
查过资料后有两个解决方案:
一是改源码
一个奇怪的问题,在jfinal1.1.6的时候,我使用get方法执行 ”delete/1-你好“ 没问题
但是在 jfinal 1.3,同样的代码,"你好"在controller中看到的是乱码
我的环境是glassfish,一直没有变过,只是版本进行过升级,页面设置的也是utf-8。
找到问题了,是因为1.1.6在JfinalFiter使用的是request.getServletPath(),在1.3中修改为request.getRequestURI(),
String target = request.getRequestURI();
应修改为 String target = URLDecoder.decode(request.getRequestURI(),encoding);就好了
二是客户端做处理:
在get请求的时候,在url提交前进行一下urlEncode
但尝试过使用urlEncode发现未奏效,时间问题就没再探讨,各位有谁能解决GET请求乱码问题还请多交流。