过滤器***
基于Spring的过滤器:
作用:对web请求包括请求参数做过滤操作
缺点:一个过滤器实例只能在容器初始化时调用一次
特点:依赖于Servlet容器,随着Web容器启动而启动,关闭而销毁
配置文件:
web.xml
<!-- 过滤器拦截指定后缀-->
<!-- //localhost:8080/Ycat/test/****都会被拦截 -->
<!--配置过滤器-->
<filter>
<filter-name>SessionFilter</filter-name>
<!--指定过滤用的是哪个过滤器-->
<filter-class>com.Ycat.login.filter.MyFilter</filter-class>
<!--避免乱码-->
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>contentType</param-name>
<param-value>text/html;charset=UTF-8</param-value>
</init-param> <init-param>
<!--指定不过滤的url --> <param-name>excludeUrl</param-name> <param-value>/login</param-value> </init-param> <init-param> <!--指定被过滤后的请求 跳转过去的url --> <param-name>dispatchUrl</param-name> <param-value>/login.jsp</param-value> </init-param>
</filter>
<!--配置过滤器映射信息-->
<filter-mapping>
<!--用的是哪一个过滤器-->
<filter-name>SessionFilter</filter-name>
<!-- 要过滤的哪一级目录 -->
<url-pattern>/test/*</url-pattern>
</filter-mapping>
<!-- 配置session超时时间,单位分钟 -->
<session-config>
<session-timeout>30</session-timeout>
</session-config> - 过滤什么请求
- 不过滤什么请求
- 过滤哪一级目录
编写过滤类:servlet的Filter
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilter implements Filter{
//初始化过滤器的时候会执行的方法
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
//过滤请求的时候执行的方法
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
}
//web应用关闭要销毁过滤器时候执行的方法
public void destroy() {
// TODO Auto-generated method stub
}
}
基于SpringMVC的***:
spring-web.xml
<!-- 配置*** -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 指定拦截路径 -->
<mvc:mapping path="/**"/>
<!-- 指定放行路径 -->
<mvc:exclude-mapping path="XXX" /> <!--指定***--> <bean class="XX.XX"></bean>
</mvc:interceptor>
</mvc:interceptors> 编写拦截类
继承HandleInterceptor接口 选择性重写三个拦截方法
- preHandle:请求到达Controller之前执行,如果执行结果为F拦截后跳转到拦截页面,执行结果为T继续执行
- postHandle:在Controller执行结束后,在视图渲染前执行,执行结果为T继续执行
- afterCompletion:在视图渲染结束后执行
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.db.common.exception.ServiceException;
/**
* 编写***对象,对控制层层登陆方法进行拦截
* @author Administrator
*说明:***编写好以后,需要对***进行配置
*/
@Component//交给spring管理
public class HandlerAccessInterceptor extends HandlerInterceptorAdapter {
@Override( )
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// 执行完毕,返回前拦截
}
@Override( )
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// 在处理过程中,执行拦截
}
@Override( )
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
// 在拦截点执行前拦截,如果返回true则不执行拦截点后的操作(拦截成功)
业务处理
if(业务判断) {
//不拦截
return true;
}else {
// 拦截后跳转页面
response.sendRedirect(request.getContextPath()+"XXX");
return false;
}
}
}
}
三个拦截方法执行顺序:
***:
做完某一件事情以后,需要广播一些消息或者通知,告诉其他的模块进行一些事件处理,事件监听也是设计模式中 发布-订阅模式、观察者模式的一种实现。
角色分配:
- 事件:***监听目标,可以理解为一种行为
- ***:事件发生后的业务处理模块
- 事件发布者:触发事件
非注解模式下的***:
事件:继承ApplicationEvent
package com.mu.event;
import org.springframework.context.ApplicationEvent;
public class MyTestEvent extends ApplicationEvent{
private static final long serialVersionUID = 1L;
private String msg ;
public MyTestEvent(Object source,String msg) {
super(source);
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
} ***:
- 在需要实现ApplicationListener,并且需要传入事件的泛型参数
- 在***中添加业务处理,也就是监听到事件发生后***该做的事情
package com.mu.listener;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import com.mu.event.MyTestEvent;
@Component( )
public class MyNoAnnotationListener implements ApplicationListener<MyTestEvent>{
@Override( )
public void onApplicationEvent(MyTestEvent event) {
System.out.println("非注解***:" + event.getMsg());
}
}
事件发布者:
- 用于触发事件的发生,导致***监听到事件发生后,做出响应
- 事件发布的方法就算是通过applicationContext来调用publishEvent,参数就是要发布的目标事件的对象
package com.mu.event;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@Component( )
public class MyTestEventPubLisher {
@Autowired
private ApplicationContext applicationContext;
// 事件发布方法
public void pushListener(String msg) {
applicationContext.publishEvent(new MyTestEvent(this, msg));
}
}
测试类:
package com.mu.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.mu.event.MyTestEventPubLisher;
@Controller
public class TestEventListenerController {
@Autowired
private MyTestEventPubLisher publisher;
@RequestMapping(value = "/test/testPublishEvent1" )
public void testPublishEvent(){
publisher.pushListener("我来了!");
}
}
注解模式下的***:
- 还是需要Event角色
- 不需要publiser
- 在***上添加@EventListener注解
package com.mu.listener;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import com.mu.event.MyTestEvent;
@Component( )
public class MyAnnotationListener {
@EventListener
public void listener1(MyTestEvent event) {
System.out.println("注解***1:" + event.getMsg());
}
}
- 如果想要使得该***的业务是异步执行的,可以在@EventListener之后添加@Async注解
配置SpringMvc中的ContextLoaderListener***
在启动Web 容器时,自动装配 Spring applicationContext.xml 的配置信息。
xml配置文件:
</pre><pre class="java" name="code"> <!--指定spring核心配置文件的位置--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext-*.xml</param-value> </context-param> <!--指定spring使用的***--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
正浩创新EcoFlow公司福利 707人发布