Filter及应用
- Filter有什么用?
- 一、Filter处理中文乱码
- 二、监听器,统计网站在线人数
- 1.监听器引入
- 2.统计网站在线人数
- 三、Filter实现权限拦截
Filter有什么用?
Filter:过滤器,可以用来过滤网站的数据。
比如处理中文乱码,每次写servlet,req和resp都需要重新设置编码,要是有一个机制能够在调用servlet之前就把中文乱码处理好。Filter就可以做到。
一、Filter处理中文乱码
- Filter导包不要导错:
- 过滤器Filter:
public class CharacterEncodingFilter implements Filter {
//初始化,web服务器启动的时候,就已经初始化了,随时等待过滤对象出现
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public 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服务器关闭时,过滤器会销毁。
@Override
public 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
@Override
public 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);
}
@Override
public 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之前加一层过滤器,实现注销后不能进入主页的功能:
@Override
public 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";
}