1.过滤器
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁,以下通过过滤编码的代码示例来了解它的使用:
程序:
package edu.cn.fyt.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
*@author fangyitao
*@date 2017年4月12日
*@time 下午3:35:44
*@description 过滤器
*@return
*/
public class MyFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest servletRequest = (HttpServletRequest) request;
HttpServletResponse servletResponse = (HttpServletResponse) response;
HttpSession session = servletRequest.getSession();
// 获得用户请求的URI
String path = servletRequest.getRequestURI();
//获取用户ID
String useId = (String) session.getAttribute("userId");
// 登陆页面无需过滤
if(path.indexOf("/login.html") > -1) {
chain.doFilter(servletRequest, servletResponse);
return;
}
if (useId == null || "".equals(useId)) {
// 跳转到登陆页面
servletResponse.sendRedirect("./login.html");
} else {
// 已经登陆,继续此次请求
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
}
}
web.xml配置:
<!-- 配置登陆过滤器 -->
<filter>
<filter-name>login</filter-name>
<filter-class>edu.cn.fyt.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>login</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.拦截器
拦截器是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制
程序:
package edu.cn.fyt.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
*@author fangyitao
*@date 2017年4月10日
*@time 上午9:50:15
*@description 拦截器
*@return
*/
public class MyHandlerInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object arg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object arg2) throws Exception {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
return true;
}
}
配置(不配置在web.xml):
<!-- 拦截器配置 -->
<bean class="edu.cn.fyt.interceptor.MyHandlerInterceptor"></bean>
3.监听器
现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。
程序:
package edu.cn.fyt.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
*@author fangyitao
*@date 2017年4月12日
*@time 下午4:22:37
*@description 监听器
*@return
*/
public class MyListener implements HttpSessionListener {
private int userNumber = 0;
@Override
public void sessionCreated(HttpSessionEvent sessionEvent) {
// TODO Auto-generated method stub
userNumber++;
sessionEvent.getSession().setAttribute("userNumber", userNumber);
}
@Override
public void sessionDestroyed(HttpSessionEvent sessionEvent) {
// TODO Auto-generated method stub
userNumber--;
sessionEvent.getSession().setAttribute("userNumber", userNumber);
}
}
web.xml配置:
<!-- 监听器 -->
<listener>
<listener-class>edu.cn.fyt.listener.MyListener</listener-class>
</listener>