Filter及应用
- Filter有什么用?
- 一、Filter处理中文乱码
- 二、监听器,统计网站在线人数
- 1.监听器引入
- 2.统计网站在线人数
- 三、Filter实现权限拦截
Filter有什么用?
Filter:过滤器,可以用来过滤网站的数据。
比如处理中文乱码,每次写servlet,req和resp都需要重新设置编码,要是有一个机制能够在调用servlet之前就把中文乱码处理好。Filter就可以做到。
一、Filter处理中文乱码
- Filter导包不要导错:
- 过滤器Filter:
public class CharacterEncodingFilter implements Filter {//初始化,web服务器启动的时候,就已经初始化了,随时等待过滤对象出现@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");resp.setContentType("text/html");System.out.println("CharacterEncodingFilter执行前....");
// chain:链,起一个放行的作用,不写这个,代码到这里就停住了。chain.doFilter(req,resp);System.out.println("CharacterEncodingFilter执行后.....");}//销毁,web服务器关闭时,过滤器会销毁。@Overridepublic void destroy() {//System.gc():通知垃圾回收站清理东西。System.gc();System.out.println("CharacterEncodingFilter销毁");}
}
3.对应的Servlet:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("你好,世界!");}
4.配置web.xml文件:
处理前:
处理后:
二、监听器,统计网站在线人数
1.监听器引入
浏览器是一个客户端软件,为什么点击错号就能关闭?
2.统计网站在线人数
2.1建立监听器:
//统计网站在线人数,统计session
public class OnLineCountListener implements HttpSessionListener {
// 创建session监听:监视你的一举一动。
// 一旦创建session就会触发一次这个事件。不管是哪个session@Overridepublic void sessionCreated(HttpSessionEvent httpSessionEvent) {ServletContext sc = httpSessionEvent.getSession().getServletContext();Integer onLineCount = (Integer) sc.getAttribute("OnLineCount");if (onLineCount == null){onLineCount=new Integer(1);}else {int value = onLineCount.intValue();onLineCount=new Integer(value+1);}sc.setAttribute("OnLineCount",onLineCount);}@Overridepublic void sessionDestroyed(HttpSessionEvent httpSessionEvent) {System.out.println("已销毁1个");ServletContext sc = httpSessionEvent.getSession().getServletContext();Integer onLineCount = (Integer) sc.getAttribute("OnLineCount");if (onLineCount == null){onLineCount=new Integer(0);}else {int value = onLineCount.intValue();onLineCount=new Integer(value-1);}sc.setAttribute("OnLineCount",onLineCount);}
}
2.2 注册监听器:
<!-- 注册监听器 --><listener><listener-class>com.kuang.listener.OnLineCountListener</listener-class></listener>
2.3获取网站在线人数:
<h1>当前有 <span> <%= this.getServletConfig().getServletContext().getAttribute("OnLineCount")%> </span> 人在线!</h1>
2.4session的销毁:
session.invalidate();//手动注销
<session-config>
<!-- 自动销毁: 1分钟后,session失效,以分钟为单位。--><session-timeout>1</session-timeout></session-config>
设置销毁之后,才会触发销毁的方法,减少网站的人数。
一个浏览器是一个session:
刚开始有3个人在线,网站默认开始就有3个session,重新发布项目Redeploy就没了。
后面SpringMVC,SpringBoot里面的东西都是用过滤器去实现的。
三、Filter实现权限拦截
用户登录之后才能进入主页,用户注销后就不能进入主页了。
要实现这个,就要用到权限拦截。
- 用户登录之后,向session中存放用户的数据!
- 进入主页的时候要判断用户是否已经登录:要在过滤器中实现。
1.LoginServlet:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取前端请求的参数String username = req.getParameter("username");if (username.equals("admin")){//登录成功req.getSession().setAttribute(Constant.USER_SESSION,req.getSession().getId());resp.sendRedirect("/sys/success.jsp");}else{resp.sendRedirect("/error.jsp");}}
- LogoutServlet:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Object USER_SESSION = req.getSession().getAttribute(Constant.USER_SESSION);if (USER_SESSION!=null){req.getSession().removeAttribute(Constant.USER_SESSION);}resp.sendRedirect("/Login.jsp");}
3.过滤器:
在servlet之前加一层过滤器,实现注销后不能进入主页的功能:
@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
//ServletRequest HttpServletRequest 两个不一样。前者是后者的上一级,但上一级无法得到session。HttpServletRequest request=(HttpServletRequest)req;HttpServletResponse response=(HttpServletResponse)resp;if (request.getSession().getAttribute(Constant.USER_SESSION)==null){response.sendRedirect("/error.jsp");}filterChain.doFilter(request, response);}
4.注册过滤器:
<filter><filter-name>SysFilter</filter-name><filter-class>com.kuang.filter.SysFilter</filter-class></filter><filter-mapping><filter-name>SysFilter</filter-name><!-- 过滤sys下面的所有的页面--><url-pattern>/sys/*</url-pattern></filter-mapping>
Constant 类:
public class Constant {public final static String USER_SESSION = "USER_SESSION";
}