\);
String message = \当前Dispatcher[\ + request.getRemoteAddr()
+ \ + url + \ + \当执行的时间为:[\ + sdf.format(new Date(beginTime)) + \ + \当前时间内(秒)执行线程数为:[\ + threadCount + \\
+ \请求执行的时间为:[\ + (endTime - beginTime) + \毫秒]\;
logger.info(message); } } }
publicvoidsetOrder(intorder) {
this.order = order; }
publicintgetOrder() {
returnorder; } }
PreProcessPipeline接口说明
1) PreProcessPipeline接口会在允许处理的请求范围内继续向下执行(这句话
的意思会在实践篇讲解)
2) PriorityOrdered接口是一个顺序接口,这样可以指定一个AroundPipeline
的执行顺序
3) 这个类的主要应用场景是权限检查,如某个请求在处理过权限检查之后,则
继续执行;反之,则跳转到另一个指定页面或资源
4) 如果isPermitted()函数返回为true,则不会执行handleProcessInternal()函
数,请求会继续向下执行,最终执行Controller或是渲染页面
5) 如果isPermitted()函数返回为false,则会执行handleProcessInternal()函
数,请求就不会继续向下执行,而是直接处理handleProcessInternal()函数返回的ModelAndView接口,然后终于此次请求 6) 该类的相关功能演示,详见如下代码:
publicclassLoginSecurityextendsAbstractSecurity implementsPreProcessPipeline {
privateintorder;
// set 方法
publicvoidsetOrder(intorder) {
this.order = order; }
publicModelAndViewhandleProcessInternal(HttpServletRequestrequest, HttpServletResponseresponse) throws Exception {
returnnewModelAndView(\ + \); }
publicbooleanisPermitted(HttpServletRequestrequest, HttpServletResponseresponse) throws Exception {
if (match(request)) { returntrue; } else
{
if (CookieUtils.isLogin(request)) { returntrue; } else
{ returnfalse; } } }
publicintgetOrder() {
returnorder; } }
PostProcessPipeline接口说明
1) PostProcessPipeline接口,是在Controller或是页面渲染之前的一个处理类,
可以拦截请求马上要处理的相关资源
2) 此处的应用场景是,如果一个人想到重定向到另一个页面,那么我们可以查
看一下是否在重定向的白名单地址列表里面而防止被“钓鱼”
3) 如果isPermitted()函数返回为true,则不会执行handleProcessInternal()函
数,请求会继续向下执行,最终执行Controller或是渲染页面 4) 如果isPermitted()函数返回为false,则会执行handleProcessInternal()函数,
请求就不会继续向下执行,而是直接处理handleProcessInternal()函数返回的ModelAndView接口,然后终于此次请求
5) isPermitted()函数中的ModelAndView里面包含要跳转或是要处理的资源,
所以可以进行白名单等功能的检验
ExceptionPipeline接口说明
1) 当Controller或是渲染页面的时候发生异常,会调用ExceptionPipeline 2) 使用了exceptionPipeline,我们可以这样处理:
Exception (errorcode = 1) --> /error_1.ftl Exception (errorcode = 2) --> /error_2.ftl
像这样的情况,是我们可以通过一种异常类型,不同的errorcode可以自定义不同的显示页面
3) 在发生异常的时候,就可以通过此接口的ModelAndView接口来定制渲染页
面
4) 该类的相关功能演示,详见如下代码
publicclassDefaultExceptionHandlerimplementsExceptionPipeline {
private Logger logger = LoggerFactory.getLogger(getClass());
privateintorder;
publicvoidhandleExceptionInternal(HttpServletRequestrequest,
HttpServletResponseresponse, ModelAndViewmv, Throwablethrowable) throws Exception
{
// 打印错误信息
String stackTrace = StackTraceUtil.getStackTrace(throwable); // 记录错误信息
logger.error(stackTrace);
if (mv != null) {
mv.setViewName(\); } else
{
throwable.printStackTrace(); } }
publicvoidsetOrder(intorder) {
this.order = order; }
publicintgetOrder() {
returnorder; } }
FreeMarkerWidget接口说明
1) 在我们渲染一个页面的时候,我们可以使用${widget(\
2) 渲染时候的顺序是:${widget(\
\
3) 如果在渲染的时候,没有\处理类,则直接渲染
\页面
4) 这个函数的好处是,可以为每个页面的嵌套子页面提供独立的业务处理类
Widget,使子页面的逻辑独立
相关配置文件配置
web.xml配置
xmlns=\xmlns:web=%un.com/xml/ns/javaee\ xsi:schemaLocation=\http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\ id=\version=\>